精华内容
下载资源
问答
  • 在读技术博客的过程中,我们会发现那些能够把知识、成果讲透的博主很多都会做动态图表。他们的图是怎么做的?难度大吗?这篇文章就介绍了 Python 中一种简单的动态图表制作方法。数据暴增的年...

    在读技术博客的过程中,我们会发现那些能够把知识、成果讲透的博主很多都会做动态图表。他们的图是怎么做的?难度大吗?这篇文章就介绍了 Python 中一种简单的动态图表制作方法。

    数据暴增的年代,数据科学家、分析师在被要求对数据有更深的理解与分析的同时,还需要将结果有效地传递给他人。如何让目标听众更直观地理解?当然是将数据可视化啊,而且最好是动态可视化。

    本文将以线型图、条形图和饼图为例,系统地讲解如何让你的数据图表动起来。

    这些动态图表是用什么做的?

    接触过数据可视化的同学应该对 Python 里的 Matplotlib 库并不陌生。它是一个基于 Python 的开源数据绘图包,仅需几行代码就可以帮助开发者生成直方图、功率谱、条形图、散点图等。这个库里有个非常实用的扩展包——FuncAnimation,可以让我们的静态图表动起来。

    FuncAnimation 是 Matplotlib 库中 Animation 类的一部分,后续会展示多个示例。如果是首次接触,你可以将这个函数简单地理解为一个 While 循环,不停地在 “画布” 上重新绘制目标数据图。

    如何使用 FuncAnimation?

    这个过程始于以下两行代码:

    import matplotlib.animation as ani
    
    animator = ani.FuncAnimation(fig, chartfunc, interval = 100)

    从中我们可以看到 FuncAnimation 的几个输入:

    • fig 是用来 「绘制图表」的 figure 对象;

    • chartfunc 是一个以数字为输入的函数,其含义为时间序列上的时间;

    • interval 这个更好理解,是帧之间的间隔延迟,以毫秒为单位,默认值为 200。

    这是三个关键输入,当然还有更多可选输入,感兴趣的读者可查看原文档,这里不再赘述。

    下一步要做的就是将数据图表参数化,从而转换为一个函数,然后将该函数时间序列中的点作为输入,设置完成后就可以正式开始了。

    在开始之前依旧需要确认你是否对基本的数据可视化有所了解。也就是说,我们先要将数据进行可视化处理,再进行动态处理。

    按照以下代码进行基本调用。另外,这里将采用大型流行病的传播数据作为案例数据(包括每天的死亡人数)。

    import matplotlib.animation as ani
    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pdurl = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv'
    df = pd.read_csv(url, delimiter=',', header='infer')df_interest = df.loc[
        df['Country/Region'].isin(['United Kingdom', 'US', 'Italy', 'Germany'])
        & df['Province/State'].isna()]df_interest.rename(
        index=lambda x: df_interest.at[x, 'Country/Region'], inplace=True)
    df1 = df_interest.transpose()df1 = df1.drop(['Province/State', 'Country/Region', 'Lat', 'Long'])
    df1 = df1.loc[(df1 != 0).any(1)]
    df1.index = pd.to_datetime(df1.index)

    绘制三种常见动态图表

    动态曲线图

    如下所示,首先需要做的第一件事是定义图的各项,这些基础项设定之后就会保持不变。它们包括:创建 figure 对象,x 标和 y 标,设置线条颜色和 figure 边距等:

    import numpy as np
    import matplotlib.pyplot as pltcolor = ['red', 'green', 'blue', 'orange']
    fig = plt.figure()
    plt.xticks(rotation=45, ha="right", rotation_mode="anchor") #rotate the x-axis values
    plt.subplots_adjust(bottom = 0.2, top = 0.9) #ensuring the dates (on the x-axis) fit in the screen
    plt.ylabel('No of Deaths')
    plt.xlabel('Dates')

    接下来设置 curve 函数,进而使用 .FuncAnimation 让它动起来:

    def buildmebarchart(i=int):
        plt.legend(df1.columns)
        p = plt.plot(df1[:i].index, df1[:i].values) #note it only returns the dataset, up to the point i
        for i in range(0,4):
            p[i].set_color(color[i]) #set the colour of each curveimport matplotlib.animation as ani
    animator = ani.FuncAnimation(fig, buildmebarchart, interval = 100)
    plt.show()

    动态饼状图

    可以观察到,其代码结构看起来与线型图并无太大差异,但依旧有细小的差别。

    import numpy as np
    import matplotlib.pyplot as pltfig,ax = plt.subplots()
    explode=[0.01,0.01,0.01,0.01] #pop out each slice from the piedef getmepie(i):
        def absolute_value(val): #turn % back to a number
            a  = np.round(val/100.*df1.head(i).max().sum(), 0)
            return int(a)
        ax.clear()
        plot = df1.head(i).max().plot.pie(y=df1.columns,autopct=absolute_value, label='',explode = explode, shadow = True)
        plot.set_title('Total Number of Deaths\n' + str(df1.index[min( i, len(df1.index)-1 )].strftime('%y-%m-%d')), fontsize=12)import matplotlib.animation as ani
    animator = ani.FuncAnimation(fig, getmepie, interval = 200)
    plt.show()

    主要区别在于,动态饼状图的代码每次循环都会返回一组数值,但在线型图中返回的是我们所在点之前的整个时间序列。返回时间序列通过 df1.head(i) 来实现,而. max()则保证了我们仅获得最新的数据,因为流行病导致死亡的总数只有两种变化:维持现有数量或持续上升。

    df1.head(i).max()

    动态条形图

    创建动态条形图的难度与上述两个案例并无太大差别。在这个案例中,作者定义了水平和垂直两种条形图,读者可以根据自己的实际需求来选择图表类型并定义变量栏。

    fig = plt.figure()
    bar = ''def buildmebarchart(i=int):
        iv = min(i, len(df1.index)-1) #the loop iterates an extra one time, which causes the dataframes to go out of bounds. This was the easiest (most lazy) way to solve this :)
        objects = df1.max().index
        y_pos = np.arange(len(objects))
        performance = df1.iloc[[iv]].values.tolist()[0]
        if bar == 'vertical':
            plt.bar(y_pos, performance, align='center', color=['red', 'green', 'blue', 'orange'])
            plt.xticks(y_pos, objects)
            plt.ylabel('Deaths')
            plt.xlabel('Countries')
            plt.title('Deaths per Country \n' + str(df1.index[iv].strftime('%y-%m-%d')))
        else:
            plt.barh(y_pos, performance, align='center', color=['red', 'green', 'blue', 'orange'])
            plt.yticks(y_pos, objects)
            plt.xlabel('Deaths')
            plt.ylabel('Countries')animator = ani.FuncAnimation(fig, buildmebarchart, interval=100)plt.show()

    保存动画图

    在制作完成后,存储这些动态图就非常简单了,可直接使用以下代码:

    animator.save(r'C:\temp\myfirstAnimation.gif')

    感兴趣的读者如想获得详细信息可参考https://matplotlib.org/3.1.1/api/animation_api.html

    转自:机器之心 公众号;

    END

    版权声明:本号内容部分来自互联网,转载请注明原文链接和作者,如有侵权或出处有误请和我们联系。


    合作请加QQ:365242293  

    数据分析(ID : ecshujufenxi )互联网科技与数据圈自己的微信,也是WeMedia自媒体联盟成员之一,WeMedia联盟覆盖5000万人群。

    展开全文
  • 选自TowardsDataScience作者:Costas Andreou机器之心编译参与:Jamin、张倩在读技术博客的过程中,我们会发现那些能够把知识、成果讲透的博主很多都会做动态图...

    选自TowardsDataScience

    作者:Costas Andreou

    机器之心编译

    参与:Jamin、张倩

    在读技术博客的过程中,我们会发现那些能够把知识、成果讲透的博主很多都会做动态图表。他们的图是怎么做的?难度大吗?这篇文章就介绍了 Python 中一种简单的动态图表制作方法。

    数据暴增的年代,数据科学家、分析师在被要求对数据有更深的理解与分析的同时,还需要将结果有效地传递给他人。如何让目标听众更直观地理解?当然是将数据可视化啊,而且最好是动态可视化。

    本文将以线型图、条形图和饼图为例,系统地讲解如何让你的数据图表动起来

    这些动态图表是用什么做的?

    接触过数据可视化的同学应该对 Python 里的 Matplotlib 库并不陌生。它是一个基于 Python 的开源数据绘图包,仅需几行代码就可以帮助开发者生成直方图、功率谱、条形图、散点图等。这个库里有个非常实用的扩展包——FuncAnimation,可以让我们的静态图表动起来。

    FuncAnimation 是 Matplotlib 库中 Animation 类的一部分,后续会展示多个示例。如果是首次接触,你可以将这个函数简单地理解为一个 While 循环,不停地在 “画布” 上重新绘制目标数据图。

    如何使用 FuncAnimation?

    这个过程始于以下两行代码:

    import matplotlib.animation as ani
    
    animator = ani.FuncAnimation(fig, chartfunc, interval = 100)

    从中我们可以看到 FuncAnimation 的几个输入:

    • fig 是用来 「绘制图表」的 figure 对象;

    • chartfunc 是一个以数字为输入的函数,其含义为时间序列上的时间;

    • interval 这个更好理解,是帧之间的间隔延迟,以毫秒为单位,默认值为 200。

    这是三个关键输入,当然还有更多可选输入,感兴趣的读者可查看原文档,这里不再赘述。

    下一步要做的就是将数据图表参数化,从而转换为一个函数,然后将该函数时间序列中的点作为输入,设置完成后就可以正式开始了。

    在开始之前依旧需要确认你是否对基本的数据可视化有所了解。也就是说,我们先要将数据进行可视化处理,再进行动态处理。

    按照以下代码进行基本调用。另外,这里将采用大型流行病的传播数据作为案例数据(包括每天的死亡人数)。

    import matplotlib.animation as ani
    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pdurl = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv'
    df = pd.read_csv(url, delimiter=',', header='infer')df_interest = df.loc[
        df['Country/Region'].isin(['United Kingdom', 'US', 'Italy', 'Germany'])
        & df['Province/State'].isna()]df_interest.rename(
        index=lambda x: df_interest.at[x, 'Country/Region'], inplace=True)
    df1 = df_interest.transpose()df1 = df1.drop(['Province/State', 'Country/Region', 'Lat', 'Long'])
    df1 = df1.loc[(df1 != 0).any(1)]
    df1.index = pd.to_datetime(df1.index)

    绘制三种常见动态图表

    动态线型图

    如下所示,首先需要做的第一件事是定义图的各项,这些基础项设定之后就会保持不变。它们包括:创建 figure 对象,x 标和 y 标,设置线条颜色和 figure 边距等:

    import numpy as np
    import matplotlib.pyplot as pltcolor = ['red', 'green', 'blue', 'orange']
    fig = plt.figure()
    plt.xticks(rotation=45, ha="right", rotation_mode="anchor") #rotate the x-axis values
    plt.subplots_adjust(bottom = 0.2, top = 0.9) #ensuring the dates (on the x-axis) fit in the screen
    plt.ylabel('No of Deaths')
    plt.xlabel('Dates')

    接下来设置 curve 函数,进而使用 .FuncAnimation 让它动起来:

    def buildmebarchart(i=int):
        plt.legend(df1.columns)
        p = plt.plot(df1[:i].index, df1[:i].values) #note it only returns the dataset, up to the point i
        for i in range(0,4):
            p[i].set_color(color[i]) #set the colour of each curveimport matplotlib.animation as ani
    animator = ani.FuncAnimation(fig, buildmebarchart, interval = 100)
    plt.show()

    动态饼状图

    可以观察到,其代码结构看起来与线型图并无太大差异,但依旧有细小的差别。

    import numpy as np
    import matplotlib.pyplot as pltfig,ax = plt.subplots()
    explode=[0.01,0.01,0.01,0.01] #pop out each slice from the piedef getmepie(i):
        def absolute_value(val): #turn % back to a number
            a  = np.round(val/100.*df1.head(i).max().sum(), 0)
            return int(a)
        ax.clear()
        plot = df1.head(i).max().plot.pie(y=df1.columns,autopct=absolute_value, label='',explode = explode, shadow = True)
        plot.set_title('Total Number of Deaths\n' + str(df1.index[min( i, len(df1.index)-1 )].strftime('%y-%m-%d')), fontsize=12)import matplotlib.animation as ani
    animator = ani.FuncAnimation(fig, getmepie, interval = 200)
    plt.show()

    主要区别在于,动态饼状图的代码每次循环都会返回一组数值,但在线型图中返回的是我们所在点之前的整个时间序列。返回时间序列通过 df1.head(i) 来实现,而. max()则保证了我们仅获得最新的数据,因为流行病导致死亡的总数只有两种变化:维持现有数量或持续上升。

    df1.head(i).max()

    动态条形图

    创建动态条形图的难度与上述两个案例并无太大差别。在这个案例中,作者定义了水平和垂直两种条形图,读者可以根据自己的实际需求来选择图表类型并定义变量栏。

    fig = plt.figure()
    bar = ''def buildmebarchart(i=int):
        iv = min(i, len(df1.index)-1) #the loop iterates an extra one time, which causes the dataframes to go out of bounds. This was the easiest (most lazy) way to solve this :)
        objects = df1.max().index
        y_pos = np.arange(len(objects))
        performance = df1.iloc[[iv]].values.tolist()[0]
        if bar == 'vertical':
            plt.bar(y_pos, performance, align='center', color=['red', 'green', 'blue', 'orange'])
            plt.xticks(y_pos, objects)
            plt.ylabel('Deaths')
            plt.xlabel('Countries')
            plt.title('Deaths per Country \n' + str(df1.index[iv].strftime('%y-%m-%d')))
        else:
            plt.barh(y_pos, performance, align='center', color=['red', 'green', 'blue', 'orange'])
            plt.yticks(y_pos, objects)
            plt.xlabel('Deaths')
            plt.ylabel('Countries')animator = ani.FuncAnimation(fig, buildmebarchart, interval=100)plt.show()

    在制作完成后,存储这些动态图就非常简单了,可直接使用以下代码:

    animator.save(r'C:\temp\myfirstAnimation.gif')

    感兴趣的读者如想获得详细信息可参考: 

    https://matplotlib.org/3.1.1/api/animation_api.html

    原文链接:

    https://towardsdatascience.com/learn-how-to-create-animated-graphs-in-python-fce780421afe

    ---------End---------

    顺便给大家推荐下我的微信视频号「价值前瞻」,主要分享读书、成长和投资思考,可以了解不一样的我,欢迎扫码关注。
    
    
    
    展开全文
  • 本文转自:法纳斯特,作者:小F关于动态条形图,小F以前推荐过「Bar Chart Race」这个库。三行代码就能实现动态条形图的绘制。有些同学在使用的时候,会出现一些错误。一个是加载文件...

    本文转自:法纳斯特,作者:小F

    关于动态条形图,小F以前推荐过Bar Chart Race」这个库。三行代码就能实现动态条形图的绘制。

    有些同学在使用的时候,会出现一些错误。一个是加载文件报错,另一个是生成GIF的时候报错。

    这是因为作者的示例是网络加载数据,会读取不到。通过读取本地文件,就不会出错。

    GIF生成失败一般是需要安装imagemagick(图片处理工具)。

    最近小F又发现一个可视化图库Pandas_Alive」,不仅包含动态条形图,还可以绘制动态曲线图、气泡图、饼状图、地图

    同样也是几行代码就能完成动态图表的绘制。

    GitHub地址:

    https://github.com/JackMcKew/pandas_alive

    使用文档:https://jackmckew.github.io/pandas_alive/

    安装版本建议是0.2.3matplotlib版本是3.2.1

    同时需自行安装tqdm(显示进度条)和descartes(绘制地图相关库)。

    要不然会出现报错,估计是作者的requestment.txt没包含这两个库。

    好了,成功安装后就可以引入这个第三方库,直接选择加载本地文件。

    import pandas_alive
    import pandas as pd
    
    covid_df = pd.read_csv('data/covid19.csv', index_col=0, parse_dates=[0])
    covid_df.plot_animated(filename='examples/example-barh-chart.gif', n_visible=15)
    

    生成了一个GIF图,具体如下。

    刚开始学习这个库的时候,大家可以减少数据,这样生成GIF的时间就会快一些

    比如小F在接下来的实践中,基本都只选取了20天左右的数据。

    对于其他图表,我们可以查看官方文档的API说明,得以了解。

    下面我们就来看看其他动态图表的绘制方法吧!

    01 动态条形图

    elec_df = pd.read_csv("data/Aus_Elec_Gen_1980_2018.csv", index_col=0, parse_dates=[0], thousands=',')
    elec_df = elec_df.iloc[:20, :]
    elec_df.fillna(0).plot_animated('examples/example-electricity-generated-australia.gif', period_fmt="%Y",
                                    title='Australian Electricity Generation Sources 1980-2018')
    
    

    02 动态柱状图

    covid_df = pd.read_csv('data/covid19.csv', index_col=0, parse_dates=[0])
    covid_df.plot_animated(filename='examples/example-barv-chart.gif', orientation='v', n_visible=15)
    

    03 动态曲线图

    covid_df = pd.read_csv('data/covid19.csv', index_col=0, parse_dates=[0])
    covid_df.diff().fillna(0).plot_animated(filename='examples/example-line-chart.gif', kind='line', period_label={'x': 0.25, 'y': 0.9})
    


    04 动态面积图

    covid_df = pd.read_csv('data/covid19.csv', index_col=0, parse_dates=[0])
    covid_df.sum(axis=1).fillna(0).plot_animated(filename='examples/example-bar-chart.gif', kind='bar',
            period_label={'x': 0.1, 'y': 0.9},
            enable_progress_bar=True, steps_per_period=2, interpolate_period=True, period_length=200
    )
    

    05 动态散点图

    max_temp_df = pd.read_csv(
        "data/Newcastle_Australia_Max_Temps.csv",
        parse_dates={"Timestamp": ["Year", "Month", "Day"]},
    )
    min_temp_df = pd.read_csv(
        "data/Newcastle_Australia_Min_Temps.csv",
        parse_dates={"Timestamp": ["Year", "Month", "Day"]},
    )
    
    max_temp_df = max_temp_df.iloc[:5000, :]
    min_temp_df = min_temp_df.iloc[:5000, :]
    
    merged_temp_df = pd.merge_asof(max_temp_df, min_temp_df, on="Timestamp")
    merged_temp_df.index = pd.to_datetime(merged_temp_df["Timestamp"].dt.strftime('%Y/%m/%d'))
    
    keep_columns = ["Minimum temperature (Degree C)", "Maximum temperature (Degree C)"]
    merged_temp_df[keep_columns].resample("Y").mean().plot_animated(filename='examples/example-scatter-chart.gif', kind="scatter",
                                                                    title='Max & Min Temperature Newcastle, Australia')
    
    

    06 动态饼状图

    covid_df = pd.read_csv('data/covid19.csv', index_col=0, parse_dates=[0])
    covid_df.plot_animated(filename='examples/example-pie-chart.gif', kind="pie",
                           rotatelabels=True, period_label={'x': 0, 'y': 0})
    

    07 动态气泡图

    multi_index_df = pd.read_csv("data/multi.csv", header=[0, 1], index_col=0)
    multi_index_df.index = pd.to_datetime(multi_index_df.index, dayfirst=True)
    
    map_chart = multi_index_df.plot_animated(
        kind="bubble",
        filename="examples/example-bubble-chart.gif",
        x_data_label="Longitude",
        y_data_label="Latitude",
        size_data_label="Cases",
        color_data_label="Cases",
        vmax=5, steps_per_period=3, interpolate_period=True, period_length=500,
        dpi=100
    )
    

    08 地理空间点图表

    import geopandas
    import pandas_alive
    import contextily
    
    gdf = geopandas.read_file('data/nsw-covid19-cases-by-postcode.gpkg')
    gdf.index = gdf.postcode
    gdf = gdf.drop('postcode',axis=1)
    
    result = gdf.iloc[:, :20]
    result['geometry'] = gdf.iloc[:, -1:]['geometry']
    
    map_chart = result.plot_animated(filename='examples/example-geo-point-chart.gif',
                                     basemap_format={'source':contextily.providers.Stamen.Terrain})
    
    

    09 多边形地理图表

    import geopandas
    import pandas_alive
    import contextily
    
    gdf = geopandas.read_file('data/italy-covid-region.gpkg')
    gdf.index = gdf.region
    gdf = gdf.drop('region',axis=1)
    
    result = gdf.iloc[:, :20]
    result['geometry'] = gdf.iloc[:, -1:]['geometry']
    
    map_chart = result.plot_animated(filename='examples/example-geo-polygon-chart.gif',
                                     basemap_format={'source': contextily.providers.Stamen.Terrain})
    

    10 多个动态图表

    covid_df = pd.read_csv('data/covid19.csv', index_col=0, parse_dates=[0])
    
    animated_line_chart = covid_df.diff().fillna(0).plot_animated(kind='line', period_label=False,add_legend=False)
    animated_bar_chart = covid_df.plot_animated(n_visible=10)
    
    pandas_alive.animate_multiple_plots('examples/example-bar-and-line-chart.gif',
                                        [animated_bar_chart, animated_line_chart], enable_progress_bar=True)
    
    

    11 城市人口

    def population():
        urban_df = pd.read_csv("data/urban_pop.csv", index_col=0, parse_dates=[0])
    
        animated_line_chart = (
            urban_df.sum(axis=1)
                .pct_change()
                .fillna(method='bfill')
                .mul(100)
                .plot_animated(kind="line", title="Total % Change in Population", period_label=False, add_legend=False)
        )
    
        animated_bar_chart = urban_df.plot_animated(n_visible=10, title='Top 10 Populous Countries', period_fmt="%Y")
    
        pandas_alive.animate_multiple_plots('examples/example-bar-and-line-urban-chart.gif',
                                            [animated_bar_chart, animated_line_chart],
                                            title='Urban Population 1977 - 2018', adjust_subplot_top=0.85,
                                            enable_progress_bar=True)
    

    12 G7国家平均寿命

    def life():
        data_raw = pd.read_csv("data/long.csv")
    
        list_G7 = [
            "Canada",
            "France",
            "Germany",
            "Italy",
            "Japan",
            "United Kingdom",
            "United States",
        ]
    
        data_raw = data_raw.pivot(
            index="Year", columns="Entity", values="Life expectancy (Gapminder, UN)"
        )
    
        data = pd.DataFrame()
        data["Year"] = data_raw.reset_index()["Year"]
        for country in list_G7:
            data[country] = data_raw[country].values
    
        data = data.fillna(method="pad")
        data = data.fillna(0)
        data = data.set_index("Year").loc[1900:].reset_index()
    
        data["Year"] = pd.to_datetime(data.reset_index()["Year"].astype(str))
    
        data = data.set_index("Year")
        data = data.iloc[:25, :]
    
        animated_bar_chart = data.plot_animated(
            period_fmt="%Y", perpendicular_bar_func="mean", period_length=200, fixed_max=True
        )
    
        animated_line_chart = data.plot_animated(
            kind="line", period_fmt="%Y", period_length=200, fixed_max=True
        )
    
        pandas_alive.animate_multiple_plots(
            "examples/life-expectancy.gif",
            plots=[animated_bar_chart, animated_line_chart],
            title="Life expectancy in G7 countries up to 2015",
            adjust_subplot_left=0.2, adjust_subplot_top=0.9, enable_progress_bar=True
        )
    

    13 新南威尔斯州COVID可视化

    def nsw():
        import geopandas
        import pandas as pd
        import pandas_alive
        import contextily
        import matplotlib.pyplot as plt
        import json
    
        with open('data/package_show.json', 'r', encoding='utf8')as fp:
            data = json.load(fp)
    
        # Extract url to csv component
        covid_nsw_data_url = data["result"]["resources"][0]["url"]
        print(covid_nsw_data_url)
    
        # Read csv from data API url
        nsw_covid = pd.read_csv('data/confirmed_cases_table1_location.csv')
        postcode_dataset = pd.read_csv("data/postcode-data.csv")
    
        # Prepare data from NSW health dataset
    
        nsw_covid = nsw_covid.fillna(9999)
        nsw_covid["postcode"] = nsw_covid["postcode"].astype(int)
    
        grouped_df = nsw_covid.groupby(["notification_date", "postcode"]).size()
        grouped_df = pd.DataFrame(grouped_df).unstack()
        grouped_df.columns = grouped_df.columns.droplevel().astype(str)
    
        grouped_df = grouped_df.fillna(0)
        grouped_df.index = pd.to_datetime(grouped_df.index)
    
        cases_df = grouped_df
    
        # Clean data in postcode dataset prior to matching
    
        grouped_df = grouped_df.T
        postcode_dataset = postcode_dataset[postcode_dataset['Longitude'].notna()]
        postcode_dataset = postcode_dataset[postcode_dataset['Longitude'] != 0]
        postcode_dataset = postcode_dataset[postcode_dataset['Latitude'].notna()]
        postcode_dataset = postcode_dataset[postcode_dataset['Latitude'] != 0]
        postcode_dataset['Postcode'] = postcode_dataset['Postcode'].astype(str)
    
        # Build GeoDataFrame from Lat Long dataset and make map chart
        grouped_df['Longitude'] = grouped_df.index.map(postcode_dataset.set_index('Postcode')['Longitude'].to_dict())
        grouped_df['Latitude'] = grouped_df.index.map(postcode_dataset.set_index('Postcode')['Latitude'].to_dict())
        gdf = geopandas.GeoDataFrame(
            grouped_df, geometry=geopandas.points_from_xy(grouped_df.Longitude, grouped_df.Latitude), crs="EPSG:4326")
        gdf = gdf.dropna()
    
        # Prepare GeoDataFrame for writing to geopackage
        gdf = gdf.drop(['Longitude', 'Latitude'], axis=1)
        gdf.columns = gdf.columns.astype(str)
        gdf['postcode'] = gdf.index
        # gdf.to_file("data/nsw-covid19-cases-by-postcode.gpkg", layer='nsw-postcode-covid', driver="GPKG")
    
        # Prepare GeoDataFrame for plotting
        gdf.index = gdf.postcode
        gdf = gdf.drop('postcode', axis=1)
        gdf = gdf.to_crs("EPSG:3857")  # Web Mercator
    
        result = gdf.iloc[:, :22]
        result['geometry'] = gdf.iloc[:, -1:]['geometry']
        gdf = result
    
        map_chart = gdf.plot_animated(basemap_format={'source': contextily.providers.Stamen.Terrain}, cmap='cool')
    
        # cases_df.to_csv('data/nsw-covid-cases-by-postcode.csv')
        cases_df = cases_df.iloc[:22, :]
    
        from datetime import datetime
    
        bar_chart = cases_df.sum(axis=1).plot_animated(
            kind='line',
            label_events={
                'Ruby Princess Disembark': datetime.strptime("19/03/2020", "%d/%m/%Y"),
                # 'Lockdown': datetime.strptime("31/03/2020", "%d/%m/%Y")
            },
            fill_under_line_color="blue",
            add_legend=False
        )
    
        map_chart.ax.set_title('Cases by Location')
    
        grouped_df = pd.read_csv('data/nsw-covid-cases-by-postcode.csv', index_col=0, parse_dates=[0])
        grouped_df = grouped_df.iloc[:22, :]
    
        line_chart = (
            grouped_df.sum(axis=1)
                .cumsum()
                .fillna(0)
                .plot_animated(kind="line", period_label=False, title="Cumulative Total Cases", add_legend=False)
        )
    
        def current_total(values):
            total = values.sum()
            s = f'Total : {int(total)}'
            return {'x': .85, 'y': .2, 's': s, 'ha': 'right', 'size': 11}
    
        race_chart = grouped_df.cumsum().plot_animated(
            n_visible=5, title="Cases by Postcode", period_label=False, period_summary_func=current_total
        )
    
        import time
    
        timestr = time.strftime("%d/%m/%Y")
    
        plots = [bar_chart, line_chart, map_chart, race_chart]
    
        from matplotlib import rcParams
    
        rcParams.update({"figure.autolayout": False})
        # make sure figures are `Figure()` instances
        figs = plt.Figure()
        gs = figs.add_gridspec(2, 3, hspace=0.5)
        f3_ax1 = figs.add_subplot(gs[0, :])
        f3_ax1.set_title(bar_chart.title)
        bar_chart.ax = f3_ax1
    
        f3_ax2 = figs.add_subplot(gs[1, 0])
        f3_ax2.set_title(line_chart.title)
        line_chart.ax = f3_ax2
    
        f3_ax3 = figs.add_subplot(gs[1, 1])
        f3_ax3.set_title(map_chart.title)
        map_chart.ax = f3_ax3
    
        f3_ax4 = figs.add_subplot(gs[1, 2])
        f3_ax4.set_title(race_chart.title)
        race_chart.ax = f3_ax4
    
        timestr = cases_df.index.max().strftime("%d/%m/%Y")
        figs.suptitle(f"NSW COVID-19 Confirmed Cases up to {timestr}")
    
        pandas_alive.animate_multiple_plots(
            'examples/nsw-covid.gif',
            plots,
            figs,
            enable_progress_bar=True
        )
    

    14 意大利COVID可视化

    def italy():
        import geopandas
        import pandas as pd
        import pandas_alive
        import contextily
        import matplotlib.pyplot as plt
    
        region_gdf = geopandas.read_file('data/geo-data/italy-with-regions')
        region_gdf.NOME_REG = region_gdf.NOME_REG.str.lower().str.title()
        region_gdf = region_gdf.replace('Trentino-Alto Adige/Sudtirol', 'Trentino-Alto Adige')
        region_gdf = region_gdf.replace("Valle D'Aosta/Vallée D'Aoste\r\nValle D'Aosta/Vallée D'Aoste", "Valle d'Aosta")
    
        italy_df = pd.read_csv('data/Regional Data - Sheet1.csv', index_col=0, header=1, parse_dates=[0])
    
        italy_df = italy_df[italy_df['Region'] != 'NA']
    
        cases_df = italy_df.iloc[:, :3]
        cases_df['Date'] = cases_df.index
        pivoted = cases_df.pivot(values='New positives', index='Date', columns='Region')
        pivoted.columns = pivoted.columns.astype(str)
        pivoted = pivoted.rename(columns={'nan': 'Unknown Region'})
    
        cases_gdf = pivoted.T
        cases_gdf['geometry'] = cases_gdf.index.map(region_gdf.set_index('NOME_REG')['geometry'].to_dict())
    
        cases_gdf = cases_gdf[cases_gdf['geometry'].notna()]
    
        cases_gdf = geopandas.GeoDataFrame(cases_gdf, crs=region_gdf.crs, geometry=cases_gdf.geometry)
    
        gdf = cases_gdf
    
        result = gdf.iloc[:, :22]
        result['geometry'] = gdf.iloc[:, -1:]['geometry']
        gdf = result
    
        map_chart = gdf.plot_animated(basemap_format={'source': contextily.providers.Stamen.Terrain}, cmap='viridis')
    
        cases_df = pivoted
        cases_df = cases_df.iloc[:22, :]
    
        from datetime import datetime
    
        bar_chart = cases_df.sum(axis=1).plot_animated(
            kind='line',
            label_events={
                'Schools Close': datetime.strptime("4/03/2020", "%d/%m/%Y"),
                'Phase I Lockdown': datetime.strptime("11/03/2020", "%d/%m/%Y"),
                # '1M Global Cases': datetime.strptime("02/04/2020", "%d/%m/%Y"),
                # '100k Global Deaths': datetime.strptime("10/04/2020", "%d/%m/%Y"),
                # 'Manufacturing Reopens': datetime.strptime("26/04/2020", "%d/%m/%Y"),
                # 'Phase II Lockdown': datetime.strptime("4/05/2020", "%d/%m/%Y"),
            },
            fill_under_line_color="blue",
            add_legend=False
        )
    
        map_chart.ax.set_title('Cases by Location')
    
        line_chart = (
            cases_df.sum(axis=1)
                .cumsum()
                .fillna(0)
                .plot_animated(kind="line", period_label=False, title="Cumulative Total Cases", add_legend=False)
        )
    
        def current_total(values):
            total = values.sum()
            s = f'Total : {int(total)}'
            return {'x': .85, 'y': .1, 's': s, 'ha': 'right', 'size': 11}
    
        race_chart = cases_df.cumsum().plot_animated(
            n_visible=5, title="Cases by Region", period_label=False, period_summary_func=current_total
        )
    
        import time
    
        timestr = time.strftime("%d/%m/%Y")
    
        plots = [bar_chart, race_chart, map_chart, line_chart]
    
        # Otherwise titles overlap and adjust_subplot does nothing
        from matplotlib import rcParams
        from matplotlib.animation import FuncAnimation
    
        rcParams.update({"figure.autolayout": False})
        # make sure figures are `Figure()` instances
        figs = plt.Figure()
        gs = figs.add_gridspec(2, 3, hspace=0.5)
        f3_ax1 = figs.add_subplot(gs[0, :])
        f3_ax1.set_title(bar_chart.title)
        bar_chart.ax = f3_ax1
    
        f3_ax2 = figs.add_subplot(gs[1, 0])
        f3_ax2.set_title(race_chart.title)
        race_chart.ax = f3_ax2
    
        f3_ax3 = figs.add_subplot(gs[1, 1])
        f3_ax3.set_title(map_chart.title)
        map_chart.ax = f3_ax3
    
        f3_ax4 = figs.add_subplot(gs[1, 2])
        f3_ax4.set_title(line_chart.title)
        line_chart.ax = f3_ax4
    
        axes = [f3_ax1, f3_ax2, f3_ax3, f3_ax4]
        timestr = cases_df.index.max().strftime("%d/%m/%Y")
        figs.suptitle(f"Italy COVID-19 Confirmed Cases up to {timestr}")
    
        pandas_alive.animate_multiple_plots(
            'examples/italy-covid.gif',
            plots,
            figs,
            enable_progress_bar=True
        )
    

    15 单摆运动

    def simple():
        import pandas as pd
        import matplotlib.pyplot as plt
        import pandas_alive
        import numpy as np
    
        # Physical constants
        g = 9.81
        L = .4
        mu = 0.2
    
        THETA_0 = np.pi * 70 / 180  # init angle = 70degs
        THETA_DOT_0 = 0  # no init angVel
        DELTA_T = 0.01  # time stepping
        T = 1.5  # time period
    
        # Definition of ODE (ordinary differential equation)
        def get_theta_double_dot(theta, theta_dot):
            return -mu * theta_dot - (g / L) * np.sin(theta)
    
        # Solution to the differential equation
        def pendulum(t):
            # initialise changing values
            theta = THETA_0
            theta_dot = THETA_DOT_0
            delta_t = DELTA_T
            ang = []
            ang_vel = []
            ang_acc = []
            times = []
            for time in np.arange(0, t, delta_t):
                theta_double_dot = get_theta_double_dot(
                    theta, theta_dot
                )
                theta += theta_dot * delta_t
                theta_dot += theta_double_dot * delta_t
                times.append(time)
                ang.append(theta)
                ang_vel.append(theta_dot)
                ang_acc.append(theta_double_dot)
            data = np.array([ang, ang_vel, ang_acc])
            return pd.DataFrame(data=data.T, index=np.array(times), columns=["angle", "ang_vel", "ang_acc"])
    
        # units used for ref: ["angle [rad]", "ang_vel [rad/s]", "ang_acc [rad/s^2]"]
        df = pendulum(T)
        df.index.names = ["Time (s)"]
        print(df)
    
        # generate dataFrame for animated bubble plot
        df2 = pd.DataFrame(index=df.index)
        df2["dx (m)"] = L * np.sin(df["angle"])
        df2["dy (m)"] = -L * np.cos(df["angle"])
        df2["ang_vel"] = abs(df["ang_vel"])
        df2["size"] = df2["ang_vel"] * 100  # scale angular vels to get nice size on bubble plot
        print(df2)
    
        # static pandas plots
        #
        # print(plt.style.available)
        # NOTE: 2 lines below required in Jupyter to switch styles correctly
        plt.rcParams.update(plt.rcParamsDefault)
        plt.style.use("ggplot")  # set plot style
    
        fig, (ax1a, ax2b) = plt.subplots(1, 2, figsize=(8, 4), dpi=100)  # 1 row, 2 subplots
        # fig.subplots_adjust(wspace=0.1)      # space subplots in row
        fig.set_tight_layout(True)
        fontsize = "small"
    
        df.plot(ax=ax1a).legend(fontsize=fontsize)
        ax1a.set_title("Outputs vs Time", fontsize="medium")
        ax1a.set_xlabel('Time [s]', fontsize=fontsize)
        ax1a.set_ylabel('Amplitudes', fontsize=fontsize);
    
        df.plot(ax=ax2b, x="angle", y=["ang_vel", "ang_acc"]).legend(fontsize=fontsize)
        ax2b.set_title("Outputs vs Angle | Phase-Space", fontsize="medium")
        ax2b.set_xlabel('Angle [rad]', fontsize=fontsize)
        ax2b.set_ylabel('Angular Velocity / Acc', fontsize=fontsize)
    
        # sample scatter plot with colorbar
        fig, ax = plt.subplots()
        sc = ax.scatter(df2["dx (m)"], df2["dy (m)"], s=df2["size"] * .1, c=df2["ang_vel"], cmap="jet")
        cbar = fig.colorbar(sc)
        cbar.set_label(label="ang_vel [rad/s]", fontsize="small")
        # sc.set_clim(350, 400)
        ax.tick_params(labelrotation=0, labelsize="medium")
        ax_scale = 1.
        ax.set_xlim(-L * ax_scale, L * ax_scale)
        ax.set_ylim(-L * ax_scale - 0.1, L * ax_scale - 0.1)
        # make axes square: a circle shows as a circle
        ax.set_aspect(1 / ax.get_data_ratio())
        ax.arrow(0, 0, df2["dx (m)"].iloc[-1], df2["dy (m)"].iloc[-1],
                 color="dimgray", ls=":", lw=2.5, width=.0, head_width=0, zorder=-1
                 )
        ax.text(0, 0.15, s="size and colour of pendulum bob\nbased on pd column\nfor angular velocity",
                ha='center', va='center')
    
        # plt.show()
    
        dpi = 100
        ax_scale = 1.1
        figsize = (3, 3)
        fontsize = "small"
    
        # set up figure to pass onto `pandas_alive`
        # NOTE: by using Figure (capital F) instead of figure() `FuncAnimation` seems to run twice as fast!
        # fig1, ax1 = plt.subplots()
        fig1 = plt.Figure()
        ax1 = fig1.add_subplot()
        fig1.set_size_inches(figsize)
        ax1.set_title("Simple pendulum animation, L=" + str(L) + "m", fontsize="medium")
        ax1.set_xlabel("Time (s)", color='dimgray', fontsize=fontsize)
        ax1.set_ylabel("Amplitudes", color='dimgray', fontsize=fontsize)
        ax1.tick_params(labelsize=fontsize)
    
        # pandas_alive
        line_chart = df.plot_animated(filename="pend-line.gif", kind='line', period_label={'x': 0.05, 'y': 0.9},
                                      steps_per_period=1, interpolate_period=False, period_length=50,
                                      period_fmt='Time:{x:10.2f}',
                                      enable_progress_bar=True, fixed_max=True, dpi=100, fig=fig1
                                      )
        plt.close()
    
        # Video('examples/pend-line.mp4', html_attributes="controls muted autoplay")
    
        # set up and generate animated scatter plot
        #
    
        # set up figure to pass onto `pandas_alive`
        # NOTE: by using Figure (capital F) instead of figure() `FuncAnimation` seems to run twice as fast!
        fig1sc = plt.Figure()
        ax1sc = fig1sc.add_subplot()
        fig1sc.set_size_inches(figsize)
        ax1sc.set_title("Simple pendulum animation, L=" + str(L) + "m", fontsize="medium")
        ax1sc.set_xlabel("Time (s)", color='dimgray', fontsize=fontsize)
        ax1sc.set_ylabel("Amplitudes", color='dimgray', fontsize=fontsize)
        ax1sc.tick_params(labelsize=fontsize)
    
        # pandas_alive
        scatter_chart = df.plot_animated(filename="pend-scatter.gif", kind='scatter', period_label={'x': 0.05, 'y': 0.9},
                                         steps_per_period=1, interpolate_period=False, period_length=50,
                                         period_fmt='Time:{x:10.2f}',
                                         enable_progress_bar=True, fixed_max=True, dpi=100, fig=fig1sc, size="ang_vel"
                                         )
        plt.close()
    
        print("Points size follows one of the pd columns: ang_vel")
        # Video('./pend-scatter.gif', html_attributes="controls muted autoplay")
    
        # set up and generate animated bar race chart
        #
        # set up figure to pass onto `pandas_alive`
        # NOTE: by using Figure (capital F) instead of figure() `FuncAnimation` seems to run twice as fast!
        fig2 = plt.Figure()
        ax2 = fig2.add_subplot()
        fig2.set_size_inches(figsize)
        ax2.set_title("Simple pendulum animation, L=" + str(L) + "m", fontsize="medium")
        ax2.set_xlabel("Amplitudes", color='dimgray', fontsize=fontsize)
        ax2.set_ylabel("", color='dimgray', fontsize="x-small")
        ax2.tick_params(labelsize=fontsize)
    
        # pandas_alive
        race_chart = df.plot_animated(filename="pend-race.gif", kind='race', period_label={'x': 0.05, 'y': 0.9},
                                      steps_per_period=1, interpolate_period=False, period_length=50,
                                      period_fmt='Time:{x:10.2f}',
                                      enable_progress_bar=True, fixed_max=False, dpi=100, fig=fig2
                                      )
        plt.close()
    
        # set up and generate bubble animated plot
        #
    
        # set up figure to pass onto `pandas_alive`
        # NOTE: by using Figure (capital F) instead of figure() `FuncAnimation` seems to run twice as fast!
        fig3 = plt.Figure()
        ax3 = fig3.add_subplot()
        fig3.set_size_inches(figsize)
        ax3.set_title("Simple pendulum animation, L=" + str(L) + "m", fontsize="medium")
        ax3.set_xlabel("Hor Displacement (m)", color='dimgray', fontsize=fontsize)
        ax3.set_ylabel("Ver Displacement (m)", color='dimgray', fontsize=fontsize)
        # limits & ratio below get the graph square
        ax3.set_xlim(-L * ax_scale, L * ax_scale)
        ax3.set_ylim(-L * ax_scale - 0.1, L * ax_scale - 0.1)
        ratio = 1.  # this is visual ratio of axes
        ax3.set_aspect(ratio / ax3.get_data_ratio())
    
        ax3.arrow(0, 0, df2["dx (m)"].iloc[-1], df2["dy (m)"].iloc[-1],
                  color="dimgray", ls=":", lw=1, width=.0, head_width=0, zorder=-1)
    
        # pandas_alive
        bubble_chart = df2.plot_animated(
            kind="bubble", filename="pend-bubble.gif",
            x_data_label="dx (m)", y_data_label="dy (m)",
            size_data_label="size", color_data_label="ang_vel", cmap="jet",
            period_label={'x': 0.05, 'y': 0.9}, vmin=None, vmax=None,
            steps_per_period=1, interpolate_period=False, period_length=50, period_fmt='Time:{x:10.2f}s',
            enable_progress_bar=True, fixed_max=False, dpi=dpi, fig=fig3
        )
        plt.close()
    
        print("Bubble size & colour animates with pd data column for ang_vel.")
    
        # Combined plots
        #
        fontsize = "x-small"
        # Otherwise titles overlap and subplots_adjust does nothing
        from matplotlib import rcParams
        rcParams.update({"figure.autolayout": False})
    
        figs = plt.Figure(figsize=(9, 4), dpi=100)
        figs.subplots_adjust(wspace=0.1)
        gs = figs.add_gridspec(2, 2)
    
        ax1 = figs.add_subplot(gs[0, 0])
        ax1.set_xlabel("Time(s)", color='dimgray', fontsize=fontsize)
        ax1.set_ylabel("Amplitudes", color='dimgray', fontsize=fontsize)
        ax1.tick_params(labelsize=fontsize)
    
        ax2 = figs.add_subplot(gs[1, 0])
        ax2.set_xlabel("Amplitudes", color='dimgray', fontsize=fontsize)
        ax2.set_ylabel("", color='dimgray', fontsize=fontsize)
        ax2.tick_params(labelsize=fontsize)
    
        ax3 = figs.add_subplot(gs[:, 1])
        ax3.set_xlabel("Hor Displacement (m)", color='dimgray', fontsize=fontsize)
        ax3.set_ylabel("Ver Displacement (m)", color='dimgray', fontsize=fontsize)
        ax3.tick_params(labelsize=fontsize)
        # limits & ratio below get the graph square
        ax3.set_xlim(-L * ax_scale, L * ax_scale)
        ax3.set_ylim(-L * ax_scale - 0.1, L * ax_scale - 0.1)
        ratio = 1.  # this is visual ratio of axes
        ax3.set_aspect(ratio / ax3.get_data_ratio())
    
        line_chart.ax = ax1
        race_chart.ax = ax2
        bubble_chart.ax = ax3
    
        plots = [line_chart, race_chart, bubble_chart]
        # pandas_alive combined using custom figure
        pandas_alive.animate_multiple_plots(
            filename='pend-combined.gif', plots=plots, custom_fig=figs, dpi=100, enable_progress_bar=True,
            adjust_subplot_left=0.2, adjust_subplot_right=None,
            title="Simple pendulum animations, L=" + str(L) + "m", title_fontsize="medium"
        )
        plt.close()
    

    最后如果你想完成中文动态图表的制作,加入中文显示代码即可。

    # 中文显示
    plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows
    plt.rcParams['font.sans-serif'] = ['Hiragino Sans GB'] # Mac
    plt.rcParams['axes.unicode_minus'] = False
    
    # 读取数据
    df_result = pd.read_csv('data/yuhuanshui.csv', index_col=0, parse_dates=[0])
    # 生成图表
    animated_line_chart = df_result.diff().fillna(0).plot_animated(kind='line', period_label=False, add_legend=False)
    animated_bar_chart = df_result.plot_animated(n_visible=10)
    pandas_alive.animate_multiple_plots('examples/yuhuanshui.gif',
                                        [animated_bar_chart, animated_line_chart], enable_progress_bar=True,
                                        title='我是余欢水演职人员热度排行')
    

    还是使用演员的百度指数数据。

    下载方式

    我把CSV文件及相关代码进行打包共享了,需要的同学可以后台回复关键字动态图」获取~

    展开全文
  • 点击 机器学习算法与Python学习 ,选择加星标精彩内容不迷路关于动态条形图,以前推荐过「Bar Chart Race」这个库。三行代码就能实现动态条形图的绘制。有些同学在使用的时候,...

    点击 机器学习算法与Python学习选择加星标

    精彩内容不迷路

    关于动态条形图,以前推荐过Bar Chart Race」这个库。三行代码就能实现动态条形图的绘制。

    有些同学在使用的时候,会出现一些错误。一个是加载文件报错,另一个是生成GIF的时候报错。

    这是因为作者的示例是网络加载数据,会读取不到。通过读取本地文件,就不会出错。

    GIF生成失败一般是需要安装imagemagick(图片处理工具)。

    最近小F又发现一个可视化图库Pandas_Alive」,不仅包含动态条形图,还可以绘制动态曲线图、气泡图、饼状图、地图

    同样也是几行代码就能完成动态图表的绘制。

    GitHub地址:

    https://github.com/JackMcKew/pandas_alive

    使用文档:https://jackmckew.github.io/pandas_alive/

    安装版本建议是0.2.3matplotlib版本是3.2.1

    同时需自行安装tqdm(显示进度条)和descartes(绘制地图相关库)。

    要不然会出现报错,估计是作者的requestment.txt没包含这两个库。

    好了,成功安装后就可以引入这个第三方库,直接选择加载本地文件。

    import pandas_alive
    import pandas as pd
    
    covid_df = pd.read_csv( data/covid19.csv , index_col=0, parse_dates=[0])
    covid_df.plot_animated(filename= examples/example-barh-chart.gif , n_visible=15)
    

    生成了一个GIF图,具体如下。

    刚开始学习这个库的时候,大家可以减少数据,这样生成GIF的时间就会快一些

    比如小F在接下来的实践中,基本都只选取了20天左右的数据。

    对于其他图表,我们可以查看官方文档的API说明,得以了解。

    下面我们就来看看其他动态图表的绘制方法吧!

    01 动态条形图

    elec_df = pd.read_csv("data/Aus_Elec_Gen_1980_2018.csv", index_col=0, parse_dates=[0], thousands= , )
    elec_df = elec_df.iloc[:20, :]
    elec_df.fillna(0).plot_animated( examples/example-electricity-generated-australia.gif , period_fmt="%Y",
                                    title= Australian Electricity Generation Sources 1980-2018 )
    
    

    02 动态柱状图

    covid_df = pd.read_csv( data/covid19.csv , index_col=0, parse_dates=[0])
    covid_df.plot_animated(filename= examples/example-barv-chart.gif , orientation= v , n_visible=15)
    

    03 动态曲线图

    covid_df = pd.read_csv( data/covid19.csv , index_col=0, parse_dates=[0])
    covid_df.diff().fillna(0).plot_animated(filename= examples/example-line-chart.gif , kind= line , period_label={ x : 0.25,  y : 0.9})
    


    04 动态面积图

    covid_df = pd.read_csv( data/covid19.csv , index_col=0, parse_dates=[0])
    covid_df.sum(axis=1).fillna(0).plot_animated(filename= examples/example-bar-chart.gif , kind= bar ,
            period_label={ x : 0.1,  y : 0.9},
            enable_progress_bar=True, steps_per_period=2, interpolate_period=True, period_length=200
    )
    

    05 动态散点图

    max_temp_df = pd.read_csv(
        "data/Newcastle_Australia_Max_Temps.csv",
        parse_dates={"Timestamp": ["Year", "Month", "Day"]},
    )
    min_temp_df = pd.read_csv(
        "data/Newcastle_Australia_Min_Temps.csv",
        parse_dates={"Timestamp": ["Year", "Month", "Day"]},
    )
    
    max_temp_df = max_temp_df.iloc[:5000, :]
    min_temp_df = min_temp_df.iloc[:5000, :]
    
    merged_temp_df = pd.merge_asof(max_temp_df, min_temp_df, on="Timestamp")
    merged_temp_df.index = pd.to_datetime(merged_temp_df["Timestamp"].dt.strftime( %Y/%m/%d ))
    
    keep_columns = ["Minimum temperature (Degree C)", "Maximum temperature (Degree C)"]
    merged_temp_df[keep_columns].resample("Y").mean().plot_animated(filename= examples/example-scatter-chart.gif , kind="scatter",
                                                                    title= Max & Min Temperature Newcastle, Australia )
    
    

    06 动态饼状图

    covid_df = pd.read_csv( data/covid19.csv , index_col=0, parse_dates=[0])
    covid_df.plot_animated(filename= examples/example-pie-chart.gif , kind="pie",
                           rotatelabels=True, period_label={ x : 0,  y : 0})
    

    07 动态气泡图

    multi_index_df = pd.read_csv("data/multi.csv", header=[0, 1], index_col=0)
    multi_index_df.index = pd.to_datetime(multi_index_df.index, dayfirst=True)
    
    map_chart = multi_index_df.plot_animated(
        kind="bubble",
        filename="examples/example-bubble-chart.gif",
        x_data_label="Longitude",
        y_data_label="Latitude",
        size_data_label="Cases",
        color_data_label="Cases",
        vmax=5, steps_per_period=3, interpolate_period=True, period_length=500,
        dpi=100
    )
    

    08 地理空间点图表

    import geopandas
    import pandas_alive
    import contextily
    
    gdf = geopandas.read_file( data/nsw-covid19-cases-by-postcode.gpkg )
    gdf.index = gdf.postcode
    gdf = gdf.drop( postcode ,axis=1)
    
    result = gdf.iloc[:, :20]
    result[ geometry ] = gdf.iloc[:, -1:][ geometry ]
    
    map_chart = result.plot_animated(filename= examples/example-geo-point-chart.gif ,
                                     basemap_format={ source :contextily.providers.Stamen.Terrain})
    
    

    09 多边形地理图表

    import geopandas
    import pandas_alive
    import contextily
    
    gdf = geopandas.read_file( data/italy-covid-region.gpkg )
    gdf.index = gdf.region
    gdf = gdf.drop( region ,axis=1)
    
    result = gdf.iloc[:, :20]
    result[ geometry ] = gdf.iloc[:, -1:][ geometry ]
    
    map_chart = result.plot_animated(filename= examples/example-geo-polygon-chart.gif ,
                                     basemap_format={ source : contextily.providers.Stamen.Terrain})
    

    10 多个动态图表

    covid_df = pd.read_csv( data/covid19.csv , index_col=0, parse_dates=[0])
    
    animated_line_chart = covid_df.diff().fillna(0).plot_animated(kind= line , period_label=False,add_legend=False)
    animated_bar_chart = covid_df.plot_animated(n_visible=10)
    
    pandas_alive.animate_multiple_plots( examples/example-bar-and-line-chart.gif ,
                                        [animated_bar_chart, animated_line_chart], enable_progress_bar=True)
    
    

    11 城市人口

    def population():
        urban_df = pd.read_csv("data/urban_pop.csv", index_col=0, parse_dates=[0])
    
        animated_line_chart = (
            urban_df.sum(axis=1)
                .pct_change()
                .fillna(method= bfill )
                .mul(100)
                .plot_animated(kind="line", title="Total % Change in Population", period_label=False, add_legend=False)
        )
    
        animated_bar_chart = urban_df.plot_animated(n_visible=10, title= Top 10 Populous Countries , period_fmt="%Y")
    
        pandas_alive.animate_multiple_plots( examples/example-bar-and-line-urban-chart.gif ,
                                            [animated_bar_chart, animated_line_chart],
                                            title= Urban Population 1977 - 2018 , adjust_subplot_top=0.85,
                                            enable_progress_bar=True)
    

    12 G7国家平均寿命

    def life():
        data_raw = pd.read_csv("data/long.csv")
    
        list_G7 = [
            "Canada",
            "France",
            "Germany",
            "Italy",
            "Japan",
            "United Kingdom",
            "United States",
        ]
    
        data_raw = data_raw.pivot(
            index="Year", columns="Entity", values="Life expectancy (Gapminder, UN)"
        )
    
        data = pd.DataFrame()
        data["Year"] = data_raw.reset_index()["Year"]
        for country in list_G7:
            data[country] = data_raw[country].values
    
        data = data.fillna(method="pad")
        data = data.fillna(0)
        data = data.set_index("Year").loc[1900:].reset_index()
    
        data["Year"] = pd.to_datetime(data.reset_index()["Year"].astype(str))
    
        data = data.set_index("Year")
        data = data.iloc[:25, :]
    
        animated_bar_chart = data.plot_animated(
            period_fmt="%Y", perpendicular_bar_func="mean", period_length=200, fixed_max=True
        )
    
        animated_line_chart = data.plot_animated(
            kind="line", period_fmt="%Y", period_length=200, fixed_max=True
        )
    
        pandas_alive.animate_multiple_plots(
            "examples/life-expectancy.gif",
            plots=[animated_bar_chart, animated_line_chart],
            title="Life expectancy in G7 countries up to 2015",
            adjust_subplot_left=0.2, adjust_subplot_top=0.9, enable_progress_bar=True
        )
    

    13 新南威尔斯州COVID可视化

    def nsw():
        import geopandas
        import pandas as pd
        import pandas_alive
        import contextily
        import matplotlib.pyplot as plt
        import json
    
        with open( data/package_show.json ,  r , encoding= utf8 )as fp:
            data = json.load(fp)
    
        # Extract url to csv component
        covid_nsw_data_url = data["result"]["resources"][0]["url"]
        print(covid_nsw_data_url)
    
        # Read csv from data API url
        nsw_covid = pd.read_csv( data/confirmed_cases_table1_location.csv )
        postcode_dataset = pd.read_csv("data/postcode-data.csv")
    
        # Prepare data from NSW health dataset
    
        nsw_covid = nsw_covid.fillna(9999)
        nsw_covid["postcode"] = nsw_covid["postcode"].astype(int)
    
        grouped_df = nsw_covid.groupby(["notification_date", "postcode"]).size()
        grouped_df = pd.DataFrame(grouped_df).unstack()
        grouped_df.columns = grouped_df.columns.droplevel().astype(str)
    
        grouped_df = grouped_df.fillna(0)
        grouped_df.index = pd.to_datetime(grouped_df.index)
    
        cases_df = grouped_df
    
        # Clean data in postcode dataset prior to matching
    
        grouped_df = grouped_df.T
        postcode_dataset = postcode_dataset[postcode_dataset[ Longitude ].notna()]
        postcode_dataset = postcode_dataset[postcode_dataset[ Longitude ] != 0]
        postcode_dataset = postcode_dataset[postcode_dataset[ Latitude ].notna()]
        postcode_dataset = postcode_dataset[postcode_dataset[ Latitude ] != 0]
        postcode_dataset[ Postcode ] = postcode_dataset[ Postcode ].astype(str)
    
        # Build GeoDataFrame from Lat Long dataset and make map chart
        grouped_df[ Longitude ] = grouped_df.index.map(postcode_dataset.set_index( Postcode )[ Longitude ].to_dict())
        grouped_df[ Latitude ] = grouped_df.index.map(postcode_dataset.set_index( Postcode )[ Latitude ].to_dict())
        gdf = geopandas.GeoDataFrame(
            grouped_df, geometry=geopandas.points_from_xy(grouped_df.Longitude, grouped_df.Latitude), crs="EPSG:4326")
        gdf = gdf.dropna()
    
        # Prepare GeoDataFrame for writing to geopackage
        gdf = gdf.drop([ Longitude ,  Latitude ], axis=1)
        gdf.columns = gdf.columns.astype(str)
        gdf[ postcode ] = gdf.index
        # gdf.to_file("data/nsw-covid19-cases-by-postcode.gpkg", layer= nsw-postcode-covid , driver="GPKG")
    
        # Prepare GeoDataFrame for plotting
        gdf.index = gdf.postcode
        gdf = gdf.drop( postcode , axis=1)
        gdf = gdf.to_crs("EPSG:3857")  # Web Mercator
    
        result = gdf.iloc[:, :22]
        result[ geometry ] = gdf.iloc[:, -1:][ geometry ]
        gdf = result
    
        map_chart = gdf.plot_animated(basemap_format={ source : contextily.providers.Stamen.Terrain}, cmap= cool )
    
        # cases_df.to_csv( data/nsw-covid-cases-by-postcode.csv )
        cases_df = cases_df.iloc[:22, :]
    
        from datetime import datetime
    
        bar_chart = cases_df.sum(axis=1).plot_animated(
            kind= line ,
            label_events={
                 Ruby Princess Disembark : datetime.strptime("19/03/2020", "%d/%m/%Y"),
                #  Lockdown : datetime.strptime("31/03/2020", "%d/%m/%Y")
            },
            fill_under_line_color="blue",
            add_legend=False
        )
    
        map_chart.ax.set_title( Cases by Location )
    
        grouped_df = pd.read_csv( data/nsw-covid-cases-by-postcode.csv , index_col=0, parse_dates=[0])
        grouped_df = grouped_df.iloc[:22, :]
    
        line_chart = (
            grouped_df.sum(axis=1)
                .cumsum()
                .fillna(0)
                .plot_animated(kind="line", period_label=False, title="Cumulative Total Cases", add_legend=False)
        )
    
        def current_total(values):
            total = values.sum()
            s = f Total : {int(total)} 
            return { x : .85,  y : .2,  s : s,  ha :  right ,  size : 11}
    
        race_chart = grouped_df.cumsum().plot_animated(
            n_visible=5, title="Cases by Postcode", period_label=False, period_summary_func=current_total
        )
    
        import time
    
        timestr = time.strftime("%d/%m/%Y")
    
        plots = [bar_chart, line_chart, map_chart, race_chart]
    
        from matplotlib import rcParams
    
        rcParams.update({"figure.autolayout": False})
        # make sure figures are `Figure()` instances
        figs = plt.Figure()
        gs = figs.add_gridspec(2, 3, hspace=0.5)
        f3_ax1 = figs.add_subplot(gs[0, :])
        f3_ax1.set_title(bar_chart.title)
        bar_chart.ax = f3_ax1
    
        f3_ax2 = figs.add_subplot(gs[1, 0])
        f3_ax2.set_title(line_chart.title)
        line_chart.ax = f3_ax2
    
        f3_ax3 = figs.add_subplot(gs[1, 1])
        f3_ax3.set_title(map_chart.title)
        map_chart.ax = f3_ax3
    
        f3_ax4 = figs.add_subplot(gs[1, 2])
        f3_ax4.set_title(race_chart.title)
        race_chart.ax = f3_ax4
    
        timestr = cases_df.index.max().strftime("%d/%m/%Y")
        figs.suptitle(f"NSW COVID-19 Confirmed Cases up to {timestr}")
    
        pandas_alive.animate_multiple_plots(
             examples/nsw-covid.gif ,
            plots,
            figs,
            enable_progress_bar=True
        )
    

    14 意大利COVID可视化

    def italy():
        import geopandas
        import pandas as pd
        import pandas_alive
        import contextily
        import matplotlib.pyplot as plt
    
        region_gdf = geopandas.read_file( data/geo-data/italy-with-regions )
        region_gdf.NOME_REG = region_gdf.NOME_REG.str.lower().str.title()
        region_gdf = region_gdf.replace( Trentino-Alto Adige/Sudtirol ,  Trentino-Alto Adige )
        region_gdf = region_gdf.replace("Valle D Aosta/Vallée D Aoste
    Valle D Aosta/Vallée D Aoste", "Valle d Aosta")
    
        italy_df = pd.read_csv( data/Regional Data - Sheet1.csv , index_col=0, header=1, parse_dates=[0])
    
        italy_df = italy_df[italy_df[ Region ] !=  NA ]
    
        cases_df = italy_df.iloc[:, :3]
        cases_df[ Date ] = cases_df.index
        pivoted = cases_df.pivot(values= New positives , index= Date , columns= Region )
        pivoted.columns = pivoted.columns.astype(str)
        pivoted = pivoted.rename(columns={ nan :  Unknown Region })
    
        cases_gdf = pivoted.T
        cases_gdf[ geometry ] = cases_gdf.index.map(region_gdf.set_index( NOME_REG )[ geometry ].to_dict())
    
        cases_gdf = cases_gdf[cases_gdf[ geometry ].notna()]
    
        cases_gdf = geopandas.GeoDataFrame(cases_gdf, crs=region_gdf.crs, geometry=cases_gdf.geometry)
    
        gdf = cases_gdf
    
        result = gdf.iloc[:, :22]
        result[ geometry ] = gdf.iloc[:, -1:][ geometry ]
        gdf = result
    
        map_chart = gdf.plot_animated(basemap_format={ source : contextily.providers.Stamen.Terrain}, cmap= viridis )
    
        cases_df = pivoted
        cases_df = cases_df.iloc[:22, :]
    
        from datetime import datetime
    
        bar_chart = cases_df.sum(axis=1).plot_animated(
            kind= line ,
            label_events={
                 Schools Close : datetime.strptime("4/03/2020", "%d/%m/%Y"),
                 Phase I Lockdown : datetime.strptime("11/03/2020", "%d/%m/%Y"),
                #  1M Global Cases : datetime.strptime("02/04/2020", "%d/%m/%Y"),
                #  100k Global Deaths : datetime.strptime("10/04/2020", "%d/%m/%Y"),
                #  Manufacturing Reopens : datetime.strptime("26/04/2020", "%d/%m/%Y"),
                #  Phase II Lockdown : datetime.strptime("4/05/2020", "%d/%m/%Y"),
            },
            fill_under_line_color="blue",
            add_legend=False
        )
    
        map_chart.ax.set_title( Cases by Location )
    
        line_chart = (
            cases_df.sum(axis=1)
                .cumsum()
                .fillna(0)
                .plot_animated(kind="line", period_label=False, title="Cumulative Total Cases", add_legend=False)
        )
    
        def current_total(values):
            total = values.sum()
            s = f Total : {int(total)} 
            return { x : .85,  y : .1,  s : s,  ha :  right ,  size : 11}
    
        race_chart = cases_df.cumsum().plot_animated(
            n_visible=5, title="Cases by Region", period_label=False, period_summary_func=current_total
        )
    
        import time
    
        timestr = time.strftime("%d/%m/%Y")
    
        plots = [bar_chart, race_chart, map_chart, line_chart]
    
        # Otherwise titles overlap and adjust_subplot does nothing
        from matplotlib import rcParams
        from matplotlib.animation import FuncAnimation
    
        rcParams.update({"figure.autolayout": False})
        # make sure figures are `Figure()` instances
        figs = plt.Figure()
        gs = figs.add_gridspec(2, 3, hspace=0.5)
        f3_ax1 = figs.add_subplot(gs[0, :])
        f3_ax1.set_title(bar_chart.title)
        bar_chart.ax = f3_ax1
    
        f3_ax2 = figs.add_subplot(gs[1, 0])
        f3_ax2.set_title(race_chart.title)
        race_chart.ax = f3_ax2
    
        f3_ax3 = figs.add_subplot(gs[1, 1])
        f3_ax3.set_title(map_chart.title)
        map_chart.ax = f3_ax3
    
        f3_ax4 = figs.add_subplot(gs[1, 2])
        f3_ax4.set_title(line_chart.title)
        line_chart.ax = f3_ax4
    
        axes = [f3_ax1, f3_ax2, f3_ax3, f3_ax4]
        timestr = cases_df.index.max().strftime("%d/%m/%Y")
        figs.suptitle(f"Italy COVID-19 Confirmed Cases up to {timestr}")
    
        pandas_alive.animate_multiple_plots(
             examples/italy-covid.gif ,
            plots,
            figs,
            enable_progress_bar=True
        )
    

    15 单摆运动

    def simple():
        import pandas as pd
        import matplotlib.pyplot as plt
        import pandas_alive
        import numpy as np
    
        # Physical constants
        g = 9.81
        L = .4
        mu = 0.2
    
        THETA_0 = np.pi * 70 / 180  # init angle = 70degs
        THETA_DOT_0 = 0  # no init angVel
        DELTA_T = 0.01  # time stepping
        T = 1.5  # time period
    
        # Definition of ODE (ordinary differential equation)
        def get_theta_double_dot(theta, theta_dot):
            return -mu * theta_dot - (g / L) * np.sin(theta)
    
        # Solution to the differential equation
        def pendulum(t):
            # initialise changing values
            theta = THETA_0
            theta_dot = THETA_DOT_0
            delta_t = DELTA_T
            ang = []
            ang_vel = []
            ang_acc = []
            times = []
            for time in np.arange(0, t, delta_t):
                theta_double_dot = get_theta_double_dot(
                    theta, theta_dot
                )
                theta += theta_dot * delta_t
                theta_dot += theta_double_dot * delta_t
                times.append(time)
                ang.append(theta)
                ang_vel.append(theta_dot)
                ang_acc.append(theta_double_dot)
            data = np.array([ang, ang_vel, ang_acc])
            return pd.DataFrame(data=data.T, index=np.array(times), columns=["angle", "ang_vel", "ang_acc"])
    
        # units used for ref: ["angle [rad]", "ang_vel [rad/s]", "ang_acc [rad/s^2]"]
        df = pendulum(T)
        df.index.names = ["Time (s)"]
        print(df)
    
        # generate dataFrame for animated bubble plot
        df2 = pd.DataFrame(index=df.index)
        df2["dx (m)"] = L * np.sin(df["angle"])
        df2["dy (m)"] = -L * np.cos(df["angle"])
        df2["ang_vel"] = abs(df["ang_vel"])
        df2["size"] = df2["ang_vel"] * 100  # scale angular vels to get nice size on bubble plot
        print(df2)
    
        # static pandas plots
        #
        # print(plt.style.available)
        # NOTE: 2 lines below required in Jupyter to switch styles correctly
        plt.rcParams.update(plt.rcParamsDefault)
        plt.style.use("ggplot")  # set plot style
    
        fig, (ax1a, ax2b) = plt.subplots(1, 2, figsize=(8, 4), dpi=100)  # 1 row, 2 subplots
        # fig.subplots_adjust(wspace=0.1)      # space subplots in row
        fig.set_tight_layout(True)
        fontsize = "small"
    
        df.plot(ax=ax1a).legend(fontsize=fontsize)
        ax1a.set_title("Outputs vs Time", fontsize="medium")
        ax1a.set_xlabel( Time [s] , fontsize=fontsize)
        ax1a.set_ylabel( Amplitudes , fontsize=fontsize);
    
        df.plot(ax=ax2b, x="angle", y=["ang_vel", "ang_acc"]).legend(fontsize=fontsize)
        ax2b.set_title("Outputs vs Angle | Phase-Space", fontsize="medium")
        ax2b.set_xlabel( Angle [rad] , fontsize=fontsize)
        ax2b.set_ylabel( Angular Velocity / Acc , fontsize=fontsize)
    
        # sample scatter plot with colorbar
        fig, ax = plt.subplots()
        sc = ax.scatter(df2["dx (m)"], df2["dy (m)"], s=df2["size"] * .1, c=df2["ang_vel"], cmap="jet")
        cbar = fig.colorbar(sc)
        cbar.set_label(label="ang_vel [rad/s]", fontsize="small")
        # sc.set_clim(350, 400)
        ax.tick_params(labelrotation=0, labelsize="medium")
        ax_scale = 1.
        ax.set_xlim(-L * ax_scale, L * ax_scale)
        ax.set_ylim(-L * ax_scale - 0.1, L * ax_scale - 0.1)
        # make axes square: a circle shows as a circle
        ax.set_aspect(1 / ax.get_data_ratio())
        ax.arrow(0, 0, df2["dx (m)"].iloc[-1], df2["dy (m)"].iloc[-1],
                 color="dimgray", ls=":", lw=2.5, width=.0, head_width=0, zorder=-1
                 )
        ax.text(0, 0.15, s="size and colour of pendulum bob
    based on pd column
    for angular velocity",
                ha= center , va= center )
    
        # plt.show()
    
        dpi = 100
        ax_scale = 1.1
        figsize = (3, 3)
        fontsize = "small"
    
        # set up figure to pass onto `pandas_alive`
        # NOTE: by using Figure (capital F) instead of figure() `FuncAnimation` seems to run twice as fast!
        # fig1, ax1 = plt.subplots()
        fig1 = plt.Figure()
        ax1 = fig1.add_subplot()
        fig1.set_size_inches(figsize)
        ax1.set_title("Simple pendulum animation, L=" + str(L) + "m", fontsize="medium")
        ax1.set_xlabel("Time (s)", color= dimgray , fontsize=fontsize)
        ax1.set_ylabel("Amplitudes", color= dimgray , fontsize=fontsize)
        ax1.tick_params(labelsize=fontsize)
    
        # pandas_alive
        line_chart = df.plot_animated(filename="pend-line.gif", kind= line , period_label={ x : 0.05,  y : 0.9},
                                      steps_per_period=1, interpolate_period=False, period_length=50,
                                      period_fmt= Time:{x:10.2f} ,
                                      enable_progress_bar=True, fixed_max=True, dpi=100, fig=fig1
                                      )
        plt.close()
    
        # Video( examples/pend-line.mp4 , html_attributes="controls muted autoplay")
    
        # set up and generate animated scatter plot
        #
    
        # set up figure to pass onto `pandas_alive`
        # NOTE: by using Figure (capital F) instead of figure() `FuncAnimation` seems to run twice as fast!
        fig1sc = plt.Figure()
        ax1sc = fig1sc.add_subplot()
        fig1sc.set_size_inches(figsize)
        ax1sc.set_title("Simple pendulum animation, L=" + str(L) + "m", fontsize="medium")
        ax1sc.set_xlabel("Time (s)", color= dimgray , fontsize=fontsize)
        ax1sc.set_ylabel("Amplitudes", color= dimgray , fontsize=fontsize)
        ax1sc.tick_params(labelsize=fontsize)
    
        # pandas_alive
        scatter_chart = df.plot_animated(filename="pend-scatter.gif", kind= scatter , period_label={ x : 0.05,  y : 0.9},
                                         steps_per_period=1, interpolate_period=False, period_length=50,
                                         period_fmt= Time:{x:10.2f} ,
                                         enable_progress_bar=True, fixed_max=True, dpi=100, fig=fig1sc, size="ang_vel"
                                         )
        plt.close()
    
        print("Points size follows one of the pd columns: ang_vel")
        # Video( ./pend-scatter.gif , html_attributes="controls muted autoplay")
    
        # set up and generate animated bar race chart
        #
        # set up figure to pass onto `pandas_alive`
        # NOTE: by using Figure (capital F) instead of figure() `FuncAnimation` seems to run twice as fast!
        fig2 = plt.Figure()
        ax2 = fig2.add_subplot()
        fig2.set_size_inches(figsize)
        ax2.set_title("Simple pendulum animation, L=" + str(L) + "m", fontsize="medium")
        ax2.set_xlabel("Amplitudes", color= dimgray , fontsize=fontsize)
        ax2.set_ylabel("", color= dimgray , fontsize="x-small")
        ax2.tick_params(labelsize=fontsize)
    
        # pandas_alive
        race_chart = df.plot_animated(filename="pend-race.gif", kind= race , period_label={ x : 0.05,  y : 0.9},
                                      steps_per_period=1, interpolate_period=False, period_length=50,
                                      period_fmt= Time:{x:10.2f} ,
                                      enable_progress_bar=True, fixed_max=False, dpi=100, fig=fig2
                                      )
        plt.close()
    
        # set up and generate bubble animated plot
        #
    
        # set up figure to pass onto `pandas_alive`
        # NOTE: by using Figure (capital F) instead of figure() `FuncAnimation` seems to run twice as fast!
        fig3 = plt.Figure()
        ax3 = fig3.add_subplot()
        fig3.set_size_inches(figsize)
        ax3.set_title("Simple pendulum animation, L=" + str(L) + "m", fontsize="medium")
        ax3.set_xlabel("Hor Displacement (m)", color= dimgray , fontsize=fontsize)
        ax3.set_ylabel("Ver Displacement (m)", color= dimgray , fontsize=fontsize)
        # limits & ratio below get the graph square
        ax3.set_xlim(-L * ax_scale, L * ax_scale)
        ax3.set_ylim(-L * ax_scale - 0.1, L * ax_scale - 0.1)
        ratio = 1.  # this is visual ratio of axes
        ax3.set_aspect(ratio / ax3.get_data_ratio())
    
        ax3.arrow(0, 0, df2["dx (m)"].iloc[-1], df2["dy (m)"].iloc[-1],
                  color="dimgray", ls=":", lw=1, width=.0, head_width=0, zorder=-1)
    
        # pandas_alive
        bubble_chart = df2.plot_animated(
            kind="bubble", filename="pend-bubble.gif",
            x_data_label="dx (m)", y_data_label="dy (m)",
            size_data_label="size", color_data_label="ang_vel", cmap="jet",
            period_label={ x : 0.05,  y : 0.9}, vmin=None, vmax=None,
            steps_per_period=1, interpolate_period=False, period_length=50, period_fmt= Time:{x:10.2f}s ,
            enable_progress_bar=True, fixed_max=False, dpi=dpi, fig=fig3
        )
        plt.close()
    
        print("Bubble size & colour animates with pd data column for ang_vel.")
    
        # Combined plots
        #
        fontsize = "x-small"
        # Otherwise titles overlap and subplots_adjust does nothing
        from matplotlib import rcParams
        rcParams.update({"figure.autolayout": False})
    
        figs = plt.Figure(figsize=(9, 4), dpi=100)
        figs.subplots_adjust(wspace=0.1)
        gs = figs.add_gridspec(2, 2)
    
        ax1 = figs.add_subplot(gs[0, 0])
        ax1.set_xlabel("Time(s)", color= dimgray , fontsize=fontsize)
        ax1.set_ylabel("Amplitudes", color= dimgray , fontsize=fontsize)
        ax1.tick_params(labelsize=fontsize)
    
        ax2 = figs.add_subplot(gs[1, 0])
        ax2.set_xlabel("Amplitudes", color= dimgray , fontsize=fontsize)
        ax2.set_ylabel("", color= dimgray , fontsize=fontsize)
        ax2.tick_params(labelsize=fontsize)
    
        ax3 = figs.add_subplot(gs[:, 1])
        ax3.set_xlabel("Hor Displacement (m)", color= dimgray , fontsize=fontsize)
        ax3.set_ylabel("Ver Displacement (m)", color= dimgray , fontsize=fontsize)
        ax3.tick_params(labelsize=fontsize)
        # limits & ratio below get the graph square
        ax3.set_xlim(-L * ax_scale, L * ax_scale)
        ax3.set_ylim(-L * ax_scale - 0.1, L * ax_scale - 0.1)
        ratio = 1.  # this is visual ratio of axes
        ax3.set_aspect(ratio / ax3.get_data_ratio())
    
        line_chart.ax = ax1
        race_chart.ax = ax2
        bubble_chart.ax = ax3
    
        plots = [line_chart, race_chart, bubble_chart]
        # pandas_alive combined using custom figure
        pandas_alive.animate_multiple_plots(
            filename= pend-combined.gif , plots=plots, custom_fig=figs, dpi=100, enable_progress_bar=True,
            adjust_subplot_left=0.2, adjust_subplot_right=None,
            title="Simple pendulum animations, L=" + str(L) + "m", title_fontsize="medium"
        )
        plt.close()
    

    最后如果你想完成中文动态图表的制作,加入中文显示代码即可。

    # 中文显示
    plt.rcParams[ font.sans-serif ] = [ SimHei ]  # Windows
    plt.rcParams[ font.sans-serif ] = [ Hiragino Sans GB ] # Mac
    plt.rcParams[ axes.unicode_minus ] = False
    
    # 读取数据
    df_result = pd.read_csv( data/yuhuanshui.csv , index_col=0, parse_dates=[0])
    # 生成图表
    animated_line_chart = df_result.diff().fillna(0).plot_animated(kind= line , period_label=False, add_legend=False)
    animated_bar_chart = df_result.plot_animated(n_visible=10)
    pandas_alive.animate_multiple_plots( examples/yuhuanshui.gif ,
                                        [animated_bar_chart, animated_line_chart], enable_progress_bar=True,
                                        title= 我是余欢水演职人员热度排行 )
    

    还是使用演员的百度指数数据。

    公众号回复「动态图」,即可获取使用到的CSV文件及相关代码。

    福利时间

    奖品:Python人工智能开发从入门到精通》x 4

    参与方式:文末留言(字数不少于5),赞数最多的4位为本次中奖者

    开奖时间:2020年12月9号20点

    备注:如有问题,请添加小助手微信:MLAPython,备注(姓名-单位-研究方向)

    
    

      你点的每个“在看”,我都认真当成了AI

    展开全文
  • 1. 数据是会骗人的,比起绝对数字,比率更适合作为数据指标 2. 央视新闻报道中使用了炫酷的动态条形图,展现十年黄金周出行人数...4. 使用Python,计算年增长率,使用matplotlib和seaborn库,绘制超级炫酷的动态线形图
  • 相信很多人都看到了用python动态条形图的文章了吧? 既然有了Python这个制作动态条形图工具,缺的那便是数据了。 先看一下B站2019年「数据可视化」版块的情况,第一个视频超2百万的播放量,4万+的弹幕。 用...
  • 至此,我们就完全使用python对疫情数据进行了一次动态可视化,回顾整个过程其实并没有太多过于复杂的步骤,更多的是关于pandas和pyecharts基础功能的使用,最后还是要说一句,疫情仍未散去,大家要继续做好防护!...
  • Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨周萝卜来源丨萝卜大杂烩关于动态图表,相信大家都或...
  • 使用Python生成动态图表,一个很Cool的教程

    万次阅读 多人点赞 2018-09-23 14:40:57
    作者 |Viviane译者 | 刘旭坤编辑 | Jane出品 | AI科技大本营【导读】Matplotlib 和 Seaborn 用来做数据固定的静态图表很不错,但如果...
  • 里面包含了许多对数组进行快速运算的标准数学函数 #pandas是基于numpy构建的,使得数据分析工作变得更快更简单的高级数据结构和操作工具 #seaborn是基于Matplotlib的Python数据可视化库。它提供了一个高级界面,用于...
  • python图表动起来

    2021-01-06 17:15:55
    用Matplotlib和Seaborn这类Python库可以画出很好看的图,但是这些图只是静态的,难以动态且美观地呈现数值变化。要是在你下次的演示、视频、社交媒体Po文里能用短视频呈现数据变化,是不是很赞呢?更棒的是,你还是...
  • 以下文章来源于菜J学Python ,作者J哥 前言 这次呢,我想讲讲地图可视化的内容,以前我也写过用Python的内置库绘制地图,但总感觉不够美观。如何才能在短时间内制作漂亮的可视化地图呢,我觉得Python+可视化工具是...
  • python图表

    2011-05-18 14:08:37
    动态生成图表Python上的东东还真不少。如果要显示结点关系图,可选择 历史最悠久的是Graphviz, 通过pyDot生成DOT文件。如果是需要生成统计图,则pyChart可能更加适合。如果要做三维的图形,可考虑Dislin.如果要...
  • 今天跟大家分享下网易云技术团队前不久免费开放的两个 Python 中文课程:Python数据分析工具秘技60 分钟用 Python 做静动态图表可视化除了开放性中文课程外,还有一份 Py...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 388
精华内容 155
关键字:

python动态图表

python 订阅