Python 箭图中的matplotlib变化范围

Python 箭图中的matplotlib变化范围,python,matplotlib,Python,Matplotlib,我有一个imshow图,显示云,和一个叠加的箭图,显示云的运动矢量。这个图现在以像素为单位显示,但我想以公里为单位显示,即云场景的大小。我可以在imshow中更改范围,但是箭袋图不再适合 你有什么建议吗?任何帮助都将不胜感激 圣诞快乐 这是我的密码: # size I want to be shown in the plot (in kilometer) size = 9.750 # -> extent[0, size, 0, size] # arrays used in plot

我有一个imshow图,显示云,和一个叠加的箭图,显示云的运动矢量。这个图现在以像素为单位显示,但我想以公里为单位显示,即云场景的大小。我可以在imshow中更改范围,但是箭袋图不再适合

你有什么建议吗?任何帮助都将不胜感激

圣诞快乐

这是我的密码:

# size I want to be shown in the plot (in kilometer)
size = 9.750

# -> extent[0, size, 0, size]


# arrays used in plot (pixel size)

im_current = np.array((275,275))  
xdis_mean = np.array((275,275))
ydis_mean = np.array((275,275))


# settings for the quiver plot

sliceNr=20  # every x pixel will be shown
sy,sx =np.shape(im_current) 
x=np.arange(sx)[::sliceNr]
y=np.arange(sy)[::sliceNr]


# colormap for the quiver plot
M = sqrt(pow(xdis_mean[::sliceNr,::sliceNr], 2) + pow(ydis_mean[::sliceNr,::sliceNr], 2))



fig=plt.figure()

ax=fig.add_subplot(111)
cax=ax.imshow(im_current,origin='lower', cmap=cmap,vmin=0,vmax=1,norm=norm)

setp(plt.Axes.get_xticklabels(plt.gca()), fontsize=10)
setp(plt.Axes.get_yticklabels(plt.gca()), fontsize=10)


title('image at t=0 \n with mean displacement vector field')

xlabel('area size [pixel]',fontsize=9)
ylabel('area size [pixel]',fontsize=9)

# get axes from subplot to adjust colorbar to these axes
divider = make_axes_locatable(plt.gca())
cax1 = divider.append_axes("right", "5%", pad="4%")

cbar1=plt.colorbar(cax,cax=cax1,cmap=cmap,boundaries=bounds,ticks=[0,1],use_gridspec=True)
cbar1.ax.set_yticklabels(['0','1'],fontsize=10)


v=ax.quiver(x,y,xdis_mean[::sliceNr,::sliceNr],ydis_mean[::sliceNr,::sliceNr],M, units='xy',angles='xy',scale=1,scale_units='xy',cmap='autumn')

cax2 = divider.append_axes("bottom", "5%", pad="9%")
cbar2=plt.colorbar(v,cax=cax2,orientation='horizontal',use_gridspec=True)
for t in cbar2.ax.get_xticklabels():
    t.set_fontsize(10)

plt.tight_layout()

show()
为了说明这一点,下图如下:

有两种方法可以做到这一点:您可以重新缩放箭袋的(x,y)数据,或者设置标签格式化程序

选项A是这样的:

x,y = x*km_per_pixel + km_offset_x, y*km_per_pixel + km_offset_y
im = ax.imshow(...,exent=lims_in_km)
q = ax.quiver(x,y,...)
q = ax.quiver(..)
im = ax.imshow(...) # exactly like you had before
ax.get_xaxis().set_major_formatter(
    matplotlib.ticker.FuncFormatter(
        lambda x,i: '%.2f' % (x * km_per_pixel + km_offset_x)))
ax.get_yaxis().set_major_formatter(
    matplotlib.ticker.FuncFormatter(
        lambda x,i: '%.2f' % (x * km_per_pixel + km_ofset_y)))
选项B是这样的:

x,y = x*km_per_pixel + km_offset_x, y*km_per_pixel + km_offset_y
im = ax.imshow(...,exent=lims_in_km)
q = ax.quiver(x,y,...)
q = ax.quiver(..)
im = ax.imshow(...) # exactly like you had before
ax.get_xaxis().set_major_formatter(
    matplotlib.ticker.FuncFormatter(
        lambda x,i: '%.2f' % (x * km_per_pixel + km_offset_x)))
ax.get_yaxis().set_major_formatter(
    matplotlib.ticker.FuncFormatter(
        lambda x,i: '%.2f' % (x * km_per_pixel + km_ofset_y)))

您应该调整格式化字符串,使其成为您喜欢的格式。如果您想更多地控制刻度的位置,请查看
Locator
s。(所有这些课程的文档位于)

非常感谢!我选择了选项A,但没有“+km\u offset\u x”,它成功了!其实很简单…不知道为什么我找不到答案。谢谢你,新年快乐!我现在选择了选项B,因为这样我就可以在ax.quiver中使用units='xy',这使得它看起来比选项A中使用的units='dots'要好得多。所以感谢这两个选项!