Python 如何使用colorbar中的z值生成线性彩色打印(cplot)

Python 如何使用colorbar中的z值生成线性彩色打印(cplot),python,plot,idl-programming-language,Python,Plot,Idl Programming Language,在MATLAB中™ 可以使用它生成彩色绘图,基本上看起来像2d绘图,第三轴(z轴)值作为颜色条。是否有任何工具/绘图技术可用于在Python或IDL编程语言中生成类似的绘图?。上一个关于堆栈溢出的问题处理链接中给出的不同问题 In [4]: lc = LineCollection(segments, cmap='plasma', linewidth=3) ...: lc.set_array(c)

在MATLAB中™ 可以使用它生成彩色绘图,基本上看起来像2d绘图,第三轴(z轴)值作为颜色条。是否有任何工具/绘图技术可用于在Python或IDL编程语言中生成类似的绘图?。上一个关于堆栈溢出的问题处理链接中给出的不同问题

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

Matplotlib没有直接等效的
cplot
,但您可以使用
LineCollection

In [4]: lc = LineCollection(segments, cmap='plasma', linewidth=3) 
   ...: lc.set_array(c)                                                                   
了解了这一点,您必须修改通常的样板文件,添加特定的导入

In [1]: import numpy as np 
   ...: import matplotlib.pyplot as plt 
   ...: from matplotlib.collections import LineCollection                                 
In [4]: lc = LineCollection(segments, cmap='plasma', linewidth=3) 
   ...: lc.set_array(c)                                                                   
现在,生成一些数据(
c
是与
(x,y)
点关联的第三个值)

In [4]: lc = LineCollection(segments, cmap='plasma', linewidth=3) 
   ...: lc.set_array(c)                                                                   
LineCollection
需要一个3D数组,即一个线段列表,每个线段一个点列表,每个点一个坐标列表,我们使用该数组构建

In [4]: lc = LineCollection(segments, cmap='plasma', linewidth=3) 
   ...: lc.set_array(c)                                                                   
现在,我们实例化
LineCollection
,指定所需的颜色映射和线宽,然后立即告诉我们的实例,它的
数组(映射到颜色的)是数组
c

In [4]: lc = LineCollection(segments, cmap='plasma', linewidth=3) 
   ...: lc.set_array(c)                                                                   
最后,我们以自己的方式绘制
lc
,调用
autoscale
,因为需要它(尽量不要调用它…),并添加一个色条

In [4]: lc = LineCollection(segments, cmap='plasma', linewidth=3) 
   ...: lc.set_array(c)                                                                   
In [5]: fig, ax = plt.subplots()                                                          
   ...: ax.add_collection(lc) 
   ...: ax.autoscale() 
   ...: plt.colorbar(lc);

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

我知道,它有点笨重,但它可以工作。

IDL v8为绘图函数提供了一个易于使用的关键字,名为:

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

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

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

你说的“lineared”是什么意思?副本没有解决问题的IDL部分。有关示例解决方案,请参见(如果您有Coyote库,请使用
绘图
cgplots
)。颜色栏应显示z轴上的值。但它显示h=色条(p)。关于在颜色条上添加z轴值的任何想法。我更新了上面帖子中的示例,添加了颜色条。
In [4]: lc = LineCollection(segments, cmap='plasma', linewidth=3) 
   ...: lc.set_array(c)