玩命加载中...
# 内地城市排行(Python雷达图教程)
雷达图(Radar Chart)又被叫做蜘蛛网图,适用于显示有三个或更多的数值维度的对象。
本教程中,我们利用Matplotlib实现了雷达图,以及多个对象的比较。
数据使用了华顿研究院2018年8月发布的“中国内地百强城市”,并且利用雷达图进行展示。
预计学习用时:15分钟。
本教程基于**Python 3.5**。
原创者:**SofaSofa TeamM** | 修改校对:SofaSofa TeamC |
----
引入使用的模块
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.style.use('ggplot')
```
**数据下载点击[这里](http://sofasofa.io/tutorials/radar_plot/cities_ranking.csv)**(数据版权归华顿研究院所有)。
利用pandas读取数据
```python
data = pd.read_csv('cities_ranking.csv')
data.head()
```
|
排名 |
城市 |
总分 |
经济产值 |
财富储蓄 |
环境 |
科教 |
文化 |
卫生 |
0 |
1 |
北京 |
93.74 |
86.98 |
100.00 |
95.88 |
100.00 |
98.05 |
82.62 |
1 |
2 |
上海 |
88.23 |
88.96 |
90.81 |
76.25 |
90.25 |
100.00 |
75.72 |
2 |
3 |
广州 |
83.40 |
83.73 |
81.67 |
78.86 |
97.46 |
88.96 |
72.84 |
3 |
4 |
深圳 |
75.10 |
86.63 |
73.22 |
84.76 |
43.97 |
94.77 |
45.73 |
4 |
5 |
杭州 |
73.42 |
68.23 |
69.47 |
79.27 |
79.50 |
89.47 |
74.98 |
定义雷达图函数
```python
def plot_radar(data, city):
'''
data是上面读入的原始数据
city是要显示的城市,可以是一个城市,比如city="上海"
也可以是一组城市,比如city=["杭州", "南京"]
为了视觉效果,最多同时展示5个城市。
'''
if type(city) != list: city = [city]
# 从下面六项指标,体现城市发展水平
cols = ['文化', '科教', '经济产值', '财富储蓄', '环境', '卫生']
# 每个城市的配色
colors = ['green', 'blue', 'red', 'yellow', 'black']
# 把圆形进行六等分
angles = np.linspace(0.1 * np.pi, 2.1 * np.pi, len(cols), endpoint=False)
angles = np.concatenate((angles, [angles[0]]))
# 初始化一个极坐标图像
fig = plt.figure(figsize=(6, 6))
ax = fig.add_subplot(111, polar=True)
# 逐一添加每个城市图像以及排名信息
for i, c in enumerate(city):
rank = data.loc[data['城市'] == c, '排名'].values[0]
stats = data.loc[data['城市'] == c, cols].values[0].tolist()
stats = np.concatenate((stats, [stats[0]]))
ax.plot(angles, stats, '-', linewidth=6, c=colors[i], label='%s 排名第%s'%(c, rank))
ax.fill(angles, stats, c=colors[i], alpha=0.25)
# 添加图例
ax.legend(loc=[0.25, 1.15], fontsize=18)
ax.set_yticklabels([])
ax.set_thetagrids(angles * 180/np.pi, cols, fontsize=16)
ax.grid(True)
# 完成
plt.show()
return fig
```
调用函数,试试看!先看看上海!
```python
plot_radar(data, "上海");
```
![jpg](images/output_9_0.jpg)
随机显示两座城市
```python
all_cities = data['城市'].tolist()
for city in np.random.choice(all_cities, 2):
plot_radar(data, city);
```
![jpg](images/output_11_0.jpg)
![jpg](images/output_11_1.jpg)
上面提到了,`plot_radar`可以对比多个城市。我们挑选几组,看看有没有你们的家乡哦!
```python
plot_radar(data, ['北京', '上海']);
plot_radar(data, ['广州', '深圳']);
plot_radar(data, ['杭州', '南京']);
plot_radar(data, ['成都', '重庆']);
plot_radar(data, ['苏州', '无锡']);
plot_radar(data, ['天津', '沈阳']);
plot_radar(data, ['武汉', '长沙']);
plot_radar(data, ['郑州', '西安']);
plot_radar(data, ['大连', '青岛']);
plot_radar(data, ['宁波', '南通']);
plot_radar(data, ['合肥', '南昌']);
```
![jpg](images/output_13_0.jpg)
![jpg](images/output_13_1.jpg)
![jpg](images/output_13_2.jpg)
![jpg](images/output_13_3.jpg)
![jpg](images/output_13_4.jpg)
![jpg](images/output_13_5.jpg)
![jpg](images/output_13_6.jpg)
![jpg](images/output_13_7.jpg)
![jpg](images/output_13_8.jpg)
![jpg](images/output_13_9.jpg)
![jpg](images/output_13_10.jpg)