如何绘制带有颜色的网格(如方块),颜色来源于数组
我有两个分别存放x和y坐标的数组,还有一个z数组存放对应的值。我想画一个图,在每个x和y坐标的位置上放一个方块,方块的颜色是根据z数组的值来设置的,效果类似于这个。我在谷歌上搜索了很久,想找到实现这个的方法,但一直没找到。matplotlib.pyplot.scatter这个函数需要颜色数组的值在0到1之间,所以我不太明白在这种情况下该怎么用。非常感谢任何帮助。
3 个回答
1
你需要做类似这样的事情
x = np.arange(10)
y = np.arange(10)
z = np.zeros([10,10])
z[1,5] = 10
z[2,7] = 20
z[3,9] = 30
pcolor(x,y,z)
用这段代码的话,最后的点会偏离坐标轴,但这应该能让你明白大概意思。
2
谢谢你,Andrew。我现在明白这个是怎么回事了。我的z数组其实只是一列数字。因为这些数字没有什么规律,所以直接把这个数组变成二维的形式来用pcolor会很困难。
我想出了一个更好的办法,就是用一个循环把矩形的补丁添加到一个补丁集合中,然后给整个集合分配一个颜色映射,最后进行绘图。
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.collections import PatchCollection
import matplotlib.patches as mpatches
fig = plt.figure(figsize=(9,5))
ax = plt.axes([0.1,0.1,0.7,0.7])
cmap = matplotlib.cm.jet
patches = []
data=np.array([4.5,8.6,2.4,9.6,11.3])
data_id_nos=np.array([5,6,9,8,7])
x_coords=np.array([3.12,2.6,2.08,1.56,1.04])
y_coords=np.array([6.76,6.24,5.72,5.20,4.68])
coord_id_nos=np.array([7,9,6,5,8])
for i in range(len(data_id_nos)):
coords=(x_coords[np.where(coord_id_nos == data_id_nos[i])],y_coords[np.where(coord_id_nos == data_id_nos[i])])
art = mpatches.Rectangle(coords,0.50,0.50,ec="none")
patches.append(art)
#create collection of patches for IFU position
IFU1 = PatchCollection(patches, cmap=cmap)
#set the colours = data values
IFU1.set_array(np.array(data))
ax.add_collection(IFU1)
plt.axis('scaled')
plt.xlabel('x (arcsecs)')
plt.ylabel('y (arcsecs)')