生成top图_Python 绘制柱形竞赛图

6e4e55a3203a52da5fc17ee8deacc7e7.png

柱形竞赛图(Bar Chart Race)是一种动态的柱形图,它能非常直观地反应随着时间流逝数据的变化。下图是最终效果。

2168957c3c6f3685317ed370d785ef62.png
COVID-19 Confirms by Countryhttps://www.zhihu.com/video/1244644470194688000

那么如何绘制呢?今天介绍一个开源库,就叫 bar_chart_race,使用这个库制作柱形竞赛图可以说非常简单了。

安装

安装 bar_chart_race 只需要通过 pip:

pip install bar_chart_race

bar_chart_race 使用 ffmpeg 生成 mp4 文件展示。所以还需要安装 ffmpeg:

conda install -c conda-forge ffmpeg

本示例使用 Mars 来预处理数据。安装 Mars 通过:

pip install pymars

准备数据

今天我们要绘制的是新冠确诊人数前十的国家的数据变化。我们使用数据集:地址,点击链接下载 CSV 文件。

In [1]: import mars.dataframe as md                                                                                                                                                                         

In [2]: df = md.read_csv('countries-aggregated.csv')[['Date', 'Country', 'Confirmed']]                                                                                                                      

In [3]: df.execute()                                                                                                                                                                                        
Out[3]: 
             Date             Country  Confirmed
0      2020-01-22         Afghanistan          0
1      2020-01-22             Albania          0
2      2020-01-22             Algeria          0
3      2020-01-22             Andorra          0
4      2020-01-22              Angola          0
...           ...                 ...        ...
21239  2020-05-13  West Bank and Gaza        375
21240  2020-05-13      Western Sahara          6
21241  2020-05-13               Yemen         70
21242  2020-05-13              Zambia        446
21243  2020-05-13            Zimbabwe         37

接着我们确定柱状图上要显示哪些国家,这里我们计算出历史上总确诊人数排前十的国家显示。

In [4]: top_10 = df.groupby('Country').agg({'Confirmed': 'sum'}).sort_values(by='Confirmed', ascending=False)[:10]                                                                                          

In [5]: top_10.execute()                                                                                                                                                                                    
Out[5]: 
                Confirmed
Country                  
US               36901733
Italy             8940009
Spain             8862792
China             7778728
Germany           6730778
France            6391282
United Kingdom    5887815
Iran              4127613
Turkey            3888111
Russia            3450701

有了前10的国家,接着我们就需要从原始数据里过滤出来这些国家的数据。

In [6]: data_in_top_10 = df[df.Country.isin(top_10.index)]                                                                                                                                                  

In [7]: data_in_top_10.execute()                                                                                                                                                                            
Out[7]: 
             Date         Country  Confirmed
36     2020-01-22           China        548
62     2020-01-22          France          0
66     2020-01-22         Germany          0
81     2020-01-22            Iran          0
85     2020-01-22           Italy          0
...           ...             ...        ...
21196  2020-05-13          Russia     242271
21214  2020-05-13           Spain     228691
21229  2020-05-13          Turkey     143114
21230  2020-05-13              US    1390406
21234  2020-05-13  United Kingdom     230985

[1130 rows x 3 columns]

要绘图,bar_chart_race 接受一个横表,索引是时间,列标签是国家,里面的值就是每天的人数了。要做到这个效果只需要调用 DataFrame.pivot做个列转行的操作即可,可惜 Mars 暂时还不支持 pivot,所以我们先转 pandas。

In [8]: # Mars 0.4 版本前(含 0.4.0rc1)通过 data_in_top_10.execute() 转成 pandas DataFrame 
   ...: # 0.4 之后通过 to_pandas() 转 
   ...: pivot_df = data_in_top_10.to_pandas().pivot(index='Date', columns='Country', values='Confirmed')                                                                                                    

In [9]: pivot_df                                                                                                                                                                                            
Out[9]: 
Country     China  France  Germany    Iran  ...   Spain  Turkey       US  United Kingdom
Date                                        ...                                         
2020-01-22    548       0        0       0  ...       0       0        1               0
2020-01-23    643       0        0       0  ...       0       0        1               0
2020-01-24    920       2        0       0  ...       0       0        2               0
2020-01-25   1406       3        0       0  ...       0       0        2               0
2020-01-26   2075       3        0       0  ...       0       0        5               0
...           ...     ...      ...     ...  ...     ...     ...      ...             ...
2020-05-09  83990  176782   171324  106220  ...  223578  137115  1309550          216525
2020-05-10  84010  177094   171879  107603  ...  224350  138657  1329260          220449
2020-05-11  84011  177547   172576  109286  ...  227436  139771  1347881          224332
2020-05-12  84018  178349   173171  110767  ...  228030  141475  1369376          227741
2020-05-13  84024  178184   174098  112725  ...  228691  143114  1390406          230985

[113 rows x 10 columns]

绘图

有了能用的数据,我们就正式开始绘图了。

In [10]: import bar_chart_race as bcr
Out[10]: bcr_html = bcr.bar_chart_race(df=pivot_df, filename=None,
                                       steps_per_period=10, period_length=300,
                                       title='COVID-19 Confirms by Country')

在 jupyter 里,可以直接显示竞争图。

In [11]: from IPython.display import HTML
Out[11]: HTML(bcr_html)
2168957c3c6f3685317ed370d785ef62.png
COVID-19 Confirms by Countryhttps://www.zhihu.com/video/1244646430906232832

参考

Bar Chart Race:https://github.com/dexplo/bar_chart_race

Mars:https://github.com/mars-project/mars

### 回答1: 以下是一个使用 NetworkX 库绘制随机网络形的示例代码: ```python import networkx as nx import matplotlib.pyplot as plt import random # 创建一个空的无向 G = nx.Graph() # 添加随机节点 for i in range(10): G.add_node(i) # 添加随机边 for i in range(10): for j in range(i+1, 10): if random.random() < 0.5: G.add_edge(i, j) # 绘制形 pos = nx.spring_layout(G) nx.draw(G, pos, with_labels=True) plt.show() ``` 在上面的示例代码中,我们首先创建了一个空的无向 `G`,然后添加了 10 个随机节点,并使用 `random` 方法随机添加了一些边。最后,使用 `spring_layout` 方法对节点进行布局,并使用 `draw` 方法绘制形。你可以根据需要调整节点数量、边的概率等参数,来生成不同的随机网络形。 ### 回答2: Python中有许多库可以用来绘制随机网络形,例如NetworkX和Matplotlib。下面是一个使用NetworkX和Matplotlib库绘制随机网络形的示例: ```python import networkx as nx import matplotlib.pyplot as plt import random # 创建一个空的无向 G = nx.Graph() # 添加随机节点 num_nodes = 10 for i in range(num_nodes): G.add_node(i) # 添加随机边 num_edges = 15 for i in range(num_edges): # 随机选择两个节点,并判断它们之间是否已经有边 # 若没有边则添加一条边 while True: node1 = random.choice(list(G.nodes)) node2 = random.choice(list(G.nodes)) if not G.has_edge(node1, node2): G.add_edge(node1, node2) break # 绘制网络形 nx.draw(G, with_labels=True, node_color='lightblue', edge_color='gray') plt.show() ``` 在这个例子中,首先我们创建了一个空的无向 `G`,然后通过循环添加了一些随机节点和随机边。然后,使用`nx.draw()`函数绘制了这个网络形,并使用`with_labels=True`参数显示节点标签,`node_color='lightblue'`设置节点的颜色,`edge_color='gray'`设置边的颜色。最后使用`plt.show()`展示了这个形。 运行这段代码,会生成一个随机的网络形,其中节点和边都是随机生成的。 ### 回答3: Python是一种强大的编程语言,它具有广泛的应用领域,包括数据分析、人工智能和可视化等。其中,通过使用Python绘制随机网络形是一项常见任务。 在Python中,可以使用多个第三方库来实现绘制随机网络形的功能。其中,最常用的库是NetworkX。NetworkX是一个用于创建、操作和研究复杂网络的Python库。 首先,我们需要在开发环境中安装NetworkX库。在安装完成后,可以开始编写代码来创建随机网络形。 首先,我们需要导入所需的库: ```python import networkx as nx import matplotlib.pyplot as plt import random ``` 然后,我们创建一个空的形对象: ```python G = nx.Graph() ``` 接下来,我们可以生成节点和边。可以采用循环的方式来添加节点: ```python num_of_nodes = 10 for i in range(num_of_nodes): G.add_node(i) ``` 然后,我们可以使用循环生成随机的边: ```python num_of_edges = 15 for i in range(num_of_edges): random_node1 = random.choice(list(G.nodes())) random_node2 = random.choice(list(G.nodes())) if random_node1 != random_node2: G.add_edge(random_node1, random_node2) ``` 最后,我们可以使用Matplotlib库来绘制形: ```python nx.draw_networkx(G) plt.show() ``` 以上就是使用Python绘制随机网络形的示例代码。你可以根据实际需求进行调整和扩展,例如改变节点和边的数量,添加节点属性和边权重等。 总结起来,使用Python绘制随机网络形是一项易于实现且功能强大的任务,通过使用NetworkX和Matplotlib等库,我们可以快速生成和可视化复杂的网络形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值