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()