前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python数据分析--雷达图

Python数据分析--雷达图

原创
作者头像
MiaoGIS
修改2022-04-25 13:50:59
1.4K0
修改2022-04-25 13:50:59
举报
文章被收录于专栏:Python in AI-IOT

最近阅读学习了林骥老师的《数据化分析 Python 实战》,书中讲好的技能应该刻意的练习,而不是简单的重复。

学习林骥老师的数据可视化的每种图表时,原来代码略微修改,使其适用于自己工作业务中的数据可视化。

林骥老师将数据可视化分析源代码分享在他的GitHub空间https://github.com/linjiwx/mp

引用林骥老师关于雷达图的使用场景:

雷达图的背景一圈一圈地像雷达,用多边形来展现数据的大小,适合用于有多种不同维度的情形,是发现差距的一种好工具。

(1)如果在一个雷达图中展现超过 2 组数据,会让图表难以阅读。

(2)变量的个数不宜过多,否则密密麻麻的线条可能让人抓不到重点。

(3)从表达数据的精确度来看,极坐标中的角度,不如直角坐标中的位置。

数据如下:

代码语言:text
复制
type	郑州	焦作
CO	1.026010613	1.213508772
NO2	48.34346358	39.14192377
O3	69.27411963	72.05813249
PM10	118.915409	126.1797168
PM2.5	65.44621322	68.32829138
SO2	14.74927641	17.02480339

代码如下:

代码语言:python
代码运行次数:0
复制
# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.image as image

# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']

# 自动适应布局
mpl.rcParams.update({'figure.autolayout': True})

# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False

# 禁用科学计数法
pd.set_option('display.float_format', lambda x: '%.2f' % x) 

# 定义颜色,主色:蓝色,辅助色:灰色,互补色:橙色
c = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',
     '灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',
     '橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171'}

# 数据源路径
filepath='./data/aqi.xlsx'

# 读取 Excel文件
df = pd.read_excel(filepath)

dictRange={
   
    'SO2':[0,150,500,650,800],
   
    'NO2':[0,100,200,700,1200,2340,3090,3840],
    'PM10':[0,50,150,250,350,420,500,600],

    'CO':[0,5,10,35,60,90,120,150],
    'O3':[0,160,200,300,400,800,1000,1200],
 
    'PM2.5':[0,35,75,115,150,250,350,500],
   }

label = df.iloc[:,0].values
def rank(x):
    series=pd.Series(dictRange[x[0]])
    print(series)
    return series.searchsorted(x[1:])

data=df.apply(rank,1,result_type='expand').values

# 提取画图所需的数据
data0 = data[:, 0]
data1 = data[:, 1]

   
# data 有几个数据,就把整圆 360° 分成几份
angle = np.linspace(0, 2*np.pi, len(data0), endpoint=False)

# 增加第一个 angle 到所有 angle 里,以实现闭合
angles = np.concatenate((angle, [angle[0]]))

# 倒转顺序,以让雷达图顺时针显示
angles = angles[::-1]
#提取标签

#增加第一个 data 到所有的 data 里,以实现闭合
data0 = np.concatenate((data0, [data0[0]]))
data1 = np.concatenate((data1, [data1[1]]))
# 使用「面向对象」的方法画图,定义图片的大小
fig, (ax1,ax2)=plt.subplots(1,2,figsize=(8, 8), subplot_kw=dict(polar=True))

# 设置背景颜色
fig.set_facecolor('w')
ax1.set_facecolor('w')
ax2.set_facecolor('w')
# 设置标题
ax1.set_title(f'2018年{df.columns[1]}空气污染类别分布\n\n', fontsize=18, loc='left', color=c['深灰色']) 
ax2.set_title(f'2018年{df.columns[2]}空气污染类别分布\n\n', fontsize=18, loc='left', color=c['深灰色']) 

# 设置网格标签
ax1.set_thetagrids(angles*180/np.pi, labels=label)
ax2.set_thetagrids(angles*180/np.pi, labels=label)

# 画雷达图,用顺时针显示
ax1.plot(angles, data0, 'o-', label=df.columns[1])
ax2.plot(angles, data1, 'o-', label=df.columns[2])

# 设置极坐标 0° 的位置
ax1.set_theta_zero_location('N') 
ax2.set_theta_zero_location('N') 

# 设置显示的极径范围
ax1.set_rlim(0, 5)
ax2.set_rlim(0, 5)

# 填充颜色
ax1.fill(angles, data0, facecolor=c['浅蓝色'], alpha=0.6)
ax2.fill(angles, data1, facecolor=c['浅橙色'], alpha=0.6)

# 设置极径标签,放在第一象限的中间位置
ax1.set_rlabel_position(360-360/len(data0)/2)
ax2.set_rlabel_position(360-360/len(data0)/2)
 
ax1.spines['polar'].set_visible(False) 
ax2.spines['polar'].set_visible(False) 

# 设置坐标标签字体大小和颜色
ax1.tick_params(labelsize=16, colors=c['深灰色'])
ax2.tick_params(labelsize=16, colors=c['深灰色'])

plt.show()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档