绘制具有非透明边缘的透明直方图

问题描述 投票:0回答:4

我正在绘制一个直方图,我有三个数据集,我想将它们绘制在一起,每个数据集都有不同的颜色和线型(虚线、点线等)。 我还提供了一些透明度,以便看到重叠的条形。

重点是我希望每个条形的边缘不要像内部那样变得透明。 这是一个例子:

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

python matplotlib plot histogram alpha
4个回答
50
投票

plt.hist
接受传递给
matplotlib.patches.Patch
的构造函数的附加关键字参数。特别是,您可以传递
fc=
参数,该参数允许您在创建直方图时使用
(R, G, B, A)
元组设置面片颜色。更改面颜色的 alpha 值不会影响边缘的透明度:

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


26
投票

我认为也许最愚蠢的解决方案是最简单和最好的?只需重新绘制直方图,没有内部颜色和 alpha。这应该只重新绘制直方图线。

此外,您可能希望通过从第一个直方图中完全删除线/虚线/点来消除线/虚线/点不重叠的可能性

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

[剪切,因为显然我没有足够的代表来发布图片]


8
投票

我需要一个不需要我显式设置颜色的解决方案,即我想仍然使用默认的颜色循环。以下解决方案基于@ljetibo的想法,使用@ali_m的想法绘制两次直方图来提取颜色循环的状态:

# increment and get the "props" cycle (and extract the color)
color = next(ax._get_lines.prop_cycler)["color"]
# 1. draw: inner area with alpha
ax.hist(data, color=color, alpha=0.3)
# 2. draw: only edges with full color
ax.hist(data, color=color, edgecolor=color, fc="None", lw=1)

请注意,除了

color=color
之外,还指定
edgecolor
似乎是必要的。否则
hist
调用本身将再次增加颜色循环。


0
投票

正如其他人所说,您可以根据需要修改

facecolor
edgecolor
,同时还必须设置
color
以避免 Matplotlib 增加颜色循环。

我的解决方案是这里所说的所有内容的混合:

color = next(ax._get_lines.prop_cycler)["color"] # Retrieve color from the cycle

# print(color)  # ex: #8dd3c7
# Colors returned by the color cycle are HEX colors,
# represented as #RRGGBBAA.

ax.hist(data, range=range, bins= _nbins, 
        color= color, fc= color + 'A0', ec=color) # Here A0 represents an alpha value of 160
© www.soinside.com 2019 - 2024. All rights reserved.