古希腊毕达哥拉斯学派曾称:
一切平面图形中,圆是最美的
如是所言,圆是几何中最讲究对称的图形,也是最别致的曲线。相信大家在论文、报告的写作中,柱状图、条形图露脸次数应该是最多的。虽然说柱状图、条形图可以清晰的展现出数据的变化趋势,但对于视觉动物的我们,出现的次数多了,终究还是会有审美疲劳。
倘若我们能够把柱状图、条形图“掰弯”,让它以圆的形式展示,相信会给人耳目一新的感觉。
能绘制极坐标图的工具不少,今天为大家带来它三种图形的绘制,分别为散点图、柱状图、雷达图,所用工具是我们的老朋友 python自带的 matplotlib 包。
下面展示了极坐标散点图、极坐标饼状图、极坐标雷达图三种图形的画法示例,并详解每种画法代码的含义。
极坐标散点图
在画之前,首先导入所用包及相关设置。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
散点图将所有的数据以点的形式展现在坐标系上,可以观察数据点的分布情况,在直角坐标系,可以推断变量间的相关性,而在极坐标上,更侧重数据的分布及离散情况。
#生成范例数据
r = 2 * np.random.rand(100) #生成100个服从“0~1”均匀分布的随机样本值
theta = 2 * np.pi * np.random.rand(100) #生成角度
area = 100 * r**2 #面积
colors = theta #颜色
ax = plt.subplot(111, projection='polar')
#projection为画图样式,除'polar'外还有'aitoff', 'hammer', 'lambert'等
c = ax.scatter(theta, r, c=colors, s=area, cmap='cool', alpha=0.75)
#ax.scatter为绘制散点图函数
plt.show()
所作图形如下所示,可以看到散点在极坐标上的分布情况,以及散点自身特点(如大小、颜色等)情况。

图一
注:上图为随机数据生成的图,每次运行得到的图形会有所不同。matplot的色彩映射请参考官方文档:Choosing Colormaps in Matplotlibwww.matplotlib.org.cn

散点图plt.scatter相关参数详解:

极坐标柱状图
柱状图是一种以长方形长度为变量的统计报告图,由一系列高度不等的纵向条纹表示数据分布的情况。极坐标柱状图则是将柱形条显示在极坐标中,其不仅保留了直角坐标系中数据变化趋势的优点,而且图形表达形式也更加美观。
N = 20
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
# 从0到2pi生成均匀间隔的20个数,endpoint为Flase表示不包含末尾数字2pi,默认为True,这里指的是角度
R = 10 * np.random.rand(N) # 随机生成20个半径
width = np.pi / 8 * np.random.rand(N) # 线的宽度
ax = plt.subplot(111, projection = 'polar') # 极坐标图'polar'
bars = ax.bar(theta,R, width = width, bottom = 0.0) # 绘制柱子
# 利用循环设置每个柱子的颜色、透明度
for r, bar in zip(radii, bars): bar.set_facecolor(plt.cm.viridis(r / 10.)) # 设置颜色 bar.set_alpha(0.5) # 设置透明度
plt.show()
所作图形如下所示,可以看到,图形可以很清楚地传达数据的大小,一如你在柱状图(条形图)上看到的,你还可以尝试在圆外添加标签,使得柱条与标签一一对应起来(不会的话请继续阅读下文极坐标雷达图的绘制)。

图二
条形图函数plt.bar参数详解:

极坐标雷达图
雷达图也称网络图,蜘蛛图等,用于比较和评估多个指标之间的强弱关系。
#生成数据,注意第一组与最后一组数据是相同的,确保可以连成一个闭合多边形
country = ["CHINA", "USA", "JAPAN", "KOREA", "ENGLAND"]
index1= [4.5, 4.9, 3.9, 2.8, 2.6, 4.5]
index2= [4.9, 4.7, 4.5, 3.9, 3.8, 4.9]
plt.figure(figsize = (10, 6)) #设置图形大小
plt.subplot(polar = True) #设置图形为极坐标图
theta = np.linspace(0, 2 * np.pi, len(index1)) #根据index1的数量将圆均分
#设置网格,标签
lines, labels = plt.thetagrids(range(0, 360, int(360/len(country))), (country))
#绘制index1
plt.plot(theta,index1 )
plt.fill(theta,index1 , 'g', alpha=0.1) #设置颜色与透明度
#绘制index2
plt.plot(theta, index2)
# 添加图例和标题
plt.legend(labels=('index1', 'index2'), loc = 'best',frameon = True) # loc为图例位置
plt.title("index1 vs index2");
所作图形如下所示,我们不仅可以看到同一个国家两个指标index1与index2的大小关系,还可以看到不同国度同一个指标的大小情况。

图三
图例绘制函数plt.legend参数详解:

文章首发于公众号 数据Seminar
数据呈现 丨用python绘制极坐标图形mp.weixin.qq.com
更多可视化内容请关注公众号 数据Seminar
