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.colorsNormalize 来为我的箭袋向量着色(我将其称为C,这是一个与X、@987654327 形状相同的数组) @、UV。)

我的 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 叠加,如何设置两个颜色条?的主要内容,如果未能解决你的问题,请参考以下文章

Matlab quiver函数

在 Python 中绘制动画箭袋

与幅度对应的 quiver3 箭头颜色

如何使用 Quiver Plot 在向量场中显示速度大小?

2个向量之和

ruby evernote_to_quiver.rb