散点图颜色条 - Matplotlib

23

我想在散点图中显示一个颜色条,但是一直收到以下错误:

TypeError:您必须首先为可映射对象设置数组

这是我用来绘制的代码:

# Just plotting the values of data that are nonzero 
x_data = numpy.nonzero(data)[0] # x coordinates
y_data = numpy.nonzero(data)[1] # y coordinates

# Mapping the values to RGBA colors
data = plt.cm.jet(data[x_data, y_data])

pts = plt.scatter(x_data, y_data, marker='s', color=data)

plt.colorbar(pts)

如果我注释掉plt.colorbar(pts)这一行,我可以正确绘制图形,但是我想同时绘制色条。

提前感谢您的帮助。

1个回答

15

你正在传入特定的RGB值,因此matplotlib无法构建颜色映射,因为它不知道它与您的原始数据的关系。

与其将值映射到RGB颜色,不如让scatter来处理它。

而不是:

# Mapping the values to RGBA colors
data = plt.cm.jet(data[x_data, y_data])

pts = plt.scatter(x_data, y_data, marker='s', color=data)

做:

pts = plt.scatter(x_data, y_data, marker='s', c=data[x_data, y_data])

只需将您最初传递给 plt.cm.jet 的内容传递到 c 中即可。

然后,您将能够正常构建颜色映射。特定的错误提示告诉您颜色已经手动设置,而不是通过 set_array(其处理将数据值数组映射到RGB)进行设置。


它起作用了。我只有一个最后的问题...我已经尝试使用color=data[x_data, y_data],但是我收到了相同的错误消息。所以,c != color?谢谢@JoeKington。(: - pceccon
1
不,colorfacecolors的别名。(这有点令人困惑,但这是由于继承了matlab的绘图api。)c是原始matlab的scatter的遗留问题。scatter旨在被调用为scatter(x, y, c=z1, s=z1)以同时显示4个变量。(两个位置,按颜色变化和按大小变化)。在幕后,color调用输出集合上的set_facecolors,而c调用set_array。从长远来看,如果传入标量数组,则使color的行为与c相同可能是一个好主意。 - Joe Kington
嗯,我明白了。(: 然而,即使我传递了参数cmap=plt.cm.jet,我的颜色与其他图表相比也会有很大的不同(并且我得到了带有白色轮廓的正方形)。 - pceccon
1
@pceccon - 是的!这是因为在您的原始示例中,数据范围被缩放在0和1之间,而在我的示例中,它被缩放在数据的最小值和最大值之间。要使其与原始示例相同,请使用cmin = 0,cmax = 1 - Joe Kington
没错!很高兴你抓住了那个! - Joe Kington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接