我正在尝试为每个数据点生成一系列带有方形和未填充标记的散点图,每个数组的运行之间具有不同但确定的标记颜色。为此,我尝试使用以下代码:
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,))
正如我在这个SO上看到的回答,但这并不理想,因为我希望在跑步之间有确定的颜色。因此,例如,如果我有3个数组,那么要绘制的第一个数组总是颜色'x',第二个数字总是颜色'y',第三个数字总是颜色'z'。将此扩展到n
数组,绘制的nth
数组也始终是相同的颜色(其中n
可能非常大)。
例如,如果我们考虑使用填充颜色的简单绘图,我们会看到前3个绘图总是相同的颜色(蓝色,橙色,绿色),即使添加第4个绘图,前3个绘图仍保留其原始颜色。
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颜色)背后的原因?这似乎是一个相当奇怪的设计选择。
有两点需要注意。
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$"
,类似于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()
您可以在matplotlib中创建一个colormap,然后在该系列的迭代中包含该颜色图。
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'
的面颜色具有相同的颜色。