Matplotlib 使用分层直方图
Matplotlib using layered histograms
有什么方法可以在matplotlib/pyplot中制作分层直方图吗?
我已经找到如何使用 alpha
标签的透明度,但我找不到分层的方法,
例如。如果有两个具有共同 y 轴图的数据集,应首先绘制最小的频率,以便可以看到它在较大的频率之上分层。
透明度无法正常工作,因为它会改变颜色,然后使其与键不匹配。
我认为您可以通过根据高度设置各个条形图的 z 顺序来获得您想要的效果:
import numpy as np
from matplotlib import pyplot as plt
# two overlapping distributions
x1 = np.random.beta(2, 5, 500)
x2 = np.random.beta(5, 2, 500)
fig, ax = plt.subplots(1, 1)
ax.hold(True)
# plot the histograms as usual
bins = np.linspace(0, 1, 20)
counts1, edges1, bars1 = ax.hist(x1, bins)
counts2, edges2, bars2 = ax.hist(x2, bins)
# plot the histograms as lines as well for clarity
ax.hist(x1, bins, histtype='step', ec='k', ls='solid', lw=3)
ax.hist(x2, bins, histtype='step', ec='k', ls='dashed', lw=3)
# set the z-order of each bar according to its relative height
x2_bigger = counts2 > counts1
for b1, b2, oo in zip(bars1, bars2, x2_bigger):
if oo:
# if bar 2 is taller than bar 1, place it behind bar 1
b2.set_zorder(b1.get_zorder() - 1)
else:
# otherwise place it in front
b2.set_zorder(b1.get_zorder() + 1)
plt.show()
有什么方法可以在matplotlib/pyplot中制作分层直方图吗?
我已经找到如何使用 alpha
标签的透明度,但我找不到分层的方法,
例如。如果有两个具有共同 y 轴图的数据集,应首先绘制最小的频率,以便可以看到它在较大的频率之上分层。
透明度无法正常工作,因为它会改变颜色,然后使其与键不匹配。
我认为您可以通过根据高度设置各个条形图的 z 顺序来获得您想要的效果:
import numpy as np
from matplotlib import pyplot as plt
# two overlapping distributions
x1 = np.random.beta(2, 5, 500)
x2 = np.random.beta(5, 2, 500)
fig, ax = plt.subplots(1, 1)
ax.hold(True)
# plot the histograms as usual
bins = np.linspace(0, 1, 20)
counts1, edges1, bars1 = ax.hist(x1, bins)
counts2, edges2, bars2 = ax.hist(x2, bins)
# plot the histograms as lines as well for clarity
ax.hist(x1, bins, histtype='step', ec='k', ls='solid', lw=3)
ax.hist(x2, bins, histtype='step', ec='k', ls='dashed', lw=3)
# set the z-order of each bar according to its relative height
x2_bigger = counts2 > counts1
for b1, b2, oo in zip(bars1, bars2, x2_bigger):
if oo:
# if bar 2 is taller than bar 1, place it behind bar 1
b2.set_zorder(b1.get_zorder() - 1)
else:
# otherwise place it in front
b2.set_zorder(b1.get_zorder() + 1)
plt.show()