如何从列表创建分组条形图
How to create a grouped bar plot from lists
- 我正在尝试绘制条形图,比较 2 种不同情况下多个项目的数量。
- 所需的输出将是一个条形图,其中有 4+4 = 8 个条,彼此相邻,表示每种情况下每种类型的数量。
- 这是我写的初始代码,它没有达到我的预期。我该如何修改它?
import numpy
import matplotlib.pyplot as plt
names = ["a","b","c","d"]
case1 = [5,7,5,6]
case2 = [7,4,8,5]
plt.hist(case1)
plt.show()
- 最简单的方法是用 pandas 创建数据框,然后用
pandas.DataFrame.plot
绘图
- 在这种情况下,数据帧索引
'names'
自动用于 x 轴,列绘制为条形图。
matplotlib
用作绘图后端
- 在
python 3.8
、pandas 1.3.1
和 matplotlib 3.4.2
中测试
- 有关长度不等的列表,请参阅
import pandas as pd
import matplotlib.pyplot as plt
names = ["a","b","c","d"]
case1 = [5,7,5,6]
case2 = [7,4,8,5]
# create the dataframe
df = pd.DataFrame({'c1': case1, 'c2': case2}, index=names)
# display(df)
c1 c2
a 5 7
b 7 4
c 5 8
d 6 5
# plot
ax = df.plot(kind='bar', figsize=(6, 4), rot=0, title='Case Comparison', ylabel='Values')
plt.show()
- 为
python 2.7
尝试以下操作
fig, ax = plt.subplots(figsize=(6, 4))
df.plot.bar(ax=ax, rot=0)
ax.set(ylabel='Values')
plt.show()
可以通过code适应您的问题来实现。
# importing pandas library
import pandas as pd
# import matplotlib library
import matplotlib.pyplot as plt
# creating dataframe
df = pd.DataFrame({
'Names': ["a","b","c","d"],
'Case1': [5,7,5,6],
'Case2': [7,4,8,5]
})
# plotting graph
df.plot(x="Names", y=["Case1", "Case2"], kind="bar")
仅限 Matplotlib(加上 numpy.arange
)。
如果您考虑一下,就很容易正确放置条形图组。
import matplotlib.pyplot as plt
from numpy import arange
places = ["Nujiang Lisu","Chuxiong Yi","Liangshan Yi","Dehong Dai & Jingpo"]
animals = ['Pandas', 'Snow Leopards']
n_places = len(places)
n_animals = len(animals)
animals_in_place = [[5,7,5,6],[7,4,8,5]]
### prepare for grouping the bars
total_width = 0.5 # 0 ≤ total_width ≤ 1
d = 0.1 # gap between bars, as a fraction of the bar width, 0 ≤ d ≤ ∞
width = total_width/(n_animals+(n_animals-1)*d)
offset = -total_width/2
### plot
x = arange(n_places)
fig, ax = plt.subplots()
for animal, data in zip(animals, animals_in_place):
ax.bar(x+offset, data, width, align='edge', label=animal)
offset += (1+d)*width
ax.set_xticks(x) ; ax.set_xticklabels(places)
fig.legend()
- 我正在尝试绘制条形图,比较 2 种不同情况下多个项目的数量。
- 所需的输出将是一个条形图,其中有 4+4 = 8 个条,彼此相邻,表示每种情况下每种类型的数量。
- 这是我写的初始代码,它没有达到我的预期。我该如何修改它?
import numpy
import matplotlib.pyplot as plt
names = ["a","b","c","d"]
case1 = [5,7,5,6]
case2 = [7,4,8,5]
plt.hist(case1)
plt.show()
- 最简单的方法是用 pandas 创建数据框,然后用
pandas.DataFrame.plot
绘图- 在这种情况下,数据帧索引
'names'
自动用于 x 轴,列绘制为条形图。 matplotlib
用作绘图后端
- 在这种情况下,数据帧索引
- 在
python 3.8
、pandas 1.3.1
和matplotlib 3.4.2
中测试
- 有关长度不等的列表,请参阅
import pandas as pd
import matplotlib.pyplot as plt
names = ["a","b","c","d"]
case1 = [5,7,5,6]
case2 = [7,4,8,5]
# create the dataframe
df = pd.DataFrame({'c1': case1, 'c2': case2}, index=names)
# display(df)
c1 c2
a 5 7
b 7 4
c 5 8
d 6 5
# plot
ax = df.plot(kind='bar', figsize=(6, 4), rot=0, title='Case Comparison', ylabel='Values')
plt.show()
- 为
python 2.7
尝试以下操作
fig, ax = plt.subplots(figsize=(6, 4))
df.plot.bar(ax=ax, rot=0)
ax.set(ylabel='Values')
plt.show()
可以通过code适应您的问题来实现。
# importing pandas library
import pandas as pd
# import matplotlib library
import matplotlib.pyplot as plt
# creating dataframe
df = pd.DataFrame({
'Names': ["a","b","c","d"],
'Case1': [5,7,5,6],
'Case2': [7,4,8,5]
})
# plotting graph
df.plot(x="Names", y=["Case1", "Case2"], kind="bar")
仅限 Matplotlib(加上 numpy.arange
)。
如果您考虑一下,就很容易正确放置条形图组。
import matplotlib.pyplot as plt
from numpy import arange
places = ["Nujiang Lisu","Chuxiong Yi","Liangshan Yi","Dehong Dai & Jingpo"]
animals = ['Pandas', 'Snow Leopards']
n_places = len(places)
n_animals = len(animals)
animals_in_place = [[5,7,5,6],[7,4,8,5]]
### prepare for grouping the bars
total_width = 0.5 # 0 ≤ total_width ≤ 1
d = 0.1 # gap between bars, as a fraction of the bar width, 0 ≤ d ≤ ∞
width = total_width/(n_animals+(n_animals-1)*d)
offset = -total_width/2
### plot
x = arange(n_places)
fig, ax = plt.subplots()
for animal, data in zip(animals, animals_in_place):
ax.bar(x+offset, data, width, align='edge', label=animal)
offset += (1+d)*width
ax.set_xticks(x) ; ax.set_xticklabels(places)
fig.legend()