Matplotlib散点图和颜色贴图的问题

时间:2018-02-19 19:13:01

标签: python matplotlib legend scatter-plot colormap

我正在开发一个项目,该项目涉及将colormaps应用于matplotlib中生成的散点图。我的代码按预期工作,除非生成的散点图恰好有四个点。这在以下代码中说明:

import numpy as np
import matplotlib.pyplot as plt

cmap = plt.get_cmap('rainbow_r')

z = np.arange(20)
plt.close()
plt.figure(figsize=[8,6])

for i in range(1,11):
    x = np.arange(i)
    y = np.zeros(i) + i
    plt.scatter(x, y, c=cmap(i / 10), edgecolor='k', label=i, s=200)

plt.legend()
plt.show()

此代码生成以下图表:

matplotlib plot

每一行应由相同颜色的点组成,但对于具有四个点的行则不是这种情况。

我认为这与以下事实有关:从colormap中选择的颜色作为4个浮点数的元组返回,如下所示:

print(cmap(0.4))
>>  (0.69999999999999996, 0.95105651629515364, 0.58778525229247314, 1.0)

假设这是问题的根源,我不知道如何解决它。

2 个答案:

答案 0 :(得分:4)

这是一个常见的陷阱,the documentation特别提到它:

  

请注意,c不应该是单个数字RGB或RGBA序列,因为它与要进行颜色映射的值数组无法区分。

它还直接为您提供解决方案:

  

c可以是一个二维数组,其中的行是RGB或RGBA,但是,包括单行的情况,为所有点指定相同的颜色。

在这种情况下:

c=np.atleast_2d(cmap(i/10.))

<小时/> 当然,另一种选择是将颜色指定为字符串,以便解决这种不确定性。

c = matplotlib.colors.rgb2hex(cmap(i/10.))

答案 1 :(得分:3)

我用你的代码玩了一下,基本上你就解决了这个问题; cmap值与数据的相似尺寸导致它们被解释为&#34; 4&#34;情况下。

这似乎工作正常:

plt.scatter(x, y, c=[cmap(i / 10)], edgecolor='k', label=i, s=200)

(从cmap返回值的列表构造函数)

fixed_chart