Matplotlib 散点图和颜色图的问题

Posted

技术标签:

【中文标题】Matplotlib 散点图和颜色图的问题【英文标题】:Issue with Matplotlib scatterplot and Color maps 【发布时间】:2018-07-30 01:48:56 【问题描述】:

我正在从事一个项目,该项目涉及将颜色图应用于 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()

此代码生成以下图:

每一行都应该由相同颜色的点组成,但对于有四个点的行,情况并非如此。

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

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

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

【问题讨论】:

【参考方案1】:

我对您的代码进行了一些尝试,基本上您已经解决了问题; cmap 值与数据的相似维度导致它们对于“4”情况的解释不同。

这似乎工作正常:

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

(围绕 cmap 的返回值列出构造函数)

【讨论】:

非常好。谢谢!【参考方案2】:

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

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

它也直接给你解决方案:

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

在这种情况下:

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


当然,另一种选择是将颜色指定为字符串,以便解决这种歧义。
c = matplotlib.colors.rgb2hex(cmap(i/10.))

【讨论】:

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

以上是关于Matplotlib 散点图和颜色图的问题的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib 中具有重叠点的散点图的可视化

matplotlib:通过用于为散点图着色的对数颜色条值对 2D 线进行着色

用matplotlib画散点图

在 MATLAB 中创建包含散点图和正态图的图例

matplotlib 散点图和注释函数annotate

matplotlib 中带有散点图和使用 set_offsets 的动画:图形的自动缩放不起作用