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

问题描述 投票:1回答:2

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

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颜色)背后的原因?这似乎是一个相当奇怪的设计选择。

python python-3.x matplotlib colors scatter-plot
2个回答
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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.