9

我有一个图形,由imshow()显示的图像,轮廓和由quiver()设置的矢量字段组成。我已经根据另一个标量量化了矢量场。在我的身材右侧,我做了一个colorbar()。这colorbar()代表由imshow()显示的值(在我的情况下,这可能是正值和负值)。我想知道如何设置另一个颜色条,该颜色条将基于矢量颜色基于的标量的值。有谁知道这是怎么做到的吗?Matplotlib:箭头和imshow叠加,我如何设置两个颜色条?

这是我已经能够做的图像的一个例子。请注意,矢量的颜色从蓝色变为红色。根据当前的颜色条,蓝色表示负值。但是我知道,矢量颜色表示的数量总是正数。

enter image description here

回答

7

直接让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() 

enter image description here

+0

哦,这是简单的吗?感谢您的回答!我很好奇:colorbar()如何知道要查看哪些数据?如果我想从objets的角度来看它是如何工作的? – MCF 2012-08-15 18:33:35

+0

@Heimdall from the docs:“Image,ContourSet等颜色栏应用;该参数对于colorbar()方法是强制性的,但是对于colorbar()函数是可选的,它将默认设置为当前图像。 http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.colorbar。因此'colorbar'默认参数必须放入最新绘制的Artist中。该文档还提供了一种更精细的控制哪个colorbar - > plot的方法。 – Hooked 2012-08-15 18:36:10

4

运行颤动不一定返回可映射对象,它colorbar()需要的类型。我认为这可能是因为我明确地“根据另一个标量量化了矢量场”,就像Heimdall所说的那样。因此,胡克德的回答对我来说并不合适。

我必须创建我自己的颜色栏可读的映射。我这样做是通过使用Normalizematplotlib.colors上的数据,我想用上色我颤抖载体(我会打电话给C,这是同形状的数组作为XYUV。)

我颤抖调用如下:

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') 

给予任何其他参数的颜色条功能给了我各种各样的错误。

My example, where vector color shows third data axis

+0

你可以请你说明你如何在C中生成颜色?谢谢! – pyan 2016-03-07 15:32:17

+0

@pyan,在这种情况下,颜色显示* time *,并且所有这些参数都是1D数组,因此它就像'C = dt * np.arange(len(X))'一样简单' – askewchan 2016-03-07 15:48:12

+0

谢谢!我认为这是与幅度或方向有关的东西。 – pyan 2016-03-07 20:42:25