Python Pyplot散点图,使用FaceColor=';无';,并将edgecolors保留为默认的确定性标记颜色选择

Python Pyplot散点图,使用FaceColor=';无';,并将edgecolors保留为默认的确定性标记颜色选择,python,python-3.x,matplotlib,colors,scatter-plot,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, marke

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

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
数组,绘制的
n
数组也总是相同的颜色(其中
n
可能非常大)

作为一个例子,如果我们考虑使用填充颜色的简单图,我们看到前3个图总是相同的颜色(蓝色、橙色、绿色),甚至当添加第四个图时,前3个图保留它们原来的颜色。


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

您可以在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'
的面部颜色具有相同的颜色

首先要注意两件事

  • 您希望有
    n
    不同的颜色,其中
    n
    是先验未知的。Matplotlib的默认颜色循环有10种颜色。因此,如果
    n
    有可能变得大于10,那么不自己定义任何颜色的前提就被打破了。然后,您将需要选择一个自定义颜色循环,或者定义颜色并在其上循环

  • 如果要使用不同颜色或大小的标记,则“散布”主要很有用。如果所有标记的颜色都相同,则可以很容易地使用
    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个情节,你就可以做你需要的事情

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


    谢谢你的回答@James,所以唯一的方法就是在颜色映射中循环颜色,有没有不必循环颜色的方法呢?我在回答中添加了更多内容。基本上,没有,默认情况下edgecolor继承facecolor。您必须手动覆盖该行为。
    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()