本文为Matplotlib柱状图系列基础柱状图绘制的第三篇文章,主要将讲解如何绘制分组柱状图。
基础柱状图-007
下面我们就来讲解如何绘制第一个分组柱状图,我们以两系列分组柱状图为例。注意,代码在以下环境全部通过测试:
Python
== 3.7.1matplotlib
== 3.0.2pandas
== 0.23.4numpy
== 1.15.4
因版本不同,可能会有部分语法差异,如有报错,请先检查拼写及版本是否一致!
首先导入相关库
import matplotlib
print(matplotlib.__version__) #查看Matplotlib版本
import pandas as pd
print(pd.__version__) #查看pandas版本
import numpy as np
print(np.__version__) #查看numpy版本
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #设置中文
和以前一样,我们先创建一组简单的数据
x = np.array(list(range(7)))
y1 = [7,6,5,4,3,2,1]
y2 = [6,2,3,3,1,1,0.5]
接下来很关键的是,其实分组柱状图,就是在同一个画布上,先绘制一个柱状图,然后再绘制一个柱状图,让第二个柱状图的每根柱子放在第一根柱子的某一侧就行了,就这么简单!所以我们需要设置这个偏移量如下
width = 0.4
x = x - 0.2
现在就可以和以前一样,创建一个画布,并绘制柱状图
plt.figure(figsize=(9,6))
plt.bar(x, y1, width=width, label='系列1',edgecolor = 'black',alpha = 0.7)
plt.bar(x + width, y2, width=width, label='系列2',edgecolor = 'black')
接下来就是修改X轴、添加标题等修饰,最终完整代码和效果如下
x = np.array(list(range(7)))
y1 = [7,6,5,4,3,2,1]
y2 = [6,2,3,3,1,1,0.5]
width = 0.4
x = x - 0.2
plt.figure(figsize=(9,6))
plt.bar(x, y1, width=width, label='系列1',edgecolor = 'black',alpha = 0.7)
plt.bar(x + width, y2, width=width, label='系列2',edgecolor = 'black')
plt.xticks(x + 0.2,['周一', '周二', '周三', '周四', '周五', '周六', '周日'])
plt.legend(loc=1,fontsize=13) # 设置图例位置
plt.ylabel('我是Y轴',fontsize=15)
plt.xlabel('我是X轴',fontsize=15)
plt.title("基础柱状图——分组柱状图",fontsize=17)
plt.show()
基础柱状图-008
在上面学会了如何制作分组柱状图之后,我们来给每个柱子添加数值来更具体的展示差异!
其实和基础柱状图第二篇中的添加百分比类似,就是利用plt.text来往画布上添加文字
最重要的就是计算每个文字的位置,之后循环写入即可,所以只需要在上一幅的基础下,在plt.show()
之前添加下面代码即可
for a, b in zip(x,y1):
plt.text(a, b+0.1, b, ha='center', va='bottom',fontsize = 14)
for a,b in zip(x,y2):
plt.text(a+width, b+0.1, b, ha='center', va='bottom',fontsize = 14)
基础柱状图-009
最后是水平分组柱状图的制作方法,水平在上一篇有讲,本篇就不再展开讲解,下面是完整代码!
x = np.array([1,2,3,4,5,6,7])
y1 = [7,5,3,4,3,2,1]
y2 = [6,2,6,3,1,1,0.5]
names = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
width = 0.4
fig, ax = plt.subplots(figsize=(9,6))
ax.barh(x, y1, width, label='系列1',edgecolor = 'black',alpha = 0.7)
ax.barh(x + width, y2, width, label='系列2',edgecolor = 'black',color = 'deeppink',alpha = 0.7)
ax.set(yticks=x + 0.2, yticklabels=names, ylim=[0.5, 8])
ax.set_title("基础柱状图——分组柱状图——水平",fontsize = 16)
ax.set_xlabel('我是X轴',fontsize=15)
ax.set_ylabel('我是Y轴',fontsize=15)
ax.legend(fontsize = 14)
for i in range(len(x)):
plt.text(y1[i]+0.1,x[i]-0.1,y1[i],fontsize = 12)
plt.text(y2[i]+0.1,x[i]+0.3,y2[i],fontsize = 12)
plt.show()
好了,基础柱状图第三篇到这里就结束了,对于本篇内容有任何问题欢迎也请一定给我留言,谢谢!
-END-