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
分享
二维码
< <上一篇
下一篇>>