这期博客,我们来学习一下,如何使用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()



