"六边形战士"雷达图是怎样画出来的
大家认识这张图吧!
图片来源于网络
乒乓球大佬马龙无论是从力量、速度、技巧、发球、防守、经验六个方面都是边框撑爆,不得不说,在日本乒乓球选手面前马龙就是神一样的存在啊,就像游戏里面的大Boss一样的又很又慕啊!
那么,大家知道这这样的雷达图是怎样的生成出来的吗?
实际上,想生成这样的图是很简单的。而且我们可以借用很多工具来实现。比如我们前面用来生成疫情地图的Tableau或者PowerBi、FineBi等商业工具都可以轻松的绘出,而作为具有强大三方库社区的Python语言来讲,自然也肯定能够实现这样的图。接下来,我们就用Python也实现一下这样的“六边形战士”雷达图。
首先,我们先来剖析一下在可视化时候实现雷达图的原理。实际上雷达图就是一个简单的折线图,但是,不同的是,我们将这个折线图映射到了极坐标上,那么,也就得到了雷达图。
顺便讲一下,雷达图作用是什么呢?既然看得懂“六边形战士”,那么,相信你知道就看懂了雷达图,没错,我们从”六边形战士“马龙的实力雷达图上发现,马龙无论是在力量、速度、技巧、发球、防守、还是经验方面都是无可挑剔。也就是说,雷达图实际上也就是像折线图一样,我们能够看出各横坐标对应的数值的代表情况,但是,如果我们知道,通常折线图横坐标和纵坐标一般只各自代表一个属性变量,而且,就算我们从内心接收纵轴画几个属性标量的数值,但是我们会发现那样出的图并不直观,就像下面这样。
相信这样的图,我们内心是接受不了的吧!
但是,想像一下,如果我们将这个折线图映射到极坐标上,那么,我们要了解的信息是不是自然一目了然呢?因此,雷达图正式这样的作用,当我们需要对几个属性(属性不多)的数据进行比较时,从折线图上和直方图上都不能很合适的情况下,我们就可以采用雷达图来进行可视化,这样更加一目了然。当然,我们还可以用它来用在很多其他的应用场景。
讲完雷达图的作用和可视化原理,下面,我们正式开画。
使用matplotlib来进行可视化
1、导入数据
# 导入数据分析三大神器import numpy as np
import pandas as pd
import matplotlib.pyplot as pltimport warnings
warnings.filterwarnings("ignore") # 忽略警告
2、设置极坐标的角度和“六边形战士“的数据
# 设定角度
angles = np.linspace(0,2*np.pi,7,endpoint=True) # # 设置数据
data = np.array([[7]*7]) # 这里设置7个数据,并且保证第一和最后一个数据相等
参数代表从0到2*pi,将它分成7个角度,这样实际得到的第七个角度和第1个角度是一样的,一个为2Pi,另一个为0,实际上为我们也可以只设置留个角度,然后将6个数据放在对应的轴上,但是那样不能使得我们如果在雷达图的第一个数据不等于第六个数据时将使得雷达图不能闭合,就像下面这样。
所以这就是多设置一个数值,而且使得第7个数值和第一个数值相同的原因。
3、用创建画布,建立极坐标,绘图
fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111,polar=True) # 使用极坐标plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题# 画线
# for i in range():
ax.plot(angles,data[0],linewidth=2) # linewidth=2线条宽度# 填充颜色,alpha表示透明高度
ax.fill(angles,data[0],alpha=0.5,color='red')# 画轴并画出轴的标签,fontsize设置字体大小
ax.set_thetagrids(angles[:-1]*180/np.pi,['力量','速度','技巧','发球','防守','经验'],fontsize=15)# 添加标题
plt.title('马龙实力雷达图',fontsize=20)# 添加网格线
ax.grid(True)# 去掉最外围的黑圈
ax.spines['polar'].set_visible(False)
雷达图展示
怎么样,学废了吗?赶紧试试吧!
想要获取更多可视化及相关知识请移步到翔宇的微信公众号“数据分析者”
(打开微信扫一扫或者搜索公众号“数据分析者也是一样的哦”)