Построение с прозрачным маркером, но непрозрачным краем

Я пытаюсь сделать сюжет в matplotlib с прозрачными маркерами, у которых есть фиксированный цвет. Тем не менее, я не могу представить маркер с прозрачным заполнением.

У меня есть минимальный рабочий пример:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y1 = 2*x + 1
y2 = 3*x - 5

plt.plot(x,y1, 'o-', lw=6, ms=14)
plt.plot(x,y2, 'o', ms=14, markerfacecolor=None, alpha=0.5, markeredgecolor='red', markeredgewidth=5)

plt.show()

Я попробовал два метода, которые я нашел в Интернете, чтобы добиться этого: 1) Установка альфа-параметра. Тем не менее, это делает маркер слишком прозрачным, что не является желаемым эффектом. 2) Установка markfacecolor = None, хотя это не влияет на мой сюжет

Есть ли решение для этого?

Ответы

Ответ 1

Это сложно в Matplotlib... вы должны использовать строку "None" вместо значения None, тогда вы можете просто сделать:

plt.plot(x,y2, 'o', ms=14, markerfacecolor="None",
         markeredgecolor='red', markeredgewidth=5)

Ответ 2

В общем, кажется, что лучше использовать прозрачные цвета вместо параметра alpha. Прежде всего потому, что он не влияет на другие цвета и помогает избежать ошибки черной заливки, о которой сообщают некоторые в комментариях. В этом примере - используя функцию voxels для рисования 2 вокселей на графике - 4-е число в кортежах, хранящихся в colors, представляет альфа-значение цвета RGBA. Эти нормализованные записи кортежей RGBA можно использовать в качестве цветов в matplotlib.

import matplotlib.pyplot as plt, numpy as np, mpl_toolkits.mplot3d
fig = plt.figure()
ax = fig.gca(projection='3d')
voxels = np.array([[[True],[True]]])
colors = np.array([[[(0., 0., 0., 0.)],[(1.0, 0., 0., 0.5)]]])
ax.voxels(voxels, facecolors=colors, edgecolor='k', linewidth=.5)
plt.show(block=True)

enter image description here