玩命加载中...
# 内地城市排行(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() ``` <div> <style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </style> <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>排名</th> <th>城市</th> <th>总分</th> <th>经济产值</th> <th>财富储蓄</th> <th>环境</th> <th>科教</th> <th>文化</th> <th>卫生</th> </tr> </thead> <tbody> <tr> <th>0</th> <td>1</td> <td>北京</td> <td>93.74</td> <td>86.98</td> <td>100.00</td> <td>95.88</td> <td>100.00</td> <td>98.05</td> <td>82.62</td> </tr> <tr> <th>1</th> <td>2</td> <td>上海</td> <td>88.23</td> <td>88.96</td> <td>90.81</td> <td>76.25</td> <td>90.25</td> <td>100.00</td> <td>75.72</td> </tr> <tr> <th>2</th> <td>3</td> <td>广州</td> <td>83.40</td> <td>83.73</td> <td>81.67</td> <td>78.86</td> <td>97.46</td> <td>88.96</td> <td>72.84</td> </tr> <tr> <th>3</th> <td>4</td> <td>深圳</td> <td>75.10</td> <td>86.63</td> <td>73.22</td> <td>84.76</td> <td>43.97</td> <td>94.77</td> <td>45.73</td> </tr> <tr> <th>4</th> <td>5</td> <td>杭州</td> <td>73.42</td> <td>68.23</td> <td>69.47</td> <td>79.27</td> <td>79.50</td> <td>89.47</td> <td>74.98</td> </tr> </tbody> </table> </div> 定义雷达图函数 ```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) <ul class="pager"> <li class="next"><a href="../../tutorials.php"><b><i class="fa fa-graduation-cap" aria-hidden="true"></i>&nbsp; 学完咯!</b></a></li> </ul>