如何使用matplotlib绘制动态柱状图-python

这期博客,我们来学习一下,如何使用python的matplotlib绘制动态的柱状图,机缘巧合之后,导师让我替他绘制一个动态的柱状图,然后在一天的努力下,我速成了一下这个动态柱状图,在这里把代码和方法开源出来,万一以后大家的导师也让画,可以参考我的方法。

  1. 竖着的柱状图绘图代码:
  2. 横着的柱状图绘图代码:

以上海疫情的发展为例,先将疫情的发展数字做成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

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小馨馨的小翟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值