想象一下,我有以下6个数组:
A0 = np.array([0,2,5,6,3,1,9,3,5,7])
B0 = np.array([5,1,6,7,3,8,2,3,4,7,1])
C0 = np.array([3,5,7,7,8,5,5,6,7,1,6])
A1 = np.array([2,2,6,7,4])
B1 = np.array([1,6,1,4,0])
C1 = np.array([5,3,3,7,0])
我可以在直方图中绘制前三个,将三个数组分成三个小条(蓝色表示A0,黄色表示B0,绿色表示C0)。
plt.hist([A0,B0,C0])
plt.show()
我还可以堆叠两个数组的直方图;例如
plt.hist([A0,A1], stacked=True)
plt.show()
现在,我希望将这两种效果结合起来:我想创建一个直方图,将数组A0,B0和C0分别绘制到这些较小的条形中,然后我希望堆叠数组A1,B1和C1的直方图分别位于A0,B0和C0的直方图上。
最好,我还要对阵列A1,B1和C1进行阴影处理,例如
plt.hist(A1, hatch='//')
A0,B0和C0只是定期填充而不是阴影线。
答案 0 :(得分:1)
一种方法是,首先为[A0+A1, B0+B1, C0+C1]
绘制分割直方图。这些条的高度将与堆叠条的高度相同。然后,在第二遍中,在同一位置绘制[A1, B1, C1]
的分割直方图。在两种情况下都使用相同的bins
是很重要的。请注意,这种方法不适用于“密度”直方图。
下面的代码使用“成对”的颜色,在较暗的版本中绘制上部,在较亮的版本中绘制下部,并用阴影线填充。
import numpy as np
from matplotlib import pyplot as plt
A0 = np.array([0,2,5,6,3,1,9,3,5,7])
B0 = np.array([5,1,6,7,3,8,2,3,4,7,1])
C0 = np.array([3,5,7,7,8,5,5,6,7,1,6])
A1 = np.array([2,2,6,7,4])
B1 = np.array([1,6,1,4,0])
C1 = np.array([5,3,3,7,0])
# bar_colors = ['C0', 'C1', 'C2']
bar_colors_0 = plt.cm.tab20c.colors[0:12:4]
bar_colors_1 = plt.cm.tab20c.colors[1:12:4]
_, bins, _ = plt.hist([np.concatenate([A0, A1]),np.concatenate([B0, B1]),np.concatenate([C0, C1])], color=bar_colors_0)
plt.hist([A1,B1,C1], bins=bins, hatch='//', color=bar_colors_1)
plt.show()