Matplotlib:如何将箭头图和imshow图叠加,同时设置两个颜色条?

10
我有一个图形,由imshow()显示的图像、quiver()设置的轮廓和矢量场组成。我根据另一个标量数量对矢量场进行了着色。在我的图形右侧,我制作了一个colorbar()。这个colorbar()代表imshow()所显示的值(在我的情况下可能是正数和负数)。我想知道如何设置另一个基于矢量颜色的标量数量的colorbar。有人知道怎么做吗?
这是我能够制作的图像示例。请注意,向量的颜色从蓝色到红色变化。根据当前的colorbar,蓝色表示负数。但是我知道颜色所代表的数量始终为正数。

enter image description here

2个回答

7
只需在每个绘制调用之后两次调用colorbar。Pylab将创建一个与最新绘图相匹配的新色条。请注意,如您所示,quiver值范围从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()

enter image description here


哦,这样很简单吗?谢谢你的回答!我很好奇:colorbar()如何知道要查看哪些数据?如果我想从对象的角度进行操作,它该怎么办? - tm8cc
来自文档的@Heimdall:“颜色条应用于的图像、ContourSet等;这个参数对于colorbar()方法是强制性的,但对于colorbar()函数是可选的,默认设置为当前图像。” 因此,colorbar默认参数必须放在最新绘制的Artist中。文档还提供了一种更精细地控制哪个颜色条->绘图的方法。 - Hooked

4
运行quiver不一定会返回colorbar()所需的可映射对象的类型。我认为这可能是因为像Heimdall说的那样,我明确地“基于另一个标量量对矢量场进行了着色”。因此,Hooked的答案对我不起作用。
我必须创建自己的可映射对象才能让颜色条读取。我通过使用matplotlib.colors中的Normalize对我想要用来给quiver向量上色的数据(我将其称为C,它是与X、Y、U和V形状相同的数组)进行了处理。
我的quiver调用看起来像这样:
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')

给colorbar函数传入其他参数会导致各种错误。 我的例子,其中矢量颜色显示第三个数据轴

你能展示一下你是如何在C语言中生成颜色的吗?谢谢! - pyan
@pyan,在这种情况下,颜色显示的是时间,而所有这些参数都是1D数组,因此它就像是这样简单的一件事:C = dt * np.arange(len(X)) - askewchan
谢谢!我以为那与大小或方向有关。 - pyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接