gpt4 book ai didi

python - Matplotlib 颜色

转载 作者:太空宇宙 更新时间:2023-11-03 13:22:39 25 4
gpt4 key购买 nike

我正在使用 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 数据

现在我们已经加载了数据,我们需要 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] 的三阶数组。需要注意的一件重要事情是 e1cxalmost_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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com