Matplotlib - 如何使标记面颜色透明而不使线条透明

Cur*_*arn 43 python matplotlib

我知道如何在matplotlib中设置一行的透明度.例如,以下代码使行和标记透明.

import numpy as np
import matplotlib.pyplot as plt

vec = np.random.uniform(0, 10, 50)
f = plt.figure(1)
ax = f.add_subplot(111)
ax.plot(vec, color='#999999', marker='s', alpha=0.5)
Run Code Online (Sandbox Code Playgroud)

我想要行的alpha = 1.0,并且标记的面部颜色是半透明的(alpha = 0.5).这可以在matplotlib中完成吗?

谢谢.

tac*_*ell 45

请参阅下面@ Pelson的答案,了解使用一行执行此操作的正确方法.

您可以通过将两个独立Line2D对象粘贴在一起来以一种黑客的方式执行此操作.

th = np.linspace(0, 2 * np.pi, 64)
y = np.sin(th)
ax = plt.gca()

lin, = ax.plot(th, y, lw=5)
mark, = ax.plot(th, y, marker='o', alpha=.5, ms=10)

ax.legend([(lin, mark)], ['merged'])
plt.draw()
Run Code Online (Sandbox Code Playgroud)

演示图

看这里解释

  • 很好的答案.我特别喜欢如何处理传奇的插图. (2认同)

pel*_*son 42

在阅读了源代码之后matplotlib.line,结果发现有一个代码路径(至少在Agg中,但可能是所有后端),它允许你这样做.这是否是故意的行为,我不确定,但它肯定会起作用.关键是不要为线定义alpha值,而是定义所需的颜色以及alpha值:

import matplotlib.pyplot as plt

plt.plot([0, 1], [1, 0], 'k')
# Do not set an alpha value here
l, = plt.plot(range(10), 'o-', lw=10, markersize=30)

l.set_markerfacecolor((1, 1, 0, 0.5))
l.set_color('blue')

plt.show()
Run Code Online (Sandbox Code Playgroud)

这些可以作为参数给出plt.plot,所以只是

plt.plot(range(10), 'bo-', markerfacecolor=(1, 1, 0, 0.5), )
Run Code Online (Sandbox Code Playgroud)

会做的.

HTH

  • 谢谢,与 [`matplotlib.colors.to_rgba`](https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.colors.to_rgba.html#matplotlib-colors-to-rgba) 一起非常有用。例如`plt.plot(range(10),'bo-',markeredgecolor='b',markerfacecolor=colors.to_rgba('b',0.5))`。 (3认同)