Matplotlib: построение прозрачной гистограммы с непрозрачным краем
Я рисую гистограмму, и у меня есть три набора данных, которые я хочу построить вместе, каждый из которых имеет разные цвета и тип линии (пунктир, пунктир и т.д.).
Я также даю некоторую прозрачность, чтобы видеть перекрывающиеся полосы.
Дело в том, что я хотел бы, чтобы край каждого бара не стал прозрачным, как делает внутренняя часть.
Вот пример:
import matplotlib.pyplot as plt
import numpy as np
x = np.random.random(20)
y =np.random.random(20)
z= np.random.random(20)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.hist(x, bins=np.arange(0, 1, 0.1), ls='dashed', alpha = 0.5, lw=3, color= 'b')
ax.hist(y, bins=np.arange(0, 1, 0.1), ls='dotted', alpha = 0.5, lw=3, color= 'r')
ax.hist(z, bins=np.arange(0, 1, 0.1), alpha = 0.5, lw=3, color= 'k')
ax.set_xlim(-0.5, 1.5)
ax.set_ylim(0, 7)
plt.show()
![enter image description here]()
Ответы
Ответ 1
plt.hist
принимает дополнительные аргументы ключевых слов, которые передаются конструктору для matplotlib.patches.Patch
. В частности, вы можете передать аргумент fc=
, который позволяет установить патч facecolor с помощью кортежа (R, G, B, A)
при создании гистограмм. Изменение альфа-значения facecolor не влияет на прозрачность ребер:
ax.hist(x, bins=np.arange(0, 1, 0.1), ls='dashed', lw=3, fc=(0, 0, 1, 0.5))
ax.hist(y, bins=np.arange(0, 1, 0.1), ls='dotted', lw=3, fc=(1, 0, 0, 0.5))
ax.hist(z, bins=np.arange(0, 1, 0.1), lw=3, fc=(0, 0, 0, 0.5))
![enter image description here]()
Ответ 2
Я думаю, возможно, самое тупое решение - самое легкое и лучшее? Просто замените гистограммы без внутреннего цвета и без альфы. Это должно заменить только строки гистограммы.
Кроме того, вы можете исключить вероятность того, что линии/штрихи/точки не перекрываются, полностью удалив их из первого графика гистограммы
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
x = np.random.random(20)
y = np.random.random(20)
z = np.random.random(20)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.hist(x, bins=np.arange(0, 1, 0.1), edgecolor='None', alpha = 0.5, color= 'b')
ax.hist(y, bins=np.arange(0, 1, 0.1), edgecolor='None', alpha = 0.5, color= 'r')
ax.hist(z, bins=np.arange(0, 1, 0.1), edgecolor="None", alpha = 0.5, color= 'k')
ax.hist(x, bins=np.arange(0, 1, 0.1), ls='dashed', lw=3, facecolor="None")
ax.hist(y, bins=np.arange(0, 1, 0.1), ls='dotted', lw=3, facecolor="None")
ax.hist(z, bins=np.arange(0, 1, 0.1), lw=3, facecolor="None")
plt.show()
без вторых порядков график должен выглядеть как ваша фигура без каких-либо границ. С нижними 3 гистограммами добавляются границы границ, чтобы создать изображение ниже. Работает на Python3.4 Win7
[cut, потому что, видимо, у меня нет достаточного количества сообщений для публикации изображений)