Matplotlib:箭头和imshow叠加,我如何设置两个颜色条?

时间:2012-08-15 13:31:19

标签: python matplotlib visualization data-visualization colorbar

我有一个由imshow()显示的图像,由quiver()设置的轮廓和矢量场组成的图形。我根据另一个标量确定了矢量场的颜色。在我的身材右侧,我做了一个colorbar()。此colorbar()代表imshow()显示的值(在我的情况下可以是正数和负数)。我想知道如何设置另一个颜色条,它将基于矢量颜色所基于的标量的值。有谁知道怎么做?

这是我能够制作的图像的一个例子。请注意,矢量的颜色从蓝色变为红色。根据当前的颜色条,蓝色表示否定。但是我知道矢量颜色代表的数量总是正数。

enter image description here

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

运行箭头不一定返回colorbar()所需的可映射对象的类型。我想这可能是因为我明确地“根据另一个标量来着色矢量场”,就像Heimdall所说的那样。因此,Hooked的回答对我不起作用。

我必须创建自己的mappable才能读取颜色条。我是通过Normalize使用matplotlib.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')

给colorbar函数提供任何其他参数给了我各种错误。

My example, where vector color shows third data axis