pynimate库绘制动态可视化图~
潮起潮落,岁月如梭
穿越岁月长河,不忘来时路
pynimate简介
首先 使用pip安装pynimate
按win+r,输入cmd,打开cmd,输入以下命令安装pynimate库
pip install Pynimate
如果网络不畅无法下载,请尝试用清华镜像源:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Pynimate
如何使用
首先,import一下将库导入
import pynimate as nim
输入数据后,Pynimate可以通过Barhplot()函数生成动态条形图,或者通过Lineplot()生成动态折线图
以下是一个简单的示例:
import pandas as pd
from matplotlib import pyplot as plt
import pynimate as nim
df = pd.DataFrame(
{
"time": ["1960-01-01", "1961-01-01", "1962-01-01"],
"Afghanistan": [1, 2, 3],
"Angola": [2, 3, 4],
"Albania": [1, 2, 5],
"USA": [5, 3, 4],
"Argentina": [1, 4, 5],
}
).set_index("time")
cnv = nim.Canvas()
bar = nim.Barhplot.from_df(df, "%Y-%m-%d", "2d")
bar.set_time(callback=lambda i, datafier: datafier.data.index[i].year)
cnv.add_plot(bar)
cnv.animate()
plt.show()
cnv.save("file", 24, "gif")
终极版
import pandas as pd
import pynimate as nim
import matplotlib.pyplot as plt
import warnings
from typing import Union
warnings.filterwarnings("ignore")
# 读取数据
df = pd.read_excel(
r'C:\Users\28377\Desktop\2024-Python 张富\混沌与模糊\世界十大经济体历年GDP\1978以来世界20大经济体历年GDP(以现价美元计).xlsx',
engine='openpyxl').set_index("time")
# 设置颜色字典
country_colors = {
"美国": "green",
"中国": "red",
"日本": "white",
"德国": "yellow",
"印度": "purple",
"英国": "orange",
"法国": "cyan",
"俄罗斯联邦": "gray",
"加拿大": "magenta",
"意大利": "lime",
"巴西": "skyblue",
"澳大利亚": "gold",
"大韩民国": "green",
"墨西哥": "purple",
"西班牙": "orange",
"印度尼西亚": "cyan",
"沙特阿拉伯": "gray",
"荷兰": "magenta",
"土耳其": "lime",
"瑞士": "skyblue"
}
cnv = nim.Canvas(facecolor="#001219")
def update(self, i: int) -> None:
"""FuncAnimation update
Parameters
----------
i : int
Animation frame
"""
self.ax.clear()
self.bar_attr = self.get_ith_bar_attrs(i)
# 绘制条形图并设置颜色
for ind, (rank, length, col) in enumerate(
zip(
self.bar_attr.bar_rank,
self.bar_attr.bar_length,
self.bar_attr.top_cols,
)
):
self.ax.barh(
rank,
length,
color=country_colors.get(col, "blue"), # 使用字典中的颜色,如果没有则默认为蓝色
**self.barh_props,
)
if self.annot_bars:
self.ax.text(
length + self.bar_annot_props["xoffset"],
rank + self.bar_annot_props["yoffset"],
self.bar_annot_props["callback"](length),
ha=self.bar_annot_props["ha"],
**self.bar_annot_props["kwargs"],
zorder=ind,
)
if self.rounded_edges:
self._get_rounded_eges()
for patch in self.new_patches[::-1]:
self.ax.add_patch(patch)
for ind, patch in enumerate(self.ax.patches):
patch.set_zorder(ind)
super().update(i)
def post_update(ax, i, datafier, bar_attr):
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
ax.spines["bottom"].set_visible(False)
ax.spines["left"].set_visible(False)
ax.set_facecolor("#001219")
current_year = datafier.data.index[i].year
current_month = datafier.data.index[i].month
# 添加时间轴走到2010年时的文字注释
if current_year == 1978:
ax.text(
0.95, # x坐标,右对齐
0.10, # y坐标,底部位置
"1978年,中国改革开放", # 显示的文字内容
ha="right", # 文字水平对齐方式为右对齐
va="center", # 文字垂直对齐方式为居中
color="w", # 文字颜色为白色
fontsize=30, # 文字大小为12
transform=ax.transAxes,
)
elif current_year == 2001:
ax.text(
0.95, # x坐标,右对齐
0.10, # y坐标,底部位置
"2001年12月11日,中国正式加入世界贸易组织,成为其第143个成员", # 显示的文字内容
ha="right", # 文字水平对齐方式为右对齐
va="center", # 文字垂直对齐方式为居中
color="w", # 文字颜色为白色
fontsize=30, # 文字大小为12
transform=ax.transAxes, # 使用坐标轴的相对坐标系
)
elif current_year == 2010:
ax.text(
0.95, # x坐标,右对齐
0.10, # y坐标,底部位置
"2010年,中国成为世界第二大经济体", # 显示的文字内容
ha="right", # 文字水平对齐方式为右对齐
va="center", # 文字垂直对齐方式为居中
color="w", # 文字颜色为白色
fontsize=30, # 文字大小为12
transform=ax.transAxes, # 使用坐标轴的相对坐标系
)
# 创建Barplot对象
bar = nim.Barplot(df, "%Y-%m-%d", "1M", post_update=post_update, rounded_edges=True, grid=False, n_bars=31)
# 设置条形图颜色
bar.set_bar_color(country_colors)
# 设置标题和其他属性
bar.set_title("1978以来世界20大经济体历年GDP(以现价美元计)", color="w", weight=600, size=25)
cnv.add_plot(bar)
bar.set_bar_annots(color="w", size=13)
bar.set_bar_border_props(edge_color="w", pad=0.1, mutation_aspect=1, radius=0.2, mutation_scale=0.6)
bar.set_xticks(colors="w", length=0, labelsize=12)
bar.set_yticks(colors="w", labelsize=12)
bar.set_bar_border_props(edge_color="black", pad=0.1, mutation_aspect=1, radius=0.2, mutation_scale=0.6)
# 设置时间显示
bar.set_time(callback=lambda i, datafier: datafier.data.index[i].strftime("%Y.%m"),
x=0.95,
y=0.30,
color="w",
size=65)
# 开始动画并显示
cnv.animate()
plt.rcParams["font.family"] = "SimSun"
plt.show()
# 保存动画(确保文件路径正确)
cnv.save("path_to_save_file", 24, "gif")
版权声明:
作者:夜阑
链接:http://yelan.xyz/index.php/2024/03/27/pynimate%e5%ba%93%e7%bb%98%e5%88%b6%e5%8a%a8%e6%80%81%e6%9d%a1%e5%bd%a2%e5%9b%be/
来源:夜阑的小站
文章版权归作者所有,未经允许请勿转载。
THE END
二维码
共有 0 条评论