使用matplotlib绘制并排柱状图的操作实例
这里是本际云服务器推荐网的小编小本本,今天给大家介绍如何使用matplotlib去进行绘制并排柱状图。

概念说明
柱状图(barchart)是一种表示无序或有序的定性数据间某个定量指标的大小关系的图表。从相同的横坐标出发,以不同的数值大小来设定柱子的高度。以下是一些概念说明:
- (1)在无序的横坐标情景下, 我们常常根据数值大小降序排布。
- (2)柱状图在纵坐标上可以有正有负,但必须以基准的0线开始绘制,否则会传递错误的视觉信息。
- (3)当类别间数值差异较大/类别较多/类别命名文本较长时,我们可以考虑将柱形图逆转90°,即使用条形图。
- (4)如果手中的数据是二维定性的情况,可以根据需求分别选择堆叠柱状图或者并排柱状图。
- ①堆叠柱状图:关注类0-4的大类总量的对比,同时关注小类a/b占大类的比重。
- ②并排柱状图(案例对象):更关注小类系列1-3在不同大类1-4间的对比,关注小类在大类间数值分布的差异,如果要呈现大类总量信息,可以增加折线图。
数据展示
在本案例中,我们使用python编码,利用其中matplotlib包绘制并排柱状图。需要二维定序数据,我们使用随机选的八座城市,目的是希望了解八座城市小初高学校数量对比(柱状),以及人口数情况(折线)。以下是我们的数据展示:
| 城市 | 小学 | 初中 | 高中 |
|---|---|---|---|
| 城市1 | 45 | 20 | 10 |
| 城市2 | 30 | 15 | 5 |
| 城市3 | 20 | 10 | 3 |
| 城市4 | 35 | 18 | 8 |
| 城市5 | 50 | 25 | 13 |
| 城市6 | 40 | 22 | 9 |
| 城市7 | 28 | 13 | 6 |
| 城市8 | 38 | 19 | 7 |
根据上述数据,我们可以使用以下代码将其导入:
<!--HTML格式-->
<pre>
import pandas as pd
school_num=pd.DataFrame(pd.read_excel('./小初高学校个数.xlsx'))
people_num=pd.DataFrame(pd.read_excel('./2020人口普查数据.xlsx'))
</pre>
图像绘制
接下来是我们的图像绘制过程,以下是代码和注释:
<!--HTML格式-->
<pre>
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.show()
#柱型加数字
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.show()
</pre>
注释说明:
- plt.bar(横坐标位置,柱子数值):横坐标位置一般用np.arange(横坐标类别数)得到,因此在并排中,每一个小类,都要右移窗宽个单位,如果您觉得紧挨着显得很密,也可以加0.1让它们稍稍隔开。
- plt.plot的横坐标我选择x+bar_width是因为我们有三个柱子,我希望折线的原点是对应横坐标居中显示。
- plt.text:这一部分是给整幅图加文字,但具体加在什么位置需要自己指定。
- plt.xticks(原名称,新名称)
以下是我们绘制的结果:

总结
综上所述,使用matplotlib绘制并排柱状图非常简单,只需要掌握一些基本的绘图函数和参数即可。希望这篇文章对大家有所帮助。
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/7122.html
