暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python数据可视化--matplotlib绘制多组柱形图与堆积柱形图

AI小白笔记 2021-11-16
5807

点击蓝字

关注我们


上节我们学习了柱形图,今天来学习柱形图的两个变形,分别是多组柱形图与堆积柱形图。


多组柱形图


多组柱形图,就是在同一个X轴的刻度中,对应多个柱子,适用于对多个类别的多方面比较,比如多个学生的多门成绩比较。


下面以2组柱形图进行举例说明。


import matplotlib.pyplot as plt 
import numpy as np
plt.rcParams['font.family']='KaiTi'
plt.figure(dpi=100)


label=['语文','数学','英语','历史']
zhang=[90,80,88,78] #张三的分数
li=[100,90,65,66]   #李四的分数
x=np.arange(len(label)) #X轴的刻度
width=0.3


plt.bar(x-width/2,zhang,width=width,label='张三')
plt.bar(x+width/2,li,width=width,label='李四')
plt.title('多组柱形图')
plt.legend()
plt.grid(axis='y',alpha=0.4,ls='--')
plt.xticks(x,label)
plt.show()



代码第9行先求列表label的长度,结果是4,再生成一个0~3的数组,用于标记X轴的刻度。


因为每个X轴的刻度对两组柱形,为了能使X轴的刻度标签居中对齐,左边柱子向左移动宽度的一半(x-width/2),右边柱向历移动柱子宽度的一半(x+width/2)。


第17行设置X轴的刻度,X是刻度位置,label是显示的刻度标签值,也就是在X轴的0~3共4个刻度用4个科目代替显示。


若要显示两个人各科考试成绩,还要在最后一行之前添加两个for循环。


for i,j in zip(x,zhang):
   plt.text(i-width/2,j+1,j,ha='center')
for i,j in zip(x,li):
   plt.text(i+width/2,j+1,j,ha='center')



第一个for循环显示第张三的成绩,第二个for循环显示李四的成绩,数据标签显示的位置随着柱子的左右移动而跟着一起移动。


堆积柱形图


如果说多组柱形图是左右排列,那么堆积柱形图就是上下堆叠在一起,使其更加直观地显示各部分的对比与求和。


比如以下代码生成一个堆积堆形图:


import matplotlib.pyplot as plt
import numpy as np
plt.figure(dpi=100)


x=np.arange(6)
y1=[10,9,5,3,6,3]
y2=[6,8,4,7,8,4]
label=['1月','2月','3月','4月','5月','6月']
width=0.3


plt.bar(x,y1,width=width)
plt.bar(x,y2,bottom=y1,width=width)
plt.xticks(x,label)
plt.show()



这个堆积柱形图与普通柱形图的区别就在于第12行显示第2个柱子时,将其bottom参数设置为y1,也就是第二个柱子的底部是第一个柱子的顶部,这样就起了堆积的效果。


下面添加代码对图形进行进一步的优化改善。


import matplotlib.pyplot as plt
import numpy as np
plt.figure(dpi=100)


x=np.arange(6)
y1=[10,9,5,3,6,3]
y2=[6,8,4,7,8,4]
label=['1月','2月','3月','4月','5月','6月']
width=0.3


plt.bar(x,y1,width=width,label='第一组')
plt.bar(x,y2,bottom=y1,width=width,label='第二组')
plt.legend() #显示图例
plt.title('堆积柱形图')
plt.ylim(0,19)
plt.xticks(x,label)


for i,j in zip(x,y1):
   plt.text(i,j/2,j,ha='center',color='w',fontsize=15)
for i,j,k in zip(x,y1,y2):
   plt.text(i,j+k/2,k,ha='center',color='w',fontsize=15)
for i,j,k in zip(x,y1,y2):
   plt.text(i,j+k+0.2,j+k,ha='center',color='black',fontsize=15)
   
plt.show()



假设这是某公司销售部两个组上半年业绩比较,通过这个图就一目了然。


代码唯一难点在于添加数据,总共有3个for循环,第1个for循环显示第一组数据,变量j获取的蓝色柱子的高度,所以j/2就是将数据显示在蓝色柱子高度的中间。第2个for循环显示第二组的数据,j+k/2的意思是在蓝色柱子高度的基础上加上橙色柱子高度一半的地方显示第二组数据。第3个for循环显示每个月两个组的业绩总和。



THE END


文章转载自AI小白笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论