Python 带Colobar的散点图

Python 带Colobar的散点图,python,matplotlib,scatter,Python,Matplotlib,Scatter,我试图绘制一些更复杂的数据,但为了举例,我简化了,以显示我正在尝试做什么,但不起作用。请参阅下面的代码和输出图像。注意,我有一个部分被注释掉了。我基本上想在顶部绘制注释部分,但我得到一个错误: ValueError:to_rgba:无效的rgba参数“0.0” to_rgb:无效的rgb参数“0.0” 无法将参数转换为rgb序列 import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locata

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

ValueError:to_rgba:无效的rgba参数“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))
我确实对这个错误有一些想法。因为第二组数据与第一组数据的长度不相同,反之亦然,所以颜色编码会变得混乱。有没有办法做到这一点


散布
c
参数需要一个颜色说明符(例如
'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
都必须具有相同的长度,否则匹配将不起作用<代码>NaN
c中的值在这里没有帮助。但是,
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))

scatter
c
参数需要一个颜色说明符(例如
'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
都必须具有相同的长度,否则匹配将不起作用<代码>NaN
c中的值在这里没有帮助。但是,
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))

我明白这是怎么回事了,我现在试过了,效果很好。问题是在我的数据集中,我不确定我的x1的大小,因为我将有很多,但对于所有映射和打印的数据集,颜色栏和贴图需要相同。例如,c参数需要保持不变,并将颜色映射到数据集,而不管数据集的大小。有办法吗?我可以添加NaN作为替代品吗?谢谢你的帮助。我知道这是如何工作的,我现在尝试了这个,它工作了。问题是在我的数据集中,我不确定我的x1的大小,因为我将有很多,但对于所有映射和打印的数据集,颜色栏和贴图需要相同。例如,c参数需要保持不变,并将颜色映射到数据集,而不管数据集的大小。有办法吗?我可以添加NaN作为替代品吗?谢谢你的帮助。