- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Matplotlib 根据一些数据创建图像。所有数据都在 0 到 1 的范围内,我正在尝试使用颜色图根据数据的值对数据进行着色,这在 Matlab 中非常有效,但是当将代码转换为 Python 时,我只是得到一个黑色方 block 作为输出。我相信这是因为我错误地绘制了图像,所以它将所有数据绘制为 0。我已经尝试搜索这个问题几个小时并且我已经尝试过 plt.set_clim([0, 1])
但是这似乎没有做任何事情。我是 Python 和 Matplotlib 的新手,虽然我不是编程新手(Java、javascript、PHP 等),但我看不出哪里出错了。如果有人能在我的代码中看到任何明显不正确的地方,那么我将不胜感激。
谢谢
from numpy import *
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.colors as myColor
e1cx=[]
e1cy=[]
e1cz=[]
print("Reading files...")
in_file = open("eigenvector_1_component_x.txt", "rt")
for line in in_file.readlines():
e1cx.append([])
for i in line.split():
e1cx[-1].append(float(i))
in_file.close()
in_file = open("eigenvector_1_component_y.txt", "rt")
for line in in_file.readlines():
e1cy.append([])
for i in line.split():
e1cy[-1].append(float(i))
in_file.close()
in_file = open("eigenvector_1_component_z.txt", "rt")
for line in in_file.readlines():
e1cz.append([])
for i in line.split():
e1cz[-1].append(float(i))
in_file.close()
print("...done")
nx = 120
ny = 128
nz = 190
fx = zeros((nz,nx,ny))
fy = zeros((nz,nx,ny))
fz = zeros((nz,nx,ny))
z = 0
while z<nz-1:
x = 0
while x<nx:
y = 0
while y<ny:
fx[z][x][y]=e1cx[(z*128)+y][x]
fy[z][x][y]=e1cy[(z*128)+y][x]
fz[z][x][y]=e1cz[(z*128)+y][x]
y += 1
x += 1
z+=1
if((z % 10) == 0):
plt.figure(num=None)
plt.axis("off")
normals = myColor.Normalize(vmin=0,vmax=1)
plt.pcolor(fx[z][:][:],cmap='spectral', norm=normals)
filename = 'Imagex_%d' % z
plt.savefig(filename)
plt.colorbar(ticks=[0,2,4,6], format='%0.2f')
最佳答案
虽然您已经解决了最初的问题并且拥有可以运行的代码,但我想指出的是,python 和 numpy 都提供了多种工具,可以使编写这样的代码变得更加简单。下面是几个例子:
与其通过附加到空列表的末尾来构建列表,通常更容易从其他列表生成它们。例如,而不是
e1cx = []
for line in in_file.readlines():
e1cx.append([])
for i in line.split():
e1cx[-1].append(float(i))
你可以简单地写:
e1cx = [[float(i) for i in line.split()] for line in in_file]
语法[x(y) for y in l]
被称为list comprehension , 而且,除了更简洁之外,执行速度也比 for
循环快。
但是,要从文本文件加载表格数据,使用 numpy.loadtxt
会更简单:
import numpy as np
e1cx = np.loadtxt("eigenvector_1_component_x.txt")
更多信息,
print np.loadtxt.__doc__
另请参阅它稍微复杂一些的表亲 numpy.genfromtxt
现在我们已经加载了数据,我们需要 reshape 它。您使用的 while 循环工作正常,但 numpy
提供了一种更简单的方法。首先,如果您更喜欢使用加载数据的方法,则使用 e1cx = array(e1cx)
等将特征向量数组转换为适当的 numpy 数组。
array
类提供了重新排列数组中数据索引方式的方法,而无需复制数据。最简单的方法是 array.reshape
,它将完成 while
循环的一半工作:
almost_fx = e1cx.reshape((nz,ny,nx))
这里,almost_fx
是一个索引为 almost_fx[iz,iy,ix]
的三阶数组。需要注意的一件重要事情是 e1cx
和 almost_fx
共享它们的数据。因此,如果您更改 e1cx[0,0]
,您也会更改 almost_fx[0,0,0]
。
在您的代码中,您交换了 x 和 y 位置。如果这确实是您想要做的,您可以使用 array.swapaxes
完成此操作:
fx = almost_fx.swapaxes(1,2)
当然,你总是可以把它合并成一行
fx = e1cx.reshape((nz,ny,nx)).swapaxes(1,2)
但是,如果您希望 z 切片 (fx[z,:,:]
) 以 x 水平和 y 垂直绘制,您可能不想交换上面的轴。只需 reshape 和绘制即可。
最后,您可以直接遍历数组的一部分,而不是遍历 z-index 并测试 10 的倍数:
for fx_slice in fx[::10]:
# plot fx_slice and save it
此索引语法是 array[start:end:step]
,其中 start
包含在结果中 end
不包含。将 start
留空表示 0,而将 end
留空表示列表结束。
总而言之,您的完整代码(在引入了更多 python 习语如 enumerate
之后)可能如下所示:
import numpy as np
from matplotlib import pyplot as pt
shape = (190,128,120)
fx = np.loadtxt("eigenvectors_1_component_x.txt").reshape(shape).swapaxes(1,2)
for i,fx_slice in enumerate(fx[::10]):
z = i*10
pt.figure()
pt.axis("off")
pt.pcolor(fx_slice, cmap='spectral', vmin=0, vmax=1)
pt.colorbar(ticks=[0,2,4,6], format='%0.2f')
pt.savefig('Imagex_%d' % z)
或者,如果您希望每个元素一个像素,您可以将 for
循环的主体替换为
z = i*10
pt.imsave('Imagex_%d' % z, fx_slice, cmap='spectral', vmin=0, vmax=1)
关于python - Matplotlib 颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9089991/
我无法在此图中定位轴标签。我喜欢放置顶部标签,使管道与网格对齐,并放置左右标签,以便它们不接触绘图。 我试过了 ax.tick_params(axis='both', which='both'
我使用的是 python 2,下面的代码只是使用了一些示例数据,我的实际数据可能有不同的长度,并且可能不是很细。 import numpy as np import datetime i
给定坐标 [1,5,7,3,5,10,3,6,8]为 matplotlib.pyplot ,如何突出显示或着色线条的不同部分。例如,列表中的坐标 1-3 ( [1,5,7,3] ) 表示属性 a .我
我正在matplotlib中绘制以下图像。 我的问题是,图像看起来像这样,但是,我想使背景变暗,因为当我打印该图像时,灰度部分不会出现在打印物中。有人可以告诉我API进行此更改吗? 我使用简单的API
这是关于matplotlib的一个非常基本的问题,但是我不知道该怎么做: 我想绘制多个图形,并使用绘制窗口中的箭头从一个移到另一个。 目前,我只知道如何创建多个图并将其绘制在不同的窗口中,如下所示:
在 matplotlib 中绘制小块对象时,由于显示分辨率而引入了伪影。使用抗锯齿并不能解决问题。 这个问题有解决方案吗? import matplotlib.pyplot as plt impo
对于直方图,有一个简单的内置选项 histtype='step' .如何制作相同风格的条形图? 最佳答案 [阅读评论后添加答案] 将可选关键字设置为 fill=False对于条形图: import m
我正在尝试在 (6X3) 网格上创建子图。我对图例的位置有疑问。图例对所有子图都是通用的。 lgend 现在与 y 轴标签重叠 我尝试删除 constrained_layout=True 选项。但这在
我有一个带有一些线段( LineCollection )和一些点的图表。这些线和点有一些与它们相关的值,但没有绘制出来。我希望能够添加鼠标悬停工具提示或其他方法来轻松找到点和线的关联值。这对于点或线段
我想创建一个带有对齐不同曲线文本的图例的图。这是一个最小的工作示例: import matplotlib.pyplot as plt import numpy as np x=np.linspace(
可以说我正在用matplotlib绘制一条线并添加一个图例。 在图例中,其显示为------ Label。当绘制较小的图形尺寸以进行打印时,我发现该行的默认水平长度太长。 是否存在将------ La
我正在使用 matplotlib 构建一个 3D 散点图,但无法使生成的图形具有所有 3 个轴的共同原点。我怎样才能做到这一点? 我的代码(到目前为止),我还没有为轴规范实现任何定义,因为我对 Pyt
我有一个我想使用的绘图布局,其中 9 个不同的数据簇被布置在一个方形网格上。网格中的每个框都包含 3 个并排布置的箱线图。 我最初的想法是这将适合 3x3 子图布局,每个单独的子图本身被划分为 3x1
我的图形从y=-1变为y=10 我想在任意位置写一小段文字,例如x=2000,y=5: ax.annotate('MgII', xy=(2000.0, 5.0), xycoords='data')
我想使用LateX格式来构建一个表达式,其中出现一些数字,但这些数字是用LateX表达式中的变量表示的。 实际的目标是在axes.annotate()方法中使用它,但是为了讨论起见,这里是一个原理代码
我需要比较两组的二维分布。 当我使用 matplotlib.pyplot.contourf并覆盖图,每个等高线图的背景颜色填充整个图空间。有没有办法让每个等高线图的最低等高线级别透明,以便更容易看到每
在R中,有一个locator函数,类似于Matlab的ginput,您可以用鼠标单击图形并选择任何x,y坐标。此外,还有一个名为identify(x,y)的函数,如果您给它绘制了一组绘制的点x,y,然
我想用matplotlib生成矢量图。我尽力了-但输出是光栅图像。这是我使用的: import matplotlib matplotlib.use('Agg') import matplotlib.p
我正在尝试使用 matplotlib 制作具有非常小的灰点的散点图。由于点密度的原因,点需要很小。问题是 scatter() 函数的标记似乎既有线条又有填充。当标记很小时,只有线条可见,而看不到填充,
我不太明白为什么我无法在指定的限制内创建水平和垂直线。我想用这个框绑定(bind)数据。然而,双方似乎并没有遵守我的指示。为什么是这样? # CREATING A BOUNDING BOX # BOT
我是一名优秀的程序员,十分优秀!