Matplotlib:quiver 和 imshow 叠加,如何设置两个颜色条?
Posted
技术标签:
【中文标题】Matplotlib:quiver 和 imshow 叠加,如何设置两个颜色条?【英文标题】:Matplotlib : quiver and imshow superimposed, how can I set two colorbars? 【发布时间】:2012-08-11 19:12:36 【问题描述】:我有一个由imshow()
显示的图像、由quiver()
设置的轮廓和矢量场组成的图形。我根据另一个标量对矢量场进行了着色。在我图的右边,我做了一个colorbar()
。这个colorbar()
代表imshow()
显示的值(在我的情况下可以是正数和负数)。我想知道如何设置另一个颜色条,该颜色条将基于向量颜色所基于的标量值。有人知道怎么做吗?
这是我能够制作的图像示例。请注意,向量的颜色从蓝色变为红色。根据当前的颜色条,蓝色表示负数。但是我知道向量的颜色所代表的量总是正数。
【问题讨论】:
【参考方案1】:只需调用两次colorbar
,就在每次绘图调用之后。 Pylab 将创建一个与最新绘图匹配的新颜色条。请注意,与您的示例一样,颤动值的范围为 0,1,而 imshow 采用负值。为清楚起见(此示例中未显示),我将使用不同的颜色图来区分这两种类型的图。
import numpy as np
import pylab as plt
# Create some sample data
dx = np.linspace(0,1,20)
X,Y = np.meshgrid(dx,dx)
Z = X**2 - Y
Z2 = X
plt.imshow(Z)
plt.colorbar()
plt.quiver(X,Y,Z2,width=.01,linewidth=1)
plt.colorbar()
plt.show()
【讨论】:
哦,就这么简单吗?感谢您的回答!我很好奇: colorbar() 如何知道要查看哪些数据?如果我想从对象的角度来做,它是如何工作的? @Heimdall 来自文档:“颜色条应用到的 Image、ContourSet 等;此参数对于 colorbar() 方法是必需的,但对于 colorbar() 函数是可选的,它设置默认为当前图像。” matplotlib.sourceforge.net/api/…。因此colorbar
默认参数必须放入最新绘制的艺术家。文档还建议了一种方法,可以更细粒度地控制哪个颜色条 -> 绘图。【参考方案2】:
运行 quiver 不一定会返回 colorbar()
所需的可映射对象类型。我认为这可能是因为我明确地“根据另一个标量对矢量场进行了着色”,就像 Heimdall 所说的那样。因此,Hooked 的回答对我不起作用。
我必须创建自己的可映射以供颜色条读取。我通过使用来自matplotlib.colors
的Normalize
来为我的箭袋向量着色(我将其称为C
,这是一个与X
、@987654327 形状相同的数组) @、U
和 V
。)
我的 quiver call 看起来像这样:
import matplotlib.pyplot as pl
import matplotlib.cm as cm
import matplotlib.colors as mcolors
import matplotlib.colorbar as mcolorbar
pl.figure()
nz = mcolors.Normalize()
nz.autoscale(C)
pl.quiver(X, Y, U, V, color=cm.jet(nz(C)))
cax,_ = mcolorbar.make_axes(pl.gca())
cb = mcolorbar.ColorbarBase(cax, cmap=cm.jet, norm=nz)
cb.set_label('color data meaning')
给颜色条函数提供任何其他参数都会给我带来各种错误。
【讨论】:
您能说明一下您是如何在 C 中生成颜色的吗?谢谢! @pyan,在这种情况下,颜色显示的是 time,所有这些参数都是一维数组,所以就像C = dt * np.arange(len(X))
这样简单
谢谢!我认为这与幅度或方向有关。以上是关于Matplotlib:quiver 和 imshow 叠加,如何设置两个颜色条?的主要内容,如果未能解决你的问题,请参考以下文章