带颜色条的散点图

Scatter Plot with Colobar

我正在尝试绘制一些更复杂的数据,但为了举例,我已经简化以显示我正在尝试做但不起作用的事情。请参阅下面的代码和输出图像。请注意,我有一个部分被注释掉了。我基本上想在顶部绘制评论部分,但出现错误:

ValueError:to_rgba:无效的 rgba arg“0.0” to_rgb: 无效的 rgb 参数“0.0” 无法将参数转换为 rgb 序列

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

x1=[1.0,1.5,2.2,1.8]
y1=[1.1,1.4,2.0,1.75]

x2=[1.5,2.5,3.0,3.5,3.6]
y2=[1.3,2.2,3.3,3.4,3.5]

height=[0.0,1.0,2.0,3.0,4.0]

fig = plt.figure(figsize=(8, 8))
ax=plt.subplot()
divider=make_axes_locatable(ax)
sc=plt.scatter(x2, y2, c=height, vmin=np.min(height)-0.5,
           vmax=np.max(height)+0.5, marker='o', s=40, 
           cmap=plt.cm.get_cmap('jet', len(height)))

#sc=plt.scatter(x1, y1, c=height, vmin=np.min(height)-0.5,
#               vmax=np.max(height)+0.5, marker='o', s=40, 
#               cmap=plt.cm.get_cmap('jet', len(height)))

cax=divider.append_axes("right", size='5%', pad=0.05)
cbar=plt.colorbar(sc, cax=cax, ticks=np.arange(np.min(height),np.max(height)+1,1.0))

我确实对错误有所了解。由于第二组数据与第一组数据的长度不同,反之亦然,颜色编码变得混乱。有没有办法做这样的事情?

scatterc 参数需要单个颜色说明符(例如 'blue')或一系列颜色说明符(例如 ['blue', 'red', ...])或一系列颜色说明符使用颜色图映射的数字(例如 [1, 2, 3, 4, ...],正如您在此处使用的那样)。

但是,在您注释掉的情况下,您提供的系列与您的数据不匹配,因此 scatter 不知道如何处理它。你想用它做什么?

你可能会,例如尝试

height1 = np.arange(len(x1))
sc=plt.scatter(x1, y1, c=height1, vmin=np.min(height1)-0.5,
               vmax=np.max(height1)+0.5, marker='o', s=40, 
               cmap=plt.cm.get_cmap('jet', len(height)))

编辑:其工作方式如下:每个数据点(x,y)与c中的一个元素相关联,即分配c[i](x[i], y[i]) 处的标记。这就是为什么 cxy 都必须具有相同的长度,否则匹配不起作用。 NaN c 中的值在这里无济于事。但是,您在 c 中的值只会使用您指定的颜色图转换为颜色。颜色图的范围由 vminvmax 决定。因此,为了确保您的颜色对所有数据集使用相同的数据范围,只需在使用所有数据绘图之前预先计算 vminvmax 并相应地进行设置。

所以在你的情况下:

h1 = np.arange(len(x1))
h2 = np.arange(len(x2))

minval = min([np.min(h) for h in [h1, h2]])
maxval = max([np.max(h) for h in [h1, h2]])
nh = len(np.arange(minval, maxval+1, 1))

然后是

sc=plt.scatter(x1, y1, c=h1, marker='o', s=40, 
               vmin=minval-0.5, vmax=maxval+0.5, 
               cmap=plt.cm.get_cmap('jet', nh)
          )

以及颜色条

cbar=plt.colorbar(sc, cax=cax, ticks=np.arange(minval, maxval+1,1.0))