如何使用 colorbar 中的 z 值生成线性颜色图(图)

How to generate the lineared color plot (cplot) with z values in colorbar

在 MATLAB™ 中,可以使用 cplot.m 生成彩色图,基本上看起来像二维图,第三轴(z 轴)值作为颜色条。是否有任何 tool/plotting 技术可用于在 Python 或 IDL 编程语言中生成类似的图?上一个关于堆栈溢出的问题处理 link.

中给出的不同问题

Matplotlib 没有 cplot 直接等价物,但您可以使用 LineCollection.

有了这个理解,您必须修改通常的样板文件,添加特定的导入

In [1]: import numpy as np 
   ...: import matplotlib.pyplot as plt 
   ...: from matplotlib.collections import LineCollection                                 

现在,生成一些数据(c 是与 (x, y) 点关联的第三个值)

In [2]: x = np.linspace(0, 6.3, 64) 
   ...: y = np.sin(x) ; c = np.cos(x)                                                     

LineCollection 需要一个 3D 数组,即一个段列表,每个段一个点列表,每个点一个坐标列表,我们使用

构建
In [3]: points = np.array([x, y]).T.reshape(-1,1,2) 
   ...: segments = np.concatenate([points[:-1], points[1:]], axis=1)   

现在我们实例化 LineCollection,指定我们想要的颜色图和线宽,并在我们告诉实例它的 array(映射到颜色的)是数组 c

In [4]: lc = LineCollection(segments, cmap='plasma', linewidth=3) 
   ...: lc.set_array(c)                                                                   

最终我们以自己的方式绘制 lc,调用 autoscale 因为需要它(尽量不要调用它...)并添加一个颜色条。

In [5]: fig, ax = plt.subplots()                                                          
   ...: ax.add_collection(lc) 
   ...: ax.autoscale() 
   ...: plt.colorbar(lc);

我知道,它有点笨拙,但它确实有效。

IDL v8 有一个易于使用的 PLOT 函数关键字,称为 VERT_COLORS:

; generate some sample data
x = cos(dindgen(100)/20)
y = sin(dindgen(100)/20)
z = dindgen(100)+100

; plot the data
p = plot(x, y, vert_colors=bytscl(z), rgb_table=39, xrange=[-2,2], yrange=[-2,2], thick=3, /aspect_ratio)
cb = colorbar(range=[min(z), max(z)], target=p)

z 数据被缩放到颜色表编号 39 的字节索引。颜色条需要明确知道数据范围。