Python Matplotlib实战:绘制并排柱状图与人口折线图
本文详解如何使用Python的Matplotlib库绘制并排柱状图,通过八座城市的小初高学校数量对比案例,结合人口折线图展示多维数据。文章涵盖数据准备、坐标轴设置、颜色区分及标签添加等关键步骤,帮助读者掌握二维定性数据的可视化技巧。
一、概念说明
柱状图(bar chart)是一种通过从相同横坐标出发,依据不同数值设定柱子高度,来展示无序或有序定性数据中某个定量指标大小关系的图表类型。
示意图如下:

(1) 在横坐标无序的情况下,通常建议根据数值大小进行降序排列。
(2) 柱状图的纵坐标可以包含正值和负值,但绘图时必须以基准的0线为起点,否则会产生误导性的视觉信息。
(3) 当类别间数值差异巨大、类别数量较多或类别名称文本较长时,建议将柱形图旋转90度,即改用条形图(bar chart的横向版本)。
(4) 若数据呈现二维定性特征,可根据具体需求选择堆叠柱状图或并排柱状图。
①堆叠柱状图:

--- 侧重于对比类0-4的大类总量。
--- 同时关注小类a/b在大类中的占比情况。
② 并排柱状图(本文案例对象)

--- 更侧重于对比小类系列1-3在不同大类1-4之间的差异。
--- 关注小类在不同大类间的数值分布差异。
--- 若需呈现大类总量信息,可额外叠加折线图。
二、数据展示
在本案例中,我们旨在使用Python编码,借助matplotlib包绘制并排柱状图,因此需要准备二维定序数据。
延续专栏其他案例的风格,我们继续使用随机选取的八座城市数据,目的是对比这八座城市小、初、高学校的数量(柱状图展示),以及人口数量情况(折线图展示)。
遵循“统计公报中有则记录,无则通过百度查询”的原则,整理出以下仅供绘图使用的数据。


上述Excel表格中的数据分别存储,利用以下代码将其导入Python环境。
import pandas as pd
school_num = pd.DataFrame(pd.read_excel('./小初高学校个数.xlsx'))
people_num = pd.DataFrame(pd.read_excel('./2020人口普查数据.xlsx'))三、图像绘制
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
# 中文和正负号设置
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
x = np.arange(8)
bar_width = 0.3
tick_label = school_num['城市']
plt.figure(figsize=(13,7))
# 柱状
plt.bar(x, school_num['小学'], bar_width, align="center", color="#2bb179", label='小学', alpha=0.5)
plt.bar(x+bar_width, school_num['初中'], bar_width, color="b", align="center", label="初中", alpha=0.5)
plt.bar(x+bar_width*2, school_num['高中'], bar_width, color="orange", align="center", label="高中", alpha=0.5)
# 折线
plt.plot(x+bar_width, people_num['人数-万'], color="#ff796c", marker='o', lw=2,label='人口普查数(万)')
text_x = [x,x+bar_width,x+bar_width*2]
text_x = [text_x[i][j] for i in range(3) for j in range(8) ]
text_y = [school_num['小学'],school_num['初中'],school_num['高中']]
text_y = [text_y[i][j] for i in range(3) for j in range(8) ]
plt.xticks(x+bar_width, tick_label,fontsize=18)
plt.yticks(fontsize=18)
plt.xlabel("城市",fontsize=20)
plt.ylabel("学校数量",fontsize=20)
plt.legend(fontsize=16)
plt.grid()
# 柱型加数字
for x,y,text in zip(text_x,text_y,text_y):
plt.text(x-0.12,y+15,str(text),fontsize=12)
# plt.savefig(r'./并排柱状图示例.png')plt.bar(横坐标位置,柱子数值):横坐标位置通常使用np.arange(横坐标类别数)获取。在并排柱状图中,每个小类需向右移动一个窗宽单位;若觉得柱子紧挨着显得拥挤,也可增加0.1的间距使其稍作隔开。
plt.plot的横坐标选择x+bar_width,是因为我们有三个柱子,希望折线的原点能对应横坐标居中显示。
plt.text:此部分用于为整幅图添加文字说明,但具体位置需自行指定。
plt.xticks(原名称,新名称)。
绘制结果:

希望对您有所帮助~
总结
到此这篇关于使用matplotlib绘制并排柱状图的文章就介绍到这了,更多相关matplotlib绘制并排柱状图内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













