Pyplot散点图,使用facecolors ='none'并将边缘颜色保留为默认的确定性标记颜色选择

时间:2019-04-29 00:45:55

标签: python python-3.x matplotlib colors scatter-plot

我正在尝试为每个数据点生成一系列具有正方形和未填充标记的散点图,每个阵列在运行之间具有不同但确定性的标记颜色。为此,我尝试使用以下代码:

import matplotlib.pyplot as plt
import numpy as np

x = np.array([1,2,3,4,5,6,7,8,9,10])
plt.scatter(x, x**2, s=50, marker='s',facecolors='none')
plt.scatter(x, x**3, s=50, marker='s',facecolors='none')
plt.scatter(x, x**4, s=50, marker='s',facecolors='none')

会填充方形标记,但不会留下任何标记边缘,因此实际上看不到任何输出。如果我改用

plt.scatter(x, x**2, s=50, marker='s',facecolors='none',edgecolors='r')
plt.scatter(x, x**3, s=50, marker='s',facecolors='none',edgecolors='g')
plt.scatter(x, x**4, s=50, marker='s',facecolors='none',edgecolors='b')

然后,我确实确实看到了一系列由未填充的红色正方形表示的数据图,但是缺点是我必须使用edgecolor明确设置想要的颜色。但是,由于我的实际数据将由可变数量的数组组成,因此实际数量在运行时之前是未知的,因此,我希望以相同的散点图和不同的颜色来绘制每个数据系列,而不必显式指定使用的颜色。我可以使用

plt.scatter(x, y, s=50, marker='s',facecolors='none',edgecolor=np.random.rand(3,))
正如我所看到的那样,

但这是不理想的,因为我希望在两次运行之间具有确定性的颜色。因此,例如,如果我有3个数组,则要绘制的第一个数组始终为颜色'x',第二个始终为颜色'y',第三个始终为颜色'z'。将其扩展到n数组后,绘制的nth数组也始终具有相同的颜色(其中n可能非常大)。

作为示例,如果我们考虑使用填充色的简单图,我们会看到前三个图始终是相同的颜色(蓝色,橙色,绿色),即使添加了第四个图,前三个图也会保留他们原来的颜色。

3 plots, with default pyplot colors

4 plots, with the original 3 plots retaining their original colors as in the first image above

编辑:顺便说一句,有没有人知道在设置edgefaces时不包括facecolors='none'的原因(这将使我们可以轻松地使用默认的pyplot颜色)?似乎是一个相当奇怪的设计选择。

2 个答案:

答案 0 :(得分:1)

您可以在matplotlib中创建一个颜色图,然后将其包含在该系列的迭代中。

import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np

x = np.array([1,2,3,4,5,6,7,8,9,10])
powers = [2, 3, 4]

# create a list of 5 colors from viridis, we only use the last 3, but there are 
# 5 in the colormap
colors = cm.get_cmap('viridis', 5)

for c, p in zip(colors(powers), powers):
    plt.scatter(x, x**p, s=50, marker='s',facecolors='none', edgecolor=c)

您遇到的问题是edgecolor的默认颜色为'face',表明它的颜色与您设置为'none'的面部颜色相同。

答案 1 :(得分:0)

需要提前注意两件事。

  1. 您想使用n种不同的颜色,其中n是先验未知的。 Matplotlib的默认颜色周期有10种颜色。因此,如果n大于10的可能性很大,那么您自己定义任何颜色的前提都会崩溃。然后,您将需要选择自定义颜色循环或定义颜色并以任何方式在它们上循环。

  2. 散点图主要用于希望使用不同颜色或大小的标记。相反,如果所有标记都具有相同的颜色,则可以轻松使用plot

因此看来

import matplotlib.pyplot as plt
import numpy as np

x = np.array([1,2,3,4,5,6,7,8,9,10])
plt.plot(x, x**2, ls='none', ms=7, marker='s', mfc='none')
plt.plot(x, x**3, ls='none', ms=7, marker='s', mfc='none')
plt.plot(x, x**4, ls='none', ms=7, marker='s', mfc='none')

plt.show()

只要您要制作的地块少于11个,实际上就会做您需要的事情。

enter image description here

如果您确实要使用散点图,则可以使用仅包含正方形轮廓的标记,例如marker="$\u25A1$",类似于this answer

import matplotlib.pyplot as plt
import numpy as np

x = np.array([1,2,3,4,5,6,7,8,9,10])

plt.scatter(x, x**2, s=50, marker="$\u25A1$") 
plt.scatter(x, x**3, s=50, marker="$\u25A1$")
plt.scatter(x, x**4, s=50, marker="$\u25A1$")

plt.show()

enter image description here