【问题标题】:Make histograms bars for each label one bar beside another为每个标签制作直方图条形图
【发布时间】:2018-07-20 11:20:32
【问题描述】:

我想用条形图制作一个直方图,其中每个条形图都设置在同一个标​​签的另一个条形图旁边。 从@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()

【问题讨论】:

  • 正如我在之前的评论中所说,您需要将plt.plot 替换为plt.bar
  • @ImportanceOfBeingErnest,当我用 plt.bar() 替换 plt.plot() 时,我得到一个堆积条。但是我正在为每个列表寻找一个栏。例如,在 A l 需要获得两个 bar ,第一个用于 list1,另一个用于 list2(一个挨着另一个)
  • 因为如果 list1 中 A 的元素数量远高于 list2 中 A 的元素数量,假设 list1 中为 100,list2 中为 1,则不会出现 list2 的栏
  • 这些条不是堆叠的,而是重叠的,因为您将它们定义为在相同的位置。也许你用 actual 问题更新你的问题。
  • 感谢您的细微差别。我绝对希望他们彼此相邻

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


【解决方案1】:

您已达到 matplotlib 分类图当前可以执行的限制(从 2.1 版开始)。因为每个类别在坐标轴上都有固定的位置,所以条形会重叠。

替代方案:

Seaborn 和熊猫

您可以使用 seaborn 计数图。

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()

移动条形

使用 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()

【讨论】:

  • 很棒的答案。谢谢
猜你喜欢
  • 2017-08-28
  • 2014-09-29
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 2020-05-28
  • 2016-05-24
  • 1970-01-01
  • 2021-07-20
相关资源
最近更新 更多