为每个标签制作直方图条,一个条并排
Make histograms bars for each label one bar beside another
我想用条形图制作一个直方图,其中每个条形图都设置在同一标签的另一个条形图旁边。
从@ImportanceOfBeingErnest 回答的 我想用我们有一组标签和两个列表的条形图制作直方图。例如,对于五个标签,我需要为每个标签获取 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()
您达到了 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()
移动条形图
使用 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()
我想用条形图制作一个直方图,其中每个条形图都设置在同一标签的另一个条形图旁边。
从@ImportanceOfBeingErnest 回答的
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()
您达到了 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()
移动条形图
使用 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()