首页 > 解决方案 > Colobar 散点图

问题描述

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

ValueError: to_rgba: Invalid rgba arg "0.0" to_rgb: Invalid rgb arg "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))

我确实对错误有某种想法。由于第二组数据的长度与第一组不同,反之亦然,因此颜色编码会混淆。有没有办法做这样的事情?

上面代码的一个简单图

标签: pythonmatplotlibscatter

解决方案


c参数scatter需要单个颜色说明符(例如'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])。这就是为什么c,x并且y都必须具有相同的长度,否则匹配不起作用。NaNc 中的值在这里无济于事。但是,您的值c仅使用您指定的颜色图转换为颜色。颜色图的范围由vmin和决定vmax。因此,为确保您的颜色对所有数据集使用相同的数据范围,只需在使用所有数据进行绘图之前预先计算vmin并进行相应设置。vmax

所以在你的情况下:

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))

推荐阅读