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

Arg*_*ina 28 python plot alpha matplotlib histogram

我正在绘制直方图,我有三个数据集,我想要一起绘制,每个数据集都有不同的颜色和线型(虚线,点线等).我也给了一些透明度,以便看到重叠的条形图.

关键是我希望每个条的边缘不会像内部部分那样变得透明.这是一个例子:

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

ali*_*i_m 29

plt.hist接受传递给构造函数的其他关键字参数matplotlib.patches.Patch.特别是,您可以传递一个fc=参数,该参数允许您(R, G, B, A)在创建直方图时使用元组设置补丁facecolor .更改facecolor的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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 有没有办法仍然使用自动颜色循环? (2认同)
  • 这有点hack,但是可以从轴上获取prop循环器(请参阅[此答案](/sf/answers/968227151/)和下面的注释)。您可能需要使用ax._get_patches_for_fill.prop_cycler而不是ax._get_lines.prop_cycler)。道具循环器返回的颜色将是字符串(例如''b'`)而不是RGB元组,因此您需要使用[`matplotlib.colors.to_rgb(color_string)`](https://matplotlib.org /api/_as_gen/matplotlib.colors.to_rgb.html#matplotlib.colors.to_rgb)将字符串转换为RGB元组,然后附加您自己的alpha值。 (2认同)

lje*_*ibo 10

我想也许最愚蠢的解决方案是最简单和最好的?只需重新绘制直方图,没有内部颜色和没有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()
Run Code Online (Sandbox Code Playgroud)

如果没有第二个订单,图表应该看起来像没有任何边框的图形.使用底部3个直方图命令添加边框以生成图像波纹管.适用于Python3.4 Win7

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


blu*_*e10 5

我需要一个不需要我明确设置颜色的解决方案,即我想仍然使用默认颜色循环。以下解决方案建立在@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)
Run Code Online (Sandbox Code Playgroud)

请注意,color=color除了指定edgecolor似乎是必要的。否则,hist调用本身将再次增加颜色循环。