用python做好看的动态图像,怎样用python绘制动图

本篇文章给大家谈谈用python做好看的动态图像,以及怎样用python绘制动图,希望对各位有所帮助,不要忘了收藏本站喔。

      大家好,我是带我去滑雪!

      本期为大家带来一个基于python的数据可视化教学,绘制动态柱形图与动态折线图。

目录

(1)绘制动态柱形图

(2)绘制动态折线图


(1)绘制动态柱形图

        GDP是指一个国家或地区的区域内生产总值,包括所有产品和服务的价值,是衡量该区域总体经济的核心指标,它反映了一个国家或地区的经济实力和市场规模用python绘制精灵球扔向皮卡丘。美国能够成为超级大国近百年,这背后的一个主要原因就是因为美国的GDP已经125年来都是世界第一了,经济基础决定上层建筑,强大的经济实力才是保障美国各方面都比较强大的基础。我国自1980年开始逐步的改革开放,GDP在2010年的时候超过日本,成为世界第二,这10年来世界GDP的冠亚军一直都是美国和中国。

       下面我们绘制1960年到2022年全球GDP前10国家排名的动态折线图来直观展示。

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import platform
import sys
# 导入所用到的相关python包
from pyecharts.options import *
from pyecharts.globals import ThemeType
from pyecharts.options.global_options import ThemeType
from pyecharts import options as opts
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType
import pandas as pd
# 读取数据
f = open("E:/工作/硕士/博客/博客-数据可视化/实现/1960-2022全球GDP数据.csv", "r",encoding='GB2312')
data_lines = f.readlines()
# 关闭文件
f.close()
# 删除第一条数据
data_lines.pop(0)
# 将数据转换为字典存储,格式为:
# { 年份: [ [国家, gdp], [国家,gdp], ......  ], 年份: [ [国家, gdp], [国家,gdp], ......  ], ...... }
# { 1960: [ [美国, 123], [中国,321], ......  ], 1961: [ [美国, 123], [中国,321], ......  ], ...... }
# 先定义一个字典对象
data_dict = {}
for line in data_lines:
    year = int(line.split(",")[0])      # 年份
    country = line.split(",")[1]        # 国家
    gdp = float(line.split(",")[2])     # gdp数据
    # 如何判断字典里面有没有指定的key呢?
    try:
        data_dict[year].append([country, gdp])
    except KeyError:
        data_dict[year] = []
        data_dict[year].append([country, gdp])

# print(data_dict[1960])
# 创建时间线对象
timeline = Timeline({"theme": ThemeType.DARK})
# 排序年份
sorted_year_list = sorted(data_dict.keys())
for year in sorted_year_list:
    data_dict[year].sort(key=lambda element: element[1], reverse=True)
    # 取出本年份前10名的国家
    year_data = data_dict[year][0:10]
    x_data = []
    y_data = []
    for country_gdp in year_data:
        x_data.append(country_gdp[0])   # x轴添加国家
        y_data.append(round((country_gdp[1] / 100000000),2))   # y轴添加gdp数据

    # 构建柱状图
    bar = Bar()
    x_data.reverse()
    y_data.reverse()
    bar.add_xaxis(x_data)
    bar.add_yaxis("GDP年度总量(亿美元)", y_data, label_opts=LabelOpts(position="right"),itemstyle_opts=opts.ItemStyleOpts(color='red'))
    # 反转x轴和y轴
    bar.reversal_axis()

    # 设置每一年的图表的标题
    bar.set_global_opts(
        title_opts=TitleOpts(title=f"{year}年GDP总量全球前10排名",title_textstyle_opts=dict(color='red'))
    )
    timeline.add(bar, str(year))


# for循环每一年的数据,基于每一年的数据,创建每一年的bar对象
# 在for中,将每一年的bar对象添加到时间线中

# 设置时间线自动播放
timeline.add_schema(
    play_interval=1000,
    is_timeline_show=True,
    is_auto_play=True,
    is_loop_play=False
)
# 绘图
timeline.render("1960-2022全球GDP前10国家排名.html")
输出结果:

8c47c7daed934de493147fe3b61cdba3.gif

(2)绘制动态折线图

        经济规模壮大,大中小型企业的竞相发展,功不可没。1996年,《财富》杂志设立世界500强企业排行的初始阶段,含中国香港及中国台湾企业数据在内,中企入榜数量仅有4家。2001年,中国加入世界贸易组织,当年入榜的中企也仅为12家。2008年后,数量增长提速,先后超过德国、英国、法国,日本,并在2019年以129家的数量,超越美国,成为全球第一。

      下面我们绘制1996-2022年历年中美全球500企业数量走势对比图,来直观展示。

import numpy as np
import pandas as pd
import matplotlib as mpl
from matplotlib import pyplot as plt
import matplotlib.animation as animation
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 用黑体显示中文
cmap = [
           '#2E91E5',
           '#1CA71C',
           '#DA16FF',
           '#B68100',
           '#EB663B',
           '#00A08B',
           '#FC0080',
           '#6C7C32',
           '#862A16',
           '#620042',
           '#DA60CA',
           '#0D2A63'] * 100

mpl.rcParams['animation.writer'] = 'html'


def line_chart_race(df, filename=None, title="", figsize=(8, 4.5), dpi=300, duration=0.5):
    assert "date" in df.columns, "df should with a column date!"
    assert filename is None or filename.endswith(".html"), "filename should like *.html!"

    fig, ax = plt.subplots(figsize=figsize, dpi=150)

    ax.set_facecolor("0.9")

    # 调整spines
    ax.spines["top"].set_visible(False)
    ax.spines["right"].set_visible(False)
    ax.spines["left"].set_visible(False)
    ax.spines["bottom"].set_visible(False)

    def plot_frame(date):
        dfdata = df.loc[df["date"] <= date, :]
        dfdata.index = dfdata["date"]
        idx = range(len(dfdata))

        ax.clear()
        cols = [name for name in dfdata.columns if name != "date"]
        for i, col in enumerate(cols):
            ax.plot(idx, dfdata[col], color=cmap[i], lw=4)
            px, py = idx[-1], dfdata[col].iloc[-1]
            ax.scatter(px, py, color=cmap[i], edgecolor="black",
                       s=200, lw=2.5, zorder=4)

            ax.annotate(col + ":\n" + str(py), xy=(px, py), xycoords="data",
                        xytext=(10, 2), fontweight="bold", color=cmap[i], textcoords="offset points")

        # 调整绘图范围
        xlim = (0, len(df))
        ax.set_xlim(xmin=xlim[0] - (xlim[1] - xlim[0]) / 10, xmax=xlim[1] + (xlim[1] - xlim[0]) / 10)
        values = df[[x for x in df.columns if x != "date"]].values
        ylim = (values.min(), values.max())
        ax.set_ylim(ymin=ylim[0] - (ylim[1] - ylim[0]) / 10, ymax=ylim[1] + (ylim[1] - ylim[0]) / 10)

        # 设置xticks
        n = len(df)
        ticks_num = 12
        delta = int(np.ceil(n / ticks_num))
        ticks = list(range(0, n, delta))
        dates = df["date"].tolist()
        ticklabels = [dates[i] for i in ticks]
        ax.set_xticks(ticks)
        ax.set_xticklabels(ticklabels)

        ax.tick_params(bottom=False, left=False, labelsize=8, direction="in", length=2)

        # 添加辅助元素
        s = dfdata["date"].iloc[-1]
        ax.text(0.5, 0.5, s, va="center", ha="center", alpha=0.3, size=25, transform=ax.transAxes)
        ax.grid(axis="x", color="white", lw=1, ls="-")
        ax.set_title(title, color="black", fontsize=12)

    line_animation = animation.FuncAnimation(fig, plot_frame, frames=df["date"], interval=int(duration * 1000))
    if filename is None:
        try:
            from IPython.display import HTML
            return HTML(line_animation.to_jshtml())
        except ImportError:
            pass
    else:
        line_animation.save(filename)
        return filename


dfdata = pd.read_csv('Pop_top3.csv')
dfdata = dfdata.rename({"year": "date"}, axis=1)
for col in dfdata.columns:
    if col != "date":
        dfdata.loc[:, col] = np.round(dfdata.loc[:, col] , 3)
dfdata.set_index(dfdata["date"])

html_file = "1996-2022年历年中美全球500企业数量走势对比图.html"
html = line_chart_race(dfdata, html_file, title="1996-2022年历年中美全球500企业数量走势对比图")
html
输出结果:

533c176143e343fb8e680dc7e3a7d185.gif

需要数据集的家人们可以去百度网盘(永久有效)获取:

链接:百度网盘-链接不存在
提取码:2138 


更多优质内容持续发布中,请移步主页查看。

   点赞+关注,下次不迷路!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值