Python 如何让matplotlib为不同的类绘制不同的边颜色,并使用FaceColor=';无';?

Python 如何让matplotlib为不同的类绘制不同的边颜色,并使用FaceColor=';无';?,python,matplotlib,Python,Matplotlib,我正试着做一个这样的情节 这意味着facecolors='none' 此代码 X, y = make_circles(100, factor=.1, noise=.1) plt.scatter(X[:, 0], X[:, 1], s=50, cmap='autumn', facecolors='none', edgecolors='r') 给予 这两个类都使用红色 这是因为当我尝试使用edgecolors=y X, y = make_circles(100, factor=.1, nois

我正试着做一个这样的情节

这意味着
facecolors='none'

此代码

X, y = make_circles(100, factor=.1, noise=.1)
plt.scatter(X[:, 0], X[:, 1], s=50, cmap='autumn', facecolors='none', edgecolors='r')
给予

这两个类都使用红色

这是因为当我尝试使用
edgecolors=y

X, y = make_circles(100, factor=.1, noise=.1)
plt.scatter(X[:, 0], X[:, 1], s=50, cmap='autumn', facecolors='none', edgecolors=y)
我犯了这个错误

    261     # tuple color.
    262     if not np.iterable(c):
--> 263         raise ValueError(f"Invalid RGBA argument: {orig_c!r}")
    264     if len(c) not in [3, 4]:
    265         raise ValueError("RGBA sequence should have length 3 or 4")
如何正确使用edgecolors?

edgecolors不像c
cmap
参数将仅应用于
c
。但是
c
将覆盖
facecolors=“none”
,因此我们不想使用它

与参数
c
不同,参数
edgecolors
必须接收可直接解释为颜色的值,即rgb或rgba值、颜色字符串。。。或本文件中指定的任何格式

您可以将
y
传递给cmap:

import matplotlib.pyplot as plt
cmap = plt.get_cmap("winter")
colors = cmap(y * 255) # or cmap(y.astype(float))
print(colors)
# > array([[1., 1., 0., 1.], # RGBA values
#          [1., 1., 0., 1.],
#          [1., 1., 0., 1.],
#          [1., 0., 0., 1.],
#                ...       ])
plt.scatter(X[:, 0], X[:, 1], s=50, facecolors="none", edgecolors=colors)
请注意,必须传递介于0和255之间的整数或介于0和255之间的浮点。和1.,沿cmap扩散颜色

您还可以从自己设计的词典中推断颜色:

color_dict = {0: "r", 1: "b"}
colors=tuple(map(color_dict.get, y))
print(colors)
# > ('b', 'b', 'b', 'r', ...)
plt.scatter(X[:, 0], X[:, 1], s=50, facecolors="none", edgecolors=colors)

标记不像颜色 不能在单个
分散调用中指定不同的标记,因为它只接受
标记样式的单个表示形式(作为类的实例或字符串)

这意味着您必须调用
scatter
任意次数的不同标记

此外,目前,您不能将
edgecolor
+markerstyle
一起使用

最简单的方法是按颜色屏蔽数据:

red_mask = y==0
print(red_mask)
# > [False, False, False, True ...]
plt.scatter(X[red_mask, 0], X[red_mask, 1], s=50, facecolors="none", edgecolors="r")
plt.scatter(X[~red_mask, 0], X[~red_mask, 1], s=50, marker="+", c="b")

另一种解决方案是绘制每个点,但在我看来,这不那么优雅:

for X_x, X_y, clas in zip(X[:, 0], X[:, 1], y) :
    if clas == 1:
        plt.scatter(X_x, X_y, c="b", marker="+")
    else:
        plt.scatter(X_x, X_y, facecolors="none", edgecolor="r", marker="o", )
# Same resulting plot

非常感谢你
c
将覆盖
facecolors=“none”
,因此我们不想使用它。“它”指的是
c
参数吗?@yaojp是的,没错。另外,如果您以任何方式设置
cmap
参数,它将不会产生任何可见的效果,因为我们不使用
c