Matplotlib散点图和颜色映射问题

5

我正在进行一个涉及将colormap应用于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

每一行应该由相同颜色的点组成,但四个点的行不是这样的。
我猜这与从色图中选择的颜色以4个浮点数的元组形式返回有关,如下图所示:
print(cmap(0.4))
>>  (0.69999999999999996, 0.95105651629515364, 0.58778525229247314, 1.0)

假设这是问题的根源,我不知道如何解决。
2个回答

4

我在你的代码上做了一些调整,基本上你已经找到了问题所在;cmap值与数据的相似维度导致在“4”情况下它们被不同地解释。

这似乎可以正确地工作:

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

(从cmap返回值周围构造列表)

fixed_chart


非常好。谢谢! - Beane

4
这是一个常见的陷阱,文档特别提到了这一点:文档
注意,c 不应该是单个数值的 RGB 或 RGBA 序列,因为这与要进行颜色映射的值数组无法区分。
它直接给出了解决方案: c 可以是一个二维数组,其中行是 RGB 或 RGBA,包括指定所有点相同颜色的单行情况。
在这种情况下:
c=np.atleast_2d(cmap(i/10.))


当然,另一种选择是将颜色指定为字符串,以消除这种不明确性。

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

感谢您对问题的解释和解决方案。 - Beane
我直到现在才有机会尝试您的解决方案,但奇怪的是它不起作用。我得到了与之前完全相同的输出。我还尝试了下面的解决方案,但它也不起作用。 :( - Beane
这个方法很不正规,但是我能想到的唯一解决方案就是创建一个包含两个相同颜色副本的数组:c=[my_cmap(i / 10), my_cmap(i / 10)] - Beane
可能更新matplotlib也会有所帮助。我还在答案中添加了另一个选项。 - ImportanceOfBeingErnest
谢谢!第二个选项似乎对我有用。这很好,因为正如我应该预料的那样,我上面的hacky解决方案只是将问题转移到了具有8个点的散点图中。再次感谢! - Beane

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