pcolor() 不绘制最后一行和最后一列
看起来PCOLOR把我的数据集的最后一行和最后一列给剪掉了。下面打印出的zi
的形状显示它是 (22,22)
,这正是我预期的,但显示的区域却是21乘21的方块... 有谁知道为什么最后一行和最后一列没有被画出来吗?
def pcolor_probs(x,y,z, x_str, y_str, t_str):
xi = np.arange(min(x),max(x)+1, 1)
yi = np.arange(min(y),max(y)+1, 1)
zi = griddata(x,y,z,xi,yi)
print np.shape(xi),np.shape(yi),np.shape(zi)
# fix NANs
zi = np.asarray(zi)
for i in range(len(zi)):
for j in range(len(zi[i])):
print i,j
if isnan(float(zi[i][j])):
zi[i][j] = 0
# plot
f = figure()
ax = f.add_subplot(111)
pc_plot = ax.pcolor(zi, cmap = cm.coolwarm, shading = 'faceted', alpha = 0.75)
# pc_plot = ax.contourf(zi, 20, cmap = cm.coolwarm, alpha = 0.75)
ax.set_xticks(np.arange(zi.shape[0])+0.5, minor=False)
ax.set_yticks(np.arange(zi.shape[1])+0.5, minor=False)
ax.set_xticklabels(np.arange(len(xi)))
ax.set_yticklabels(np.arange(len(yi)))
ax.set_xlim(min(x), max(x))
ax.set_ylim(min(y), max(y))
ax.set_xlabel(x_str)
ax.set_ylabel(y_str)
ax.set_title(t_str)
f.colorbar(pc_plot)
f.set_tight_layout(True)
font = {'family' : 'serif','weight' : 'regular','size' : 12}
matplotlib.rc('font', **font)
show()
让我们把它变得更简单,
X = np.random.rand(10,10)
pcolor(X)
show()
产生的结果是,
2 个回答
7
虽然有点晚了,但只要提供一个比原数组大1的X和Y参数(在两个方向上都大1),就能显示整个数组。
就像下面这个例子:
import numpy as np
import matplotlib.pyplot as plt
#define the space limits:
horizontal_min = -2.
horizontal_max = 2.
horizontal_step = 0.1
vertical_min = -1.
vertical_max = 1.
vertical_step = 0.2
# create the arrays
nx = (horizontal_max - horizontal_min) / horizontal_step
ny = ( vertical_max - vertical_min ) / vertical_step
Z = np.zeros((nx,ny))
Y,X = np.meshgrid(np.arange(vertical_min,
vertical_max+vertical_step, # THIS LINE...
vertical_step),
np.arange(horizontal_min,
horizontal_max+horizontal_step, # ...& THIS LINE
horizontal_step)
)
Y2,X2 = np.meshgrid(np.arange(vertical_min,
vertical_max, # THIS LINE...
vertical_step),
np.arange(horizontal_min,
horizontal_max, # ...& THIS LINE
horizontal_step)
)
# populate the data array (Z)
i = 0
if nx > ny:
while i < ny:
Z[i,i] = i+1
Z[nx-i-1,i] = -i-1
i += 1
else:
while i < ny:
Z[i,i] = i+1
Z[i,ny-i-1] = -i-1
i += 1
# make the graph
fig,axes = plt.subplots(2,1)
pc_plot1 = axes[0].pcolor(X, Y, Z)
axes[0].set_title('X.shape == Y.shape != Z.shape')
pc_plot2 = axes[1].pcolor(X2, Y2, Z)
axes[1].set_title('X.shape == Y.shape == Z.shape')
for ax in axes:
ax.axis('equal')
ax.set_xlim(horizontal_min, horizontal_max)
ax.set_ylim(vertical_min, vertical_max)
fig.tight_layout()
fig.show()
注意那些标记为
THIS LINE
的线。它们的意思是:
>>> print X.shape,Y.shape,Z.shape
(41, 11) (41, 11) (40, 10)
(针对给定的例子)
小提示,使用Y,X = np.meshgrid...
可以省去对Z进行转置的步骤(具体可以查看官方文档)。
5
原因是 pcolor 计算的是顶点上的点。实际上,这里有 22 个和 10 个顶点。你可以改用 imshow(...,extent[])
。