本文主要介绍如何使用Python的bar_chart_race和sjvisualizer模块绘制动态柱形图和动态折线图。
关于sjvisualizer包使用详细可见【动态绘图】上。
一、实验环境
1.1 操作系统及Python环境
本实验的所使用的操作系统为Windows 10 64位,Python版本为Python 3.12.4,Python编译器为Pycharm,虚拟环境为Anaconda。
1.2 必要的Python模块
本实验所必需的Python模块有:pandas、bar_chart_race、matplotlib、random、sjvisualizer。
其中matplotlib已经在Anaconda预安装,random无需安装,其他的均需安装。
安装pandas的方法为在Pycharm中按Alt+F12进入命令行窗口,输入并运行:
pip install pandas
此包用于绘制动态柱形图:安装bar_chart_race的方法为在Pycharm中按Alt+F12进入命令行窗口,输入并运行:
pip install bar_chart_race
按上述方法安装bar_chart_race为0.1版本,0.2版本可进入 bar_chart_race Github界面 下载zip,解压后在Pycharm中按Alt+F12进入命令行窗口,输入并运行:
cd D:\codes\bar_chart_race-master # 这里为解压后的路径
python setup.py install
以安装0.2版本。(0.2可能比0.1更稳定些,且0.2更新了line_chart_race)
注意:0.2版本中bar_chart_race.line_chart_race方法笔者调试了很久没有成果,若有调试成功的希望大佬不吝赐教。也是因为如此本文使用sjvisualizer包绘制动态折线图。
此包用于绘制动态折线图安装sjvisualizer的方法为在Pycharm中按Alt+F12进入命令行窗口,输入并运行:
pip install pan sjvisualizer
其中生成的动态柱形图主要使用了bar_chart_race模块,动态折线图主要使用了sjvisualizer模块。
二、数据源
2.1 数据源来源
本实验采用的数据来源于国家气象科学数据中心网站,最好直接下载csv文件,动态柱形图使用了.csv文件,动态折线图主要使用了xlsx文件。若有需求可关注并私信博主获取本文对应的数据源文件。
2.2 数据预处理
动态柱形图需要数据为wide data格式。宽数据具体可参考bar_chart_race说明文档。
动态柱形图使用如下代码将原数据中的日期进行排序:
1. df = pd.read_csv("data.csv", encoding="gbk")
2. df = df.set_index('日期')
3. df.index = pd.to_datetime(df.index, format='%Y/%m/%d') # 将索引的日期转换为日期时间格式
4. df_sorted = df.sort_index(ascending=True) # 按日期升序排序
上述预处理主要将日期转换为YYYY/mm/dd的格式(原数据可能是20200105这类数据,可参考to_datetime转换数据),并使用df_sorted文件数据作为操作对象处理。
动态折线图使用如下代码将原数据中的日期进行排序并转换为xlsx文件:
1. df = pd.read_csv("data.csv", encoding="gbk")
2. df = df.set_index('date')
3. df.index = pd.to_datetime(df.index, format='%Y%m%d') # 将索引的日期转换为日期时间格式
4. df_sorted = df.sort_index(ascending=True) # 按日期升序排序
5. df_sorted.to_excel('sorted_data.xlsx') # 如果需要保存排序后的数据到CSV文件
由于sjvisualizer处理对象为xlsx文件,因此转换后sorted_data.xlsx作为操作对象处理,并将date转化为日期时间格式处理。
三、 使用python进行数据可视化
3.1 绘制动态柱形图
代码主要如下
1. # -*- coding: gbk -*-
2. import pandas as pd
3. import bar_chart_race as bcr
4. import matplotlib.pyplot as plt
5.
6. # 预处理数据
7. df = pd.read_csv("data.csv", encoding="gbk")
8. df = df.set_index('日期')
9. df.index = pd.to_datetime(df.index, format='%Y/%m/%d') # 将索引的日期转换为日期时间格式
10. df_sorted = df.sort_index(ascending=True) # 按日期升序排序
11.
12. # 设置matplotlib字体
13. plt.rcParams['font.sans-serif'] = ['simsun'] # 用来正常显示中文标签
14. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
15.
16. bcr.bar_chart_race(
17. df_sorted,
18. filename='bar.gif',
19. n_bars=10, # 限制每个时间步中的条形数量
20. title='2020各省会城市及直辖市平均气温数据', # 添加标题
21. steps_per_period=5, # 动画平滑度(插多少帧)
22. period_length=200, # 每个年份的长度(毫秒)
23. # interpolate_period=True, # 平滑动画过渡
24. fixed_order=False, # 不使用固定顺序
25. bar_kwargs={'alpha': .2, 'ec': 'black', 'lw': 3}, # 条形图属性
26. fixed_max=False,
27. perpendicular_bar_func='mean',
28. period_template='%B %d, %Y',
29. period_summary_func=lambda v, r: {'x': .95, 'y': .2,
30. 's': f'全国最高温度: {v.max():,.0f}',
31. 'ha': 'right', 'size': 11},
32. )
3.2 绘制动态折线图
代码主要如下
1. # -*- coding: gbk -*-
2. import random
3. import pandas as pd
4. import matplotlib.pyplot as plt2
5. from sjvisualizer import plot as plt
6. # 生成随机颜色
7. def get_random_color():return tuple(random.randint(0, 255) for _ in range(3)) # 生成RGB颜色值
8.
9. # 数据预处理
10. df = pd.read_csv("data.csv", encoding="gbk")
11. df = df.set_index('date')
12. df.index = pd.to_datetime(df.index, format='%Y%m%d') # 将索引的日期转换为日期时间格式
13. df_sorted = df.sort_index(ascending=True) # 按日期升序排序
14. df_sorted.to_excel('sorted_data.xlsx') # 如果需要保存排序后的数据到CSV文件
15. # 设置matplotlib字体
16. plt2.rcParams['font.sans-serif'] = ['simsun'] # 用来正常显示中文标签
17. plt2.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
18. colors = {
19. "1": get_random_color(),
20. "2": get_random_color(),
21. "3": get_random_color(),
22. "4": get_random_color(),
23. "5": get_random_color(),
24. "6": get_random_color(),
25. "7": get_random_color(),
26. "8": get_random_color(),
27. "9": get_random_color(),
28. "10": get_random_color(),
29. "11": get_random_color(),
30. "12": get_random_color(),
31. "13": get_random_color()
32. }
33.
34. plt.line(excel="sorted_data.xlsx",
35. title="data",
36. duration=0.2,
37. fps=30,
38. record='True',
39. output_video='line.mp4',
40. time_indicator='day',
41. colors=colors
42. )
标签:index,bar,python,random,chart,df,race,动态
From: https://blog.csdn.net/qq_41982015/article/details/142833250