Matplotlib 带有 groupby 的条形图
在数据可视化中,比较常见的一种图表类型就是柱状图。而当我们需要对数据进行分组展示时,就需要用到带有 groupby 的条形图。本文将介绍如何使用 Matplotlib 绘制带有 groupby 的条形图。
阅读更多:Matplotlib 教程
准备数据
首先,我们需要准备一些数据。在本文中,我们将使用 Seaborn 提供的示例数据集 “tips”。这个数据集包含了不同顾客在不同日期和时段吃饭的信息,包括账单总额、小费金额、就餐人数、性别、是否吸烟等指标。我们将使用这个数据集来展示不同性别和是否吸烟的顾客在账单总额、小费金额、就餐人数上的表现。
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips.head())
输出结果如下:
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
在接下来的讲解中,我们将用到 “total_bill”、”tip” 和 “size” 这三个指标。
绘制带有 groupby 的条形图
我们先来看一个最简单的条形图,用来展示各种类型的鸢尾花的花萼长度和花瓣长度的平均值。
import matplotlib.pyplot as plt
import seaborn as sns
iris = sns.load_dataset("iris")
# 按照种类分组,并计算花萼长度和花瓣长度的平均值
iris_grouped = iris.groupby('species').mean()[['sepal_length', 'petal_length']]
# 绘图
iris_grouped.plot.bar()
plt.show()
我们可以看到,上面的图表展示了各种类型的鸢尾花的花萼长度和花瓣长度的平均值。其中,横轴表示鸢尾花的种类,纵轴表示平均值,每种花的平均值用一根条形图来表示。
接下来,我们看看如何用带有 groupby 的条形图展示 tips 数据集中的不同性别和是否吸烟的顾客在账单总额、小费金额、就餐人数上的表现。具体代码如下:
import matplotlib.pyplot as plt
# 按照性别和是否吸烟分组,并计算账单总额、小费金额、就餐人数的平均值
grouped = tips.groupby(["sex", "smoker"]).mean()[["total_bill", "tip", "size"]]
# 绘图
ax = grouped.plot(kind="bar", title="Tips by Gender and Smoker Status", figsize=(8, 6))
ax.set_xlabel("(Gender, Smoker Status)")
ax.set_ylabel("Amount")
plt.show()
可以看到,上面的图表展示了不同性别和是否吸烟的顾客在账单总额、小费金额、就餐人数上的表现。其中,每根条形图包含了一组数据,即账单总额、小费金额和就餐人数的平均值,分别用不同的颜色表示。每组数据由两个指标表示,即性别和是否吸烟,用横轴标识。纵轴表示平均值,其中左侧的轴表示金额,右侧的轴表示就餐人数。
添加误差线
一般情况下,柱状图的高度越高,表示这个类别的指标值越大。但有时候,我们需要将信息丰富度再提高一些。这时,我们可以使用误差线,将每组数据的标准差绘制出来。这样做可以让观察者得到更多的信息。
我们可以在上面的例子中添加误差线,代码如下:
# 绘图,添加误差线
ax = grouped.plot(kind="bar", yerr=tips.groupby(["sex", "smoker"]).std()[["total_bill", "tip", "size"]],
title="Tips by Gender and Smoker Status", figsize=(8, 6))
ax.set_xlabel("(Gender, Smoker Status)")
ax.set_ylabel("Amount")
plt.show()
可以看到,误差线向上和向下延伸的长度分别表示对应类别指标的标准差,这样的绘图更直观、更丰富。
分组并列柱状图
前面介绍的示例中,每个类别只有一个指标,因此每个类别只有一根条形图。但是,在某些情况下,我们需要同时展示多个指标,这时就需要使用分组并列柱状图。
下面的代码演示了如何用 Matplotlib 绘制分组并列柱状图:
import matplotlib.pyplot as plt
import pandas as pd
# 生成数据
data = {"Male": [5, 30, 6], "Female": [25, 32, 4]}
df = pd.DataFrame(data, index=["A", "B", "C"])
# 计算位置
x = df.index
w = 0.35
bar1 = [i-w/2 for i in range(len(x))]
bar2 = [i+w/2 for i in range(len(x))]
# 绘制图表
fig, ax = plt.subplots()
ax.bar(bar1, df["Male"], width=w, color='b', align='center', label="Male")
ax.bar(bar2, df["Female"], width=w, color='g', align='center', label="Female")
# 添加图例、标签、标题等
ax.set_xticks(range(len(x)))
ax.set_xticklabels(x)
ax.set_xlabel("Category")
ax.set_ylabel("Value")
ax.set_title("Grouped Bar Chart")
ax.legend()
plt.show()
可以看到,上面的图表展示了不同类别的 “Male” 和 “Female” 的 3 种指标的值,其中每组数据之间采用分组并列的方式展示,每组数据包含 2 根柱状图,分别用不同的颜色表示。
总结
本文介绍了如何使用 Matplotlib 绘制带有 groupby 的条形图。我们从准备数据、绘制简单的条形图,到添加误差线,再到使用分组并列柱状图,深入探讨了这一主题。通过本文的学习,希望读者能够更好地掌握条形图的绘制方法,为数据可视化打下坚实的基础。