将每个标签的直方图条形成为另一个旁边的条形条

时间:2018-02-09 16:22:20

标签: python-3.x matplotlib plot histogram bins

我想用条形图进行直方图,其中每个条形图设置在另一个条形图旁边,用于相同的labem。 从@ImportanceOfBeingErnest回答的post我想用条形图进行直方图,其中我们有一组标签和两个列表。例如,对于五个标签,我需要为每个标签获得2个条形(第一个用于list1,第二个用于list2)这是原始代码。

   from collections import Counter
   import matplotlib.pyplot as plt
   list1 = list("ABADEAABEDDA3EDBBBBBDG") # letters A, B, D, E, G
   list2 = list("HAABAEEDCCFFFGEDABEEC")  # all letters A-F, G,H
   items1, counts1 = zip(*sorted(Counter(list1).items()))
   items2, counts2 = zip(*sorted(Counter(list2).items()))
   plt.bar(items1+items2, [5]*len(items1+items2), visible=False)
   plt.bar(items1, counts1, label="list1")
   plt.bar(items2, counts2, label="list2")
   plt.legend()
   plt.show()

1 个答案:

答案 0 :(得分:1)

您达到了matplotlib分类图当前可以执行的限制(从版本2.1开始)。由于每个类别在轴上都有固定位置,因此条形图将重叠。

备选方案:

Seaborn和pandas

您可以使用seaborn countplot。

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

list1 = list("ABADEAABEDDAEDBBBBBD")
list2 = list("AABAEEDCCFFFEDABEEC")

df = pd.DataFrame({"item" : list1+list2, 
                  "implementation" : [0]*len(list1) + [1]*len(list2)})

sns.countplot(data=df, x="item", hue="implementation")

plt.show()

enter image description here

转移栏杆

使用Affine2D翻译,您可以向左右移动条形图。

from collections import Counter

list1 = list("ABADEAABEDDAEDBBBBBD")
list2 = list("AABAEEDCCFFFEDABEEC")

items1, counts1 = zip(*sorted(Counter(list1).items()))
items2, counts2 = zip(*sorted(Counter(list2).items()))


import matplotlib.pyplot as plt
import matplotlib.transforms

plt.plot(items1+items2, [5]*len(items1+items2), visible=False)

trans1 = matplotlib.transforms.Affine2D().translate(-0.2,0)
trans2 = matplotlib.transforms.Affine2D().translate(+0.2,0)

plt.bar(items1, counts1, label="list1", width=0.4, transform=trans1+plt.gca().transData)
plt.bar(items2, counts2, label="list2", width=0.4, transform=trans2+plt.gca().transData)
plt.legend()
plt.show()

enter image description here