精华内容
下载资源
问答
  • 让数据“动”起来:python动态图表制作
    万次阅读 多人点赞
    2020-08-23 10:00:00

    选自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---------

    顺便给大家推荐下我的微信视频号「价值前瞻」,主要分享读书、成长和投资思考,可以了解不一样的我,欢迎扫码关注。
    
    
    
    更多相关内容
  • 关于动态图表,相信大家都或多或少的接触过一些,如果是代码水平比较不错的,可以选择 Matplotlib,当然也可以使用 pyecharts 的相关功能,不过这些工具都专注于图表制作,也就是对于图表的数据,你是需要自行转换...

    大家好

    关于动态图表,相信大家都或多或少的接触过一些,如果是代码水平比较不错的,可以选择 Matplotlib,当然也可以使用 pyecharts 的相关功能,不过这些工具都专注于图表的制作,也就是对于图表的数据,你是需要自行转换的。而今天介绍的这个可视化图库,完美的结合了 Pandas 数据格式,又辅以 Matplotlib 的强大功能,使得我们制作动图变得容易的多了。

    图库简介

    这款给力的可视化图库,就是 pandas_alive,虽然当前在 GitHub 上的 star 数量不是很高,但是相信凭借其强大的功能,崭露头角也是迟早的事情

    项目安装:
    与一般的 Python 库一样,直接使用 pip 安装即可,这里有一点需要注意,就是由于是通过 Matplotlib 来制作动图,所以需要手动安装下 Matplotlib 的依赖工具 imagemagick,这是一个图片处理工具,感兴趣的同学可以自行查看下

    项目功能:
    这款可视化图库,可以支持的图表类型是非常多的,包括动态条形图、动态曲线图、气泡图、饼状图以及地图等等,这些图表差不多可以满足我们日常的使用了

    制图简介

    这里我们就来简单看一下该如何制作动态图表吧,首先是动态条形图,基本4行代码搞定,有两行还是 import

    import pandas_aliveimport pandas as pdcovid_df = pd.read_csv('covid19.csv', index_col=0, parse_dates=[0])covid_df.diff().fillna(0).plot_animated(filename='line_chart.gif',kind='line',period_label={'x':0.25,'y':0.9})
    

    怎么样,是不是超级方便呢

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

    01 动态条形图

    import pandas_aliveimport pandas as pdcovid_df = pd.read_csv('covid19.csv', index_col=0, parse_dates=[0])covid_df.plot_animated(filename='examples/perpendicular-example.gif',perpendicular_bar_func='mean')
    

    02 动态柱状图

    import pandas_aliveimport pandas as pdcovid_df = pd.read_csv('covid19.csv', index_col=0, parse_dates=[0])covid_df.plot_animated(filename='examples/example-barv-chart.gif',orientation='v')
    

    03 动态曲线图

    import pandas_aliveimport pandas as pdcovid_df = pd.read_csv('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 动态面积图

    import pandas_aliveimport pandas as pdcovid_df = pd.read_csv('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 动态散点图

    import pandas as pdimport pandas_alivemax_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"]},)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 动态饼图

    import pandas_aliveimport pandas as pdcovid_df = pd.read_csv('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 动态气泡图

    import pandas_alivemulti_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 geopandasimport pandas_aliveimport contextilygdf = geopandas.read_file('data/nsw-covid19-cases-by-postcode.gpkg')gdf.index = gdf.postcodegdf = gdf.drop('postcode',axis=1)map_chart = gdf.plot_animated(filename='examples/example-geo-point-chart.gif',basemap_format={'source':contextily.providers.Stamen.Terrain})
    

    09 行政区域动图

    import geopandasimport pandas_aliveimport contextilygdf = geopandas.read_file('data/italy-covid-region.gpkg')gdf.index = gdf.regiongdf = gdf.drop('region',axis=1)map_chart = gdf.plot_animated(filename='examples/example-geo-polygon-chart.gif',basemap_format={'source':contextily.providers.Stamen.Terrain})
    

    10 多动图组合

    import pandas_aliveimport pandas as pdcovid_df = pd.read_csv('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 城市人口变化

    import pandas_aliveurban_df = pandas_alive.load_dataset("urban_pop")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 意大利疫情

    import geopandasimport pandas as pdimport pandas_aliveimport contextilyimport matplotlib.pyplot as pltregion_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.indexpivoted = 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.Tcases_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_gdfmap_chart = gdf.plot_animated(basemap_format={'source':contextily.providers.Stamen.Terrain},cmap='viridis')cases_df = pivotedfrom datetime import datetimebar_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 timetimestr = time.strftime("%d/%m/%Y")plots = [bar_chart, race_chart, map_chart, line_chart]# Otherwise titles overlap and adjust_subplot does nothingfrom matplotlib import rcParamsfrom matplotlib.animation import FuncAnimationrcParams.update({"figure.autolayout": False})# make sure figures are `Figure()` instancesfigs = 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_ax1f3_ax2 = figs.add_subplot(gs[1, 0])f3_ax2.set_title(race_chart.title)race_chart.ax = f3_ax2f3_ax3 = figs.add_subplot(gs[1, 1])f3_ax3.set_title(map_chart.title)map_chart.ax = f3_ax3f3_ax4 = figs.add_subplot(gs[1, 2])f3_ax4.set_title(line_chart.title)line_chart.ax = f3_ax4axes = [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)
    

    展开全文
  • PythonPython开发Python语言如何用python制作动态图表,分析全球疫情变化趋势? 最近国内疫情已经有所好转,但是国外的情况不容乐观,那么怎样用python去制作动态图表来看全球疫情变化趋势呢?比如下面的国内外疫情...

    Python

    Python开发

    Python语言

    如何用python制作动态图表,分析全球疫情变化趋势?

    最近国内疫情已经有所好转,但是国外的情况不容乐观,那么怎样用python去制作动态图表来看全球疫情变化趋势呢?比如下面的国内外疫情发展趋势

    下面是全球疫情发展趋势

    其实用python实现并不难,简单来说就分为三步:

    获取数据(requests)

    数据清洗(pandas)

    数据可视化(pyecharts)

    那么我们就来一点一点讲解吧!

    二、数据获取与处理

    疫情数据获取并不是很难,在目前互联网上已经有许多提供数据的网站,比如丁香园、腾讯新闻、百度新闻等,为了省事直接GitHub上找找看有没有现成的接口,很轻松就找到了丁香园数据的API,

    接下来两行命令就能拿下所有历史数据

    data = requests.get('https://lab.isaaclin.cn/nCoV/api/area?latest=0')

    data = data.json()

    来看下数据

    很明显这样的数据是没有办法去做分析的,所以接下来的重点就是如何清洗这一堆数据,主要又分为下面两块:

    数据整理:原始数据整理,由 json格式转换为方便分析的dataframe格式

    数据清洗:原数据由于API采集的机制。包含大量重复数据、无效数据、缺失数据所以需要对这些数据进行处理

    先来看下数据量

    可以看到一共采集到了7584条数据,由于脏数据比较多,所以这一部分的工作量是比较大的,因此我们不在这里使用太多篇幅去讲如何一步一步提取出我们想要的数据,会单独写一篇数据处理过程的文章,不过还是来看看经历了哪些过程与代码吧!

    首先要将所有数据从字典提取出来并对时间戳进行转换,然后将数据保存到pandas里

    data = requests.get('https://lab.isaaclin.cn/nCoV/api/area?latest=0')

    data = data.json()

    res = data['results']

    df = pd.DataFrame(res)

    def time_c(timeNum):

    timeTemp = float(timeNum/1000)

    tupTime = time.localtime(timeTemp)

    stadardTime = time.strftime("%Y-%m-%d %H:%M:%S", tupTime)

    return stadardTime

    for i in range(len(df)):

    df.iloc[i,16] = time_c(df.iloc[i,16])

    for i in range(len(df)):

    df.iloc[i,16] = df.iloc[i,16][5:10]

    现在数据就成了这样

    这样看起来就舒服多了,但是还是不可以使用,因为API每天会采集很多次数据,所以里面有很多重复数据和异常数据,所以接下来重点处理这一部分。对于重复数据我们只保留最新一个,对于空数据我们选择前一天的数据填充。

    #去重部分代码

    tem = df1[df1['updateTime'] == '03-02']

    tem = tem.drop_duplicates(['provinceShortName'], keep='last')

    for i in date[1:41]:

    tem1 = df1[df1['updateTime'] == i]

    tem1 = tem1.drop_duplicates(['provinceName'], keep='last')

    tem = tem.append(tem1)

    tem = tem.reset_index(drop=True)

    tem

    由于篇幅原因,就不再贴出更多的代码,我们来看下最终处理完的数据

    三、数据可视化

    数据可视化,主要使用的就是里面的Timeline:时间线轮播多图

    简单来说就是在每一个时间点生成一张图然后滚动播放,有点像小时候的手绘小人书一样,所以我们的数据就需要是时间序列数据,那么具体关于怎样使用,参数如何调整请关注后续单独的可视化讲解文章,直接看代码与分析吧。

    首先是国内外疫情趋势

    from pyecharts.faker import Faker

    from pyecharts import options as opts

    from pyecharts.charts import Bar, Page, Pie, Timeline,Grid

    def timeline_bar() -> Timeline:

    x = ['国内','国外']

    tl = Timeline()

    tl = Timeline()

    tl.add_schema(is_auto_play = True,

    play_interval = 500,

    is_loop_play = False)

    k= 0

    for i in date:

    bar = (

    Line()

    .add_xaxis(date)

    .add_yaxis("国内", hs(c1,k))

    .add_yaxis("国外", hs(c,k))

    .extend_axis(

    yaxis=opts.AxisOpts(

    )

    )

    .set_series_opts(

    areastyle_opts=opts.AreaStyleOpts(opacity=0.5),

    label_opts=opts.LabelOpts(is_show=False),

    )

    .set_global_opts(title_opts=opts.TitleOpts("{}国内外疫情趋势".format(i)))

    )

    tl.add(bar, "{}".format(i))

    k = k + 1

    return tl

    timeline_bar().render_notebook()

    可以看出,国内的增长已经处于平缓状态,而国外自二月底来突然爆发,目前还处于上升期,这也是为什么现在要严防境外输入病例。再来看看国外具体的病例占比吧

    可以看出在最近几天韩国、日本、意大利突然爆发,这三个国家的病例数量就占到了约75%。最后再来看看全球疫情的变化趋势吧!

    四、结束语

    至此,我们就完全使用python对疫情数据进行了一次动态可视化,回顾整个过程其实并没有太多过于复杂的步骤,更多的是关于pandas和pyecharts基础功能的使用,最后还是要说一句,疫情仍未散去,大家要继续做好防护!中国加油!

    内容来源于网络,如有侵权请联系客服删除

    展开全文
  • 主要介绍了利用Python制作动态排名图的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • 作者:周萝卜来源:萝卜大杂烩关于动态图表,相信大家都或多或少的接触过一些,如果是代码水平比较不错的,可以选择 Matplotlib,当然也可以使用 pyecharts 的相关功能,不过这...

    作者:周萝卜

    来源:萝卜大杂烩

    关于动态图表,相信大家都或多或少的接触过一些,如果是代码水平比较不错的,可以选择 Matplotlib,当然也可以使用 pyecharts 的相关功能,不过这些工具都专注于图表的制作,也就是对于图表的数据,你是需要自行转换的。而今天介绍的这个可视化图库,完美的结合了 Pandas 数据格式,又辅以 Matplotlib 的强大功能,使得我们制作动图变得容易的多了。

    图库简介

    这款给力的可视化图库,就是 pandas_alive,虽然当前在 GitHub 上的 star 数量不是很高,但是相信凭借其强大的功能,崭露头角也是迟早的事情

    项目地址:

    https://github.com/JackMcKew/pandas_alive

    项目安装:
    与一般的 Python 库一样,直接使用 pip 安装即可,这里有一点需要注意,就是由于是通过 Matplotlib 来制作动图,所以需要手动安装下 Matplotlib 的依赖工具 imagemagick,这是一个图片处理工具,感兴趣的同学可以自行查看下

    项目功能:
    这款可视化图库,可以支持的图表类型是非常多的,包括动态条形图、动态曲线图、气泡图、饼状图以及地图等等,这些图表差不多可以满足我们日常的使用了

    制图简介

    这里我们就来简单看一下该如何制作动态图表吧,首先是动态条形图,基本4行代码搞定,有两行还是 import

    import pandas_alive
    import pandas as pd
    
    covid_df = pd.read_csv('covid19.csv', index_col=0, parse_dates=[0])
    
    covid_df.diff().fillna(0).plot_animated(filename='line_chart.gif',kind='line',period_label={'x':0.25,'y':0.9})
    

    怎么样,是不是超级方便呢

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

    01 动态条形图

    import pandas_alive
    import pandas as pd
    
    covid_df = pd.read_csv('covid19.csv', index_col=0, parse_dates=[0])
    
    covid_df.plot_animated(filename='examples/perpendicular-example.gif',perpendicular_bar_func='mean')
    

    02 动态柱状图

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

    03 动态曲线图

    import pandas_alive
    
    import pandas as pd
    
    covid_df = pd.read_csv('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 动态面积图

    import pandas_alive
    
    import pandas as pd
    
    covid_df = pd.read_csv('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 动态散点图

    import pandas as pd
    import pandas_alive
    
    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"]},
    )
    
    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 动态饼图

    import pandas_alive
    
    import pandas as pd
    
    covid_df = pd.read_csv('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 动态气泡图

    import pandas_alive
    
    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)
    
    map_chart = gdf.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)
    
    map_chart = gdf.plot_animated(filename='examples/example-geo-polygon-chart.gif',basemap_format={'source':contextily.providers.Stamen.Terrain})
    

    10 多动图组合

    import pandas_alive
    
    import pandas as pd
    
    covid_df = pd.read_csv('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 城市人口变化

    import pandas_alive
    
    urban_df = pandas_alive.load_dataset("urban_pop")
    
    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 意大利疫情

    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
    
    map_chart = gdf.plot_animated(basemap_format={'source':contextily.providers.Stamen.Terrain},cmap='viridis')
    
    cases_df = pivoted
    
    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
    )
    

    怎么样,是不是心动了,那就快行动吧!

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

     后台回复「微信群」,将邀请加入读者交流群。

    《Python知识手册》《Markdown速查表》|《Python时间使用指南》|《Python字符串速查表》|《SQL经典50题》|《Python可视化指南》|《Plotly可视化指南》|《Pandas使用指南》|《机器学习精选》

    ????分享、点赞、在看,给个三连击呗!???? 

    展开全文
  • 使用Python生成动态图表,一个很Cool的教程

    万次阅读 多人点赞 2018-09-23 14:40:57
    作者 |Viviane译者 | 刘旭坤编辑 | Jane出品 | AI科技大本营【导读】Matplotlib 和 Seaborn 用来做数据固定的静态图表很不错,但如果...
  • 这里将使用Python的Plotly图形库,让你可以毫不费力地生成动画图表和交互式图表。 安装模块 如果你还没安装 Plotly,只需在你的终端运行以下命令即可完成安装: pip install plotly 可视化动态图 在研究这个或那个...
  • Python制作动态图表看全球疫情趋势

    千次阅读 2020-04-11 17:57:44
    至此,我们就完全使用python对疫情数据进行了一次动态可视化,回顾整个过程其实并没有太多过于复杂的步骤,更多的是关于pandas和pyecharts基础功能的使用,最后还是要说一句,疫情仍未散去,大家要继续做好防护!...
  • 来源:机器之心原文链接:https://towardsdatascience.com/learn-how-to-create-animated-graphs-in-python-fce7...
  • python图表制作

    千次阅读 2021-02-10 04:19:19
    画一个吸引人注意的图表相当重要。当你探索一个数据集,需要画图表图表看起来令人愉悦是件很高兴的事。在与你的观众交流观点时,可视化同样重要,同时,也很有必要去让图表吸引注意力和印入脑海里。Matplotlib自动...
  • 如何才能在短时间内制作漂亮的可视化地图呢,我觉得Python+可视化工具是不错的选择。 以下动态可视化地图就是J哥亲手绘制,展现了一段时间内广州市企事业单位在网上商城采购商品的分布及随时间的变化。 接下来,将...
  • Python获取动态图表数据!

    千次阅读 2020-10-22 11:14:20
    既然有了Python这个制作动态条形图工具,缺的那便是数据了。 先看一下B站2019年「数据可视化」版块的情况,第一个视频超2百万的播放量,4万+的弹幕。 用什么来衡量手游的热门程度呢,答案便是百度指数。 同样我...
  • Python图形库 这个github存储库是的源代码,该网站显示了数百个使用Python制作图表。 |
  • 利用Python实现获取动态图表,废话不多说~ 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: re模块; requests模块; urllib模块; pandas模块; 以及一些Python自带的模块。 环境搭建 安装Python并...
  • 工具集合数据由python处理,所以首先需要安装python,官网下载即可。可以不用安装python的编辑器,自己用Notepad写就可以。安装图表处理库pyecharts,命令是:pip install pyecharts。在线环境不需要安装,离线环境...
  • 在读技术博客的过程中,我们会发现那些能够把知识、成果讲透的博主很多都会做动态图表。他们的图是怎么做的?难度大吗?这篇文章就介绍了 Python 中一种简单的动态图表制作方法。数据暴增的年...
  • 这里我们就来简单看一下该如何制作动态图表吧,首先是动态条形图,基本4行代码搞定,有两行还是 import import pandas_alive import pandas as pd covid_df = pd.read_csv('covid19.csv', index_col=0, parse_...
  • 前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。...这篇文章就介绍了 Python 中一种简单的动态图表制作方法。 数据暴增的年代,数
  • 作者 |刘早起早起责编 | 屠敏前言最近国内疫情已经有所好转,但是国外的情况不容乐观,那么怎样用Python制作动态图表来看全球疫情变化趋势呢?比如...
  • Python 图表制作

    2020-12-24 22:22:42
    学习使用Python做简单图表分析目标:探查成为地市级党委书记与各类因素的关系,共六个表格使用数据:“地市级党委书记数据库”,以Excel格式保存先把数据文件导出为.csv格式文件代码如下import numpy as npimport ...
  • 同样也是几行代码就能完成动态图表的绘制。 GitHub地址: https://github.com/JackMcKew/pandas_alive 使用文档:https://jackmckew.github.io/pandas_alive/ 安装版本建议是0.2.3,matplotlib版本是3.2.1...
  • 第一章内容发布在(使用Python制作疫情数据分析可视化图表(一))https://blog.csdn.net/yue__yang/article/details/104538235,请自行食用。 二、时间序列与区域划分 1、数据类型转换为时间序列 在数据中,有一个...
  • Python绘制Excel图表

    千次阅读 2020-07-16 09:54:51
    Python绘制Excel图表pandas结合xlsxwriter绘制图表依赖安装绘制环形饼状图生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学...
  • CTEmail 的全称是Charts and Text Email,是一个发送带有图表[注意:图片不是在附件里!!!]邮件的简单粗暴的脚本。
  • 这篇文章就介绍了Python中一种简单的动态图表制作方法。数据暴增的年代,数据科学家、分析师在被要求对数据有更深的理解与分析的同时,还需要将结果有效地传递给他人。如何让目标听众更直观地理解?当然是将数据可视...
  • 这里使用python爬取招聘信息存到数据库。这个脚本只负责收集,收集之后保存到数据库 为了加快爬取速度这里采用多进程方式。 脚本详情参考https://blog.csdn.net/qq_38204481/article/details/93890794 这里进行了...
  • 代码 ''' Author: CloudSir Date: 2021-07-28 10:...Description: python绘制3D图表 https://github.com/cloudsir ''' from mpl_toolkits.mplot3d import Axes3D import numpy as np from matplotlib import pyplot as
  • Python 3.4 编码的小 Python 脚本,用于计算定期存款的利息并制作数据图表。 它仍处于开发的初始阶段,因此相当有缺陷。 编译/安装/运行 无需编译,无需安装! 单击页面右下角的“下载 ZIP”按钮下载整个存储库...
  • 如果你需要一个简单、美观、易用的可...GooPyCharts是对于谷歌图表(Google Charts API)的python封装。GooPyCharts的语法类似于MATLAB,实际上是对matplotlib库的替代。安装 pip install gpcharts pip install futu...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,974
精华内容 5,989
关键字:

python制作动态图表