利用matplotlib绘制蓝丁格尔玫瑰图的案例

一、概念介绍

蓝丁格尔玫瑰图,又称为极坐标区域图,鸡冠花图。该图由我们的“白衣天使”兼统计学家--Florence Nightingale(佛洛伦斯·蓝丁格尔)在克里米亚战争期间发明,该图形可以清晰、直观地看出每个月因各种原因死亡的人数,更是为了向人们和女皇突出说明,军医院中因未得到及时治疗而造成的死亡人数远大于战死的人数这一结论,后因色彩鲜明,视觉传递效果好而被沿用。

图像示例如下:

利用matplotlib绘制蓝丁格尔玫瑰图的案例_第1张图片

了解柱状图的朋友们应该可以马上发现,这一图形即是堆叠柱状图在极坐标下的实现。

我们要注意:

① 蓝丁格尔玫瑰图传递数值大小比较信息的渠道是花瓣的长度,而非花瓣的大小。但受众一般会首先靠面积判别大小,因此玫瑰图可以放大数值间的差异,突出类间差距。

② 蓝丁格尔玫瑰图中每一瓣花瓣占比的角度是固定的,即有n类时,每一类的角度为360/n。

③ 在玫瑰图中,我们的每一瓣代表一个类别,尽量用不同的颜色区分开。也同样因为这个原因,如果你不想你的图形画出来像是五彩画盘,就不要选择用玫瑰图去展示多类别单维数据的可视化。


二、数据展示

仍然是那八个随机抽取的城市,因为之前在画并排柱状图的时候顺便收集了各城市的统计公报,为了能简化数据准备的过程,又尽量模拟实操,我们希望绘制蓝丁格尔玫瑰图用于展示各城市的医疗机构配置水平,即每万人的医疗机构数(数据仅用于绘图)。

excel数据展示如下:

利用matplotlib绘制蓝丁格尔玫瑰图的案例_第2张图片

 数据读取:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

hospital_data = pd.DataFrame(pd.read_excel('./医疗卫生机构数.xls'))
labels = [hospital_data.loc[i,'城市']+':'+str(format(hospital_data.loc[i,'每万人'],'.2f')) for i in range(len(hospital_data))]

三、图像绘制

这里,我们使用的是python语言,借助matplotlib包实现。

plt.rcParams['font.sans-serif']=['SimHei']
colors = ['#ff967c','#f1da7a','#a4be5c','#75bbfd',
         '#658cbb','#ce5dae','#fc824a','#4b57db']
width = [2*np.pi/8]*8
theta = [0]
plt.figure(figsize=(14,9))
for i in range(1,1+len(hospital_data)):
    theta.append(theta[i-1]+width[i-1])
theta = theta[:-1]
p=plt.subplot(projection='polar') 
p.set_theta_zero_location('N')
p.bar(theta,hospital_data['每万人'], width=width,bottom=0,color = colors,align='edge')
for angle,height,label in zip(theta,hospital_data['每万人'],labels):
    p.text(angle+0.5,height-0.1,label,fontsize=12)
plt.axis('off')
# plt.savefig('./玫瑰图-示例.png')

(1)和往常不同的是,我们需要在plt.subplot()中指定projection='polar',即在极坐标中绘图。

(2)p.set_theta_zero_location('N')  ----  申明极坐标的0度起始位置,“N"表示北部,即12点方向。如果要指定其它特殊位置,可以选择【"N"、"NW"、"W"、"SW"、"S"、"SE"、"E"、"NE"】其一表示八个方位之一,又或者set_theta_zero_location("N", 10.0)代表特定角度的偏移(北偏西10度,极坐标的走势是默认逆时针)

(3)bar(x,y) --- 这里我们需要相应调整的是,之前习惯性x为np.arange(n),现变成前面部分生成theta序列,在这个过程中,如果需要改变每一片花瓣的角度大小,也可以自生成。

绘制结果:

利用matplotlib绘制蓝丁格尔玫瑰图的案例_第3张图片

 如果text标注的效果不尽如人意,也可以自己继续调整一下,由于我的审美也有限,调整后得到的图像如下所示:

利用matplotlib绘制蓝丁格尔玫瑰图的案例_第4张图片

 以上是单维度数据的蓝丁格尔玫瑰图绘制,如果需要堆叠且数据差异更大一点的话视觉效果会更好。

希望对您有所帮助~

你可能感兴趣的