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
。