这期博客,我们来学习一下,如何使用python的matplotlib绘制动态的柱状图,机缘巧合之后,导师非让我替他绘制一个动态的柱状图,然后在导师一天的在线督促下,我速成了一下这个动态柱状图,在这里把代码和方法开源出来,万一以后大家的导师也让画,可以直接复制代码改改就能跑了。
- 竖着的柱状图绘图代码:
- 横着的柱状图绘图代码:
以上海疫情的发展为例,先将疫情的发展数字做成excel表格,然后用python读取数据,横坐标 和 纵坐标分别问新增确认人数和新增无症状人数,动态的变量为日期。
B站视频演示链接
如何使用matplotlib绘制动态柱状图-python_哔哩哔哩_bilibili
总体思路很简单,动态的意义是延时输出新图片,我们将这个日期作为第三维的时间变量,不停的进行延时更新图片进行输出,即可得到动态的可视化效果。
延时的和核心代码,在这里:
data是第三维的动态变量,plt.pause是延时,每次图片存在的时间
date = ['2022年3月4日', '2022年3月5日', '2022年3月6日', '2022年3月7日',
'2022年3月8日', '2022年3月9日', '2022年3月10日', '2022年3月11日', '2022年3月12日',
'2022年3月13日', '2022年3月14日', '2022年3月15日', '2022年3月16日','2022年3月17日',
'2022年3月18日','2022年3月19日', '2022年3月20日', '2022年3月21日',
'2022年3月22日', '2022年3月23日', '2022年3月24日', '2022年3月25日', '2022年3月26日', '2022年3月27日',
'2022年3月28日', '2022年3月29日', '2022年3月30日', '2022年3月31日', '2022年4月1日'
,'2022年4月2日', '2022年4月3日', '2022年4月4日'
, '2022年4月5日', '2022年4月6日', '2022年4月7日']
for i in range(35):#动态的意义是延时输出图片
plt.pause(0.1) #延时,每次图片播放的时间填多少就是多少,单位为秒
plt.show()
还有这个清除函数很重要,你需要要清除之前的才能画新的,不然会乱。
plt.cla()#清除当前的图片,重新画新的
除了这两个是关键的,其他的代码就都是画图的常规代码了,看不懂的直接百度就行了。
横向动态柱状图:
纵向柱状图:
主要是CSDN不能上传视频到博客,做成的GIF动图效果又差的一批,那我这里把动态的视频放到我的B站,大家看效果可以点击链接直接观看。一般都是用python做好动态图,然后录屏再做成GIF动图,不过当日我导师要的是视频,然后让我剪辑加上音乐的。
B站视频演示链接
如何使用matplotlib绘制动态柱状图-python_哔哩哔哩_bilibili
首先是我采集的数据:
后来发现数据这样排列,不例如python的提取,我就稍微修改了一下,去掉了title,改成了如下的样子,方便我们使用pandas库进行提取。
竖着的柱状图绘图代码:
import pandas as pd
from matplotlib import pyplot as plt
df1 = pd.read_excel("data - 1.xlsx")#从文件夹提取我们需要的内容
# print(df1) #打印出来看看
date = df1['日期'] #提取的抬头
y1 = df1['新增确诊人数']
y2 = df1['新增无症状人数']
y3 = df1['治愈人数']
date = ['2022年3月4日', '2022年3月5日', '2022年3月6日', '2022年3月7日',
'2022年3月8日', '2022年3月9日', '2022年3月10日', '2022年3月11日', '2022年3月12日',
'2022年3月13日', '2022年3月14日', '2022年3月15日', '2022年3月16日','2022年3月17日',
'2022年3月18日','2022年3月19日', '2022年3月20日', '2022年3月21日',
'2022年3月22日', '2022年3月23日', '2022年3月24日', '2022年3月25日', '2022年3月26日', '2022年3月27日',
'2022年3月28日', '2022年3月29日', '2022年3月30日', '2022年3月31日', '2022年4月1日'
,'2022年4月2日', '2022年4月3日', '2022年4月4日'
, '2022年4月5日', '2022年4月6日', '2022年4月7日']
print(len(date))
y1 = list(y1)
y2 = list(y2)
y3 = list(y3)
print(y1)
print(y2)
print(y3)
plt.rcParams["font.sans-serif"] = ['SimHei'] #方便汉语
plt.rcParams["axes.unicode_minus"] = False
plt.figure()
for i in range(35):#动态的意义是延时输出图片
plt.cla()#清除当前的图片,重新画新的
title = ['新增确诊人数' , '新增无症状人数' ]
p1 = plt.bar(title[0], y1[i] , width=0.3 , color= 'lightcoral' )#标题的设置
p2 = plt.bar(title[1], y2[i] , width=0.3 ,color='turquoise' )
plt.bar_label(p1, label_type='edge', fontsize=12) #柱状图上面的小标题
plt.bar_label(p2, label_type='edge', fontsize=12)
plt.title(date[i] , fontsize=20) #柱状图上面的大标题
plt.ylim(0, 1000) #坐标
if y1[i]>1000 or y2[i] >1000: #老师让做动态坐标,在播放的过程中坐标会发生变化
plt.ylim(0, 21000)
else:
plt.ylim(0, 1000)
# plt.ylabel("新增人数", fontsize=20)
plt.xticks(fontsize=10)
plt.pause(0.1) #延时,每次图片播放的时间填多少就是多少,单位为秒
plt.show()
横着的柱状图绘图代码:
import pandas as pd
from matplotlib import pyplot as plt
df1 = pd.read_excel("data - 1.xlsx")
# print(df1)
date = df1['日期']
y1 = df1['新增确诊人数']
y2 = df1['新增无症状人数']
y3 = df1['治愈人数']
date = ['2022年3月4日上海市疫情发展趋势', '2022年3月5日上海市疫情发展趋势', '2022年3月6日上海市疫情发展趋势', '2022年3月7日上海市疫情发展趋势',
'2022年3月8日上海市疫情发展趋势', '2022年3月9日上海市疫情发展趋势', '2022年3月10日上海市疫情发展趋势', '2022年3月11日上海市疫情发展趋势', '2022年3月12日上海市疫情发展趋势',
'2022年3月13日上海市疫情发展趋势', '2022年3月14日上海市疫情发展趋势', '2022年3月15日上海市疫情发展趋势', '2022年3月16日上海市疫情发展趋势','2022年3月17日上海市疫情发展趋势',
'2022年3月18日上海市疫情发展趋势','2022年3月19日上海市疫情发展趋势', '2022年3月20日上海市疫情发展趋势', '2022年3月21日上海市疫情发展趋势',
'2022年3月22日上海市疫情发展趋势', '2022年3月23日上海市疫情发展趋势', '2022年3月24日上海市疫情发展趋势', '2022年3月25日上海市疫情发展趋势', '2022年3月26日上海市疫情发展趋势', '2022年3月27日上海市疫情发展趋势',
'2022年3月28日上海市疫情发展趋势', '2022年3月29日上海市疫情发展趋势', '2022年3月30日上海市疫情发展趋势', '2022年3月31日上海市疫情发展趋势', '2022年4月1日上海市疫情发展趋势'
,'2022年4月2日上海市疫情发展趋势', '2022年4月3日上海市疫情发展趋势', '2022年4月4日上海市疫情发展趋势'
, '2022年4月5日上海市疫情发展趋势', '2022年4月6日上海市疫情发展趋势', '2022年4月7日上海市疫情发展趋势']
print(len(date))
y1 = list(y1)
y2 = list(y2)
y3 = list(y3)
print(y1)
print(y2)
print(y3)
ans = []
for i in range(35):
ans.append([y1[i] , y2[i]])
print(ans)
for i in range(35):#动态的意义是延时输出图片
plt.cla()#清除之前的图,画新的
title = ['新增无症状人数' , '新增确诊人数' ]
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.title(str(date[i]) , fontsize=30)
b = plt.barh(range(len(ans[i])), ans[i] ,tick_label = title , height=0.05 , color=['turquoise' , 'lightcoral' ],)#绘图
plt.xticks(fontsize=20) #横坐标
plt.yticks(fontsize=20) #纵坐标
for rect in b:
w = rect.get_width()
plt.text(w, rect.get_y() + rect.get_height() / 2, '%d' % #放置小标题
int(w), ha='left', va='center')
plt.pause(0.5)#延时,每次图片播放的时间填多少就是多少,单位为秒
plt.show()
整个项目的下载链接:链接:https://pan.baidu.com/s/1KVpBPCOA__8hHYhSbNY7yQ
提取码:alid
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)