Python绘制柱形图(超级详细,附带实例)
柱状图(Bar Chart)用于显示不同类别或组之间的比较或分布情况。它由一系列垂直的矩形柱组成,每个柱子的高度表示对应类别或组的数值大小。当柱水平排列时,又称为条形图。
柱状图的主要目的是帮助观察者直观地比较不同类别或组之间的差异、趋势或分布情况。在柱状图中,通常有以下要素:
柱状图可以根据不同的分类方式进行绘制,以展示不同类别或组之间的比较或分布情况。柱状图常见的分类包括:单一柱状图、分组柱状图、堆积柱状图、百分比柱状图、均值柱状图等。
在 Python 中,绘制柱状图最常用的库是 Matplotlib 和 Seaborn。
Matplotlib 绘制柱状图的主要函数是 plt.bar(),它接受 x 和 height 参数来指定每个柱的位置和高度。使用 plt.bar() 可以绘制简单的柱状图,通过设置参数来定制柱状图的样式、颜色和标签等。
除 plt.bar() 外,Matplotlib 还提供了其他绘制柱状图的函数,如 plt.barh()(绘制水平柱状图)、plt.hist()(绘制直方图)等。
Seaborn 中绘制柱状图的主要函数是 sns.barplot(),它可以根据数据自动计算柱状图的高度,并提供了许多参数来自定义柱状图的外观。
除 sns.barplot() 外,Seaborn 还提供了其他绘制柱状图的函数,如 sns.countplot()(绘制计数柱状图,用于统计分类变量的频数)、sns.pointplot()(绘制点线图,用于显示分类变量的平均值和置信区间)等。
【实例】采用 5 个类别及对应的值创建单一柱状图。输入如下代码:
数据框如下图所示:

图 1 数据框
输出的结果如下图所示:

图 2 单一柱状图
【实例】创建包含 5 个类别和 4 个对应的数值列的分组柱状图。输入如下代码:
图表的类型被指定为'bar',并且设置了图形大小为 (6,4)。然后,通过 Matplotlib 添加了 X 轴和 Y 轴的标签、图表的标题以及图例,其中图例的标题为 'Values'。
数据框如下图所示:

图 3 数据框
输出的结果如下图所示:

图 4 分组柱状图
【实例】创建包含 5 个类别和 4 个对应的数值列的堆积柱状图。输入如下代码:

图 5 堆积柱状图
【实例】创建包含 5 个类别和 4 个对应的数值列的百分比柱状图。输入如下代码:
输出的结果如下图所示:

图 6 百分比柱状图
【实例】创建包含 5 个类别和 4 个对应的数值列的均值柱状图。输入如下代码:
输出的结果如下图所示:

图 7 均值柱状图
不等宽柱状图的宽度表示了另一个维度的信息,这可以是某个连续变量、离散变量或者数据的权重。通过使用不等宽柱状图,可以更直观地展示柱形之间的差异。
【实例】创建包含 5 个类别和 5 个对应的值及宽度值的不等宽柱状图。输入如下代码:
数据框如下图所示:

图 8 数据框
输出的结果如下图所示:

图 9 不等宽柱状图
柱状图的主要目的是帮助观察者直观地比较不同类别或组之间的差异、趋势或分布情况。在柱状图中,通常有以下要素:
- X 轴(水平轴):用于表示不同的类别或组。每个柱子通常对应一个类别。
- Y 轴(垂直轴):用于表示数值的大小或数量。Y 轴可以表示各种度量,如计数、百分比、频率等,具体取决于数据类型和分析目的。
- 柱子(矩形条):每个柱子的高度代表相应类别或组的数值大小。柱子的宽度可以是固定的,也可以是可调整的。
- 填充颜色:柱子可以使用不同的填充颜色来区分不同的类别或组。颜色选择可以根据需要进行调整,以提高可读性或强调特定的类别。
柱状图可以根据不同的分类方式进行绘制,以展示不同类别或组之间的比较或分布情况。柱状图常见的分类包括:单一柱状图、分组柱状图、堆积柱状图、百分比柱状图、均值柱状图等。
在 Python 中,绘制柱状图最常用的库是 Matplotlib 和 Seaborn。
Matplotlib 绘制柱状图的主要函数是 plt.bar(),它接受 x 和 height 参数来指定每个柱的位置和高度。使用 plt.bar() 可以绘制简单的柱状图,通过设置参数来定制柱状图的样式、颜色和标签等。
除 plt.bar() 外,Matplotlib 还提供了其他绘制柱状图的函数,如 plt.barh()(绘制水平柱状图)、plt.hist()(绘制直方图)等。
Seaborn 中绘制柱状图的主要函数是 sns.barplot(),它可以根据数据自动计算柱状图的高度,并提供了许多参数来自定义柱状图的外观。
除 sns.barplot() 外,Seaborn 还提供了其他绘制柱状图的函数,如 sns.countplot()(绘制计数柱状图,用于统计分类变量的频数)、sns.pointplot()(绘制点线图,用于显示分类变量的平均值和置信区间)等。
Python绘制单一柱状图
在单一柱状图中,每个柱子代表一个类别或组,并显示该类别或组的数值。这种柱状图通常用于表示不同类别之间的数量或大小差异。【实例】采用 5 个类别及对应的值创建单一柱状图。输入如下代码:
import pandas as pd # 导入 Pandas 库并简写为 pd import matplotlib.pyplot as plt # 导入 matplotlib.pyplot 模块并简写为 plt # 自定义数据集 data = pd.DataFrame({'category': ["A", "B", "C", "D", "E"], 'value': [10, 15, 7, 12, 8]}) # 创建一个包含类别和值的 DataFrame # 查看数据结构 print("数据结构:") print(data) # 输出 # 创建单一柱状图 plt.figure(figsize=(6, 4)) # 创建图形对象,并设置图形大小 plt.bar(data['category'], data['value'], color='steelblue') # 绘制柱状图,指定 X 轴为类别,Y 轴为值,柱状颜色为钢蓝色 plt.xlabel('Category') # 设置 X 轴标签 plt.ylabel('Value') # 设置 Y 轴标签 plt.title('Single Bar Chart') # 设置图表标题 # 添加网格线,采用虚线,设置为灰色,透明度为 0.5 plt.grid(linestyle='--', color='gray', alpha=0.5) plt.show()上述代码使用 Pandas 和 Matplotlib 库绘制了一个简单的单一柱状图:
- 首先,使用 Pandas 创建了一个包含类别和值的 DataFrame;
- 然后,使用 Matplotlib 绘制了柱状图,指定了 X 轴为类别、Y 轴为值,柱状颜色为钢蓝色,并添加了标签和标题;
- 最后,通过 plt.grid() 函数添加了网格线。
数据框如下图所示:

图 1 数据框
输出的结果如下图所示:

图 2 单一柱状图
Python绘制分组柱状图
分组柱状图将不同类别或组的柱子并排显示,以便直观比较它们之间的差异。每个类别或组可以由不同颜色的柱子表示,使得观察者可以快速识别不同类别或组的数值。【实例】创建包含 5 个类别和 4 个对应的数值列的分组柱状图。输入如下代码:
import pandas as pd # 导入 Pandas 库并简写为 pd import matplotlib.pyplot as plt # 导入 matplotlib.pyplot 模块并简写为 plt # 自定义一个包含多列数据的数据框 DataFrame,包含类别和多列值 data = pd.DataFrame({'category': ["A", "B", "C", "D", "E"], 'value1': [10, 15, 7, 12, 8], 'value2': [6, 9, 5, 8, 4], 'value3': [3, 5, 2, 4, 6], 'value4': [9, 6, 8, 3, 5]}) # 查看数据框 print("Data Structure: ") print(data) # 输出 # 创建分组柱状图 data.plot(x='category', kind='bar', figsize=(6, 4)) # 使用 DataFrame 的 plot() 方法绘制分组柱状图 # 指定 X 轴为 'category' 列,图表类型为 'bar',图形大小为 (6,4) plt.xlabel('Category') # 设置 X 轴标签 plt.xticks(rotation=0) # 旋转 X 轴文本,使其水平显示 plt.ylabel('Value') # 设置 Y 轴标签 plt.title('Grouped Bar Chart') # 设置图表标题 plt.legend(title='Values') # 添加图例,并设置标题为 'Values' plt.show()上述代码创建了一个包含多列数据的 DataFrame,并使用 DataFrame 的 plot() 方法绘制了一个分组柱状图。DataFrame 中的每一列都代表一个值,而 X 轴则是 'category' 列。
图表的类型被指定为'bar',并且设置了图形大小为 (6,4)。然后,通过 Matplotlib 添加了 X 轴和 Y 轴的标签、图表的标题以及图例,其中图例的标题为 'Values'。
数据框如下图所示:

图 3 数据框
输出的结果如下图所示:

图 4 分组柱状图
Python绘制堆积柱状图
堆积柱状图将不同类别或组的柱子叠加显示,以显示整体和各个部分的关系。每个柱子的高度表示该类别或组的总数值,而不同颜色的部分表示该类别或组在总数值中的占比。【实例】创建包含 5 个类别和 4 个对应的数值列的堆积柱状图。输入如下代码:
# 续上例,将 'category' 列设置为索引,并创建堆积柱状图 data.set_index('category').plot(kind='bar', stacked=True, figsize=(6, 4)) plt.xlabel('Category') # 设置 X 轴标签 plt.ylabel('Value') # 设置 Y 轴标签 plt.title('Stacked Bar Chart') # 设置图表标题 plt.xticks(rotation=0) # 旋转 X 轴文本,使其水平显示 # 添加图例,并设置标题为 'Values',并放置在图的右侧 plt.legend(title='Values', loc='center left', bbox_to_anchor=(1, 0.5)) plt.show()上述代码将 'category' 列设置为索引,并使用 DataFrame 的 plot() 方法绘制了一个堆积柱状图。堆积模式被设置为 True,这意味着每个类别的不同值将堆叠在一起。然后,通过 Matplotlib 添加了 X 轴和 Y 轴的标签、图表的标题以及图例,其中图例的标题为 'Values',并且放置在图的右侧。输出的结果如下图所示。

图 5 堆积柱状图
Python绘制百分比柱状图
百分比柱状图是一种堆积柱状图的变体,用于显示各个类别或组在整体中的百分比。每个柱子的高度表示整体的百分比,而不同颜色的部分表示各个类别或组的相对百分比。【实例】创建包含 5 个类别和 4 个对应的数值列的百分比柱状图。输入如下代码:
# 续上例,创建百分比柱状图 # 复制数据集到新的 DataFrame,以便进行百分比计算 data_percentage = data.copy() # 计算每个数值列的百分比,除以每行的总和并乘以 100 data_percentage.iloc[:, 1:] = data_percentage.iloc[:, 1:] / data_percentage.iloc[:, 1:].sum(axis=1) * 100 data_percentage.set_index('category').plot(kind='bar', stacked=True, figsize=(6, 4)) # 创建百分比堆叠柱状图,设置索引为 'category' 列 # 图表类型为 'bar',堆积模式为 True,图形大小为 (6, 4) plt.xlabel('Category') # 设置 X 轴标签 plt.ylabel('Percentage') # 设置 Y 轴标签 plt.title('Percentage Stacked Bar Chart') # 设置图表标题 plt.xticks(rotation=0) # 旋转 X 轴文本,使其水平显示 # 添加图例,并设置标题为 'Values',并放置在图的右侧 plt.legend(title='Values', loc='center left', bbox_to_anchor=(1, 0.5)) plt.show()上述代码在之前的基础上创建了一个百分比堆叠柱状图:
- 首先,复制原始数据集到一个新的 DataFrame;
- 然后计算了每个数值列的百分比,方法是将每个值除以该行的总和,并乘以 100;
- 接着,使用 plot() 方法绘制了堆积柱状图,设置了索引为 'category' 列,图表类型为 'bar',堆积模式为 True,并将图形大小设置为 (6,4);
- 最后,添加了 X 轴标签、Y 轴标签、图表标题和图例,其中图例的标题为 'Values',并放置在图的右侧。
输出的结果如下图所示:

图 6 百分比柱状图
Python绘制均值柱状图
均值柱状图将不同类别或组的均值以柱子的高度表示,同时可使用误差线或置信区间来表示变异范围。这种柱状图通常用于比较均值差异或展示数据的中心趋势。【实例】创建包含 5 个类别和 4 个对应的数值列的均值柱状图。输入如下代码:
import pandas as pd # 导入 Pandas 库并简写为 pd import matplotlib.pyplot as plt # 导入 matplotlib.pyplot 模块并简写为 plt import seaborn as sns # 导入 Seaborn 库并简写为 sns # 创建一个包含类别、值和标准差的 DataFrame 数据集 data = pd.DataFrame({'category': ["A", "B", "C", "D", "E"], 'value': [10, 15, 7, 12, 8], 'std': [1, 2, 1.5, 1.2, 2.5]}) # 计算每个类别的均值和标准差 mean_values = data['value'] std_values = data['std'] colors = sns.color_palette("Set1", n_colors=len(data)) # 创建颜色调色板 # 创建均值柱状图 plt.figure(figsize=(6, 4)) # 创建图形对象,并设置图形大小 bars = plt.bar(data['category'], mean_values, color=colors) # 绘制柱状图,指定 X 轴为类别,Y 轴为均值,柱状颜色为颜色调色板中的颜色 # 添加误差线 for i, (bar, std) in enumerate(zip(bars, std_values)): plt.errorbar(bar.get_x() + bar.get_width() / 2, bar.get_height(), # 在柱状图的中心位置添加误差线 yerr=std, fmt='none', color='black', ecolor='gray', # 设置误差线的样式和颜色 capsize=5, capthick=2) # 设置误差线的帽子大小和线宽 # 添加标题和标签 plt.xlabel('Category') # 设置 X 轴标签 plt.ylabel('Mean Value') # 设置 Y 轴标签 plt.title('Mean Bar Chart with Error Bars') # 设置图表标题 # 设置网格线的样式、颜色和透明度 plt.grid(axis='both', linestyle='--', color='gray', alpha=0.5) plt.show()上述代码绘制了一个带有误差条的均值柱状图:
- 首先,创建了一个包含类别、值和标准差的 DataFrame 数据集;
- 然后,计算了每个类别的均值和标准差;
- 接着,使用 Seaborn 库创建了一个颜色调色板,并将其用于绘制柱状图的颜色。在绘制柱状图后,通过循环遍历每个柱子,并使用 errorbar() 函数添加了误差线。
- 最后,添加了 X 轴标签、Y 轴标签、图表标题,并设置了网格线的样式、颜色和透明度。
输出的结果如下图所示:

图 7 均值柱状图
Python绘制不等宽柱状图
不等宽柱状图中每个柱形的宽度不相等,而是根据某个变量的值来确定的。较大的数值对应的柱形宽度较宽,而较小的数值对应的柱形宽度较窄。不等宽柱状图的宽度表示了另一个维度的信息,这可以是某个连续变量、离散变量或者数据的权重。通过使用不等宽柱状图,可以更直观地展示柱形之间的差异。
【实例】创建包含 5 个类别和 5 个对应的值及宽度值的不等宽柱状图。输入如下代码:
import pandas as pd import matplotlib.pyplot as plt # 创建数据集 data=pd.DataFrame({'category':['A',"B","C","D","E"], 'value':[10,15,7,12,8], 'width':[0.8,0.4,1.0,0.5,0.9]}) print(" 数据结构: "),print(data) # 查看数据框 # 自定义颜色列表,每个柱子使用不同的配色 colors=['red','green','blue','orange','purple'] # 创建不等宽柱状图 plt.figure(figsize=(6,4)) for i in range(len(data)): plt.bar(data['category'][i],data['value'][i], width=data['width'][i],color=colors[i]) # 添加标题和标签 plt.xlabel('Category') plt.ylabel('Value') plt.title('Unequal Width Bar Chart') # 设置网格线 plt.grid(axis='both',linestyle='-',color='gray',alpha=0.5) plt.show()上述代码创建了一个不等宽柱状图:
- 首先,创建了一个包含类别、值和柱子宽度的 DataFrame 数据集;
- 然后,定义了一个颜色列表,用于为每个柱子指定不同的颜色;
- 接着,使用循环遍历数据集中的每一行,并根据每行的类别、值和宽度绘制了柱状图;
- 最后,添加了 X 轴标签、Y 轴标签、图表标题,并设置了网格线的样式、颜色和透明度。
数据框如下图所示:

图 8 数据框
输出的结果如下图所示:

图 9 不等宽柱状图