Python 数据分析三剑客之 Matplotlib(九):极区图 / 极坐标图 / 雷达图的绘制

本秂侑毒 提交于 2020-07-28 17:09:33

小黄人番外短片合集 — 第15集【Mower Minions 修剪草坪的小黄人】


Matplotlib 系列文章(持续更新中):



这里是一段防爬虫文本,请读者忽略。
本文原创首发于 CSDN,作者 TRHX。
博客首页:https://itrhx.blog.csdn.net/
本文链接:https://itrhx.blog.csdn.net/article/details/106162412

【1x00】了解极坐标

参考百度百科:极坐标,属于二维坐标系统,创始人是牛顿,主要应用于数学领域。极坐标是指在平面内取一个定点 O,叫极点,引一条射线 Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向)。对于平面内任何一点 M,用 ρ 表示线段 OM 的长度(有时也用 r 表示),θ 表示从 Ox 到 OM 的角度,ρ 叫做点 M 的极径,θ 叫做点 M 的极角,有序数对 (ρ,θ) 就叫点 M 的极坐标,这样建立的坐标系叫做极坐标系。通常情况下,M 的极径坐标单位为 1(长度单位),极角坐标单位为 rad(或°)。

在这里插入图片描述

分割图

【2x00】基本方法 matplotlib.pyplot.polar()

matplotlib.pyplot.polar() 方法可用于绘制极坐标图。

基本语法:polar(theta, r, **kwargs)

  • theta:点的角坐标,以弧度单位传入参数;
  • r:点的半径坐标;
  • **kwargs:可选项,其他 Line2D 属性,常用属性见表一

拓展:数学上通常是用弧度而非角度,弧度单位缩写为 rad,2π rad = 360°,1° ≈ 0.0174533 rad,1 rad ≈ 57.29578°。

  • 角度转换为弧度公式:弧度 = 角度 ÷ 180 × π
  • 弧度转换为角度公式:角度 = 弧度 × 180 ÷ π
表一:Line2D 部分属性,完整属性参见官方文档:
https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html
属性 描述
alpha 线条透明度,float 类型,取值范围:[0, 1],默认为 1.0,即不透明
antialiased / aa 是否使用抗锯齿渲染,默认为 True
color / c 线条颜色,支持英文颜色名称及其简写、十六进制颜色码等,更多颜色示例参见官网 Color Demo
fillstyle 点的填充样式,'full''left''right''bottom''top''none'
label 图例,具体参数参见:
《Python 数据分析三剑客之 Matplotlib(三):图例 / LaTeX / 刻度 / 子图 / 补丁等基本图像属性》
linestyle / ls 连接的线条样式:'-' or 'solid', '--' or 'dashed', '-.' or 'dashdot'
':' or 'dotted', 'none' or ' ' or ''
linewidth / lw 连接的线条宽度,float 类型,默认 0.8
marker 标记样式,具体样式参见表二
markeredgecolor / mec marker 标记的边缘颜色
markeredgewidth / mew marker 标记的边缘宽度
markerfacecolor / mfc marker 标记的颜色
markerfacecoloralt / mfcalt marker 标记的备用颜色
markersize / ms marker 标记的大小
表二:marker 标记的样式,官方文档:
https://matplotlib.org/api/markers_api.html
标记 描述
"."
"," 像素点
"o" 圆圈
"v" 倒三角
"^" 正三角
"<" 左三角
">" 右三角
"1" 倒三叉星
"2" 正三叉星(类似奔驰车标形状)
"3" 左三叉星
"4" 右三叉星
"8" 八边形
"s" 正方形
"p" 五边形
"P" 填充的加号(粗加号)
"+" 加号
"*" 星形
"h" 六边形(底部是角)
"H" 六边形(底部是边)
"x" x 号
"X" 填充的 x 号(粗 x 号)
"D" 粗菱形(对角线相等)
"d" 细菱形(对角线不等)
"|" 垂直线
"_" 水平线
0 水平线靠左
1 水平线靠右
2 垂直线靠上
3 垂直线靠下
4 左三角(比 "<" 更细)
5 右三角(比 ">" 更细)
6 正三角(比 "^" 更细)
7 倒三角(比 "v" 更细)
8 左三角(比 "<" 更细,靠左显示)
9 右三角(比 ">" 更细,靠右显示)
10 正三角(比 "^" 更细,靠上显示)
11 倒三角(比 "v" 更细,靠下显示)
"None" / " " / "" 无样式
'$...$' 支持 LaTeX 数学公式,表达式用美元符号包围起来

分割图

【3x00】绘制极坐标

import numpy as np
import matplotlib.pyplot as plt

# 设置中文显示
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 设置画布大小
plt.figure(figsize=(8.0, 6.0))

# 设置三个数据,theta 为点位置的弧度参数,r 为点的半径坐标
theta1 = np.array([1.25*np.pi, np.pi/2, 0])
theta2 = np.array([-np.pi/6, -np.pi/2, 0, np.pi/2, np.pi])
theta3 = np.arange(0., 2*np.pi, 0.5)
r1 = np.array([4, 2, 3])
r2 = np.array([5, 2, 4, 5, 3])
r3 = np.random.randint(0, 5, 13)

# 绘制第一个极坐标图,点的标记样式为细菱形,大小为8,点之间的连接线条样式为:
plt.polar(theta1, r1, marker='d', ms=8, ls=':', label='数据一')
# 填充第一个极坐标图,填充颜色为蓝色,透明度0.3
plt.fill(theta1, r1, color='b', alpha=0.3)
# 绘制第二个极坐标图,marker、linestyle、color 三个参数可以组合以字符串形式传入
plt.polar(theta2, r2, '*-g', ms=10, label='数据二')
# 绘制第三个极坐标图,设置 linestyle 为 none,即点与点之间不相连
plt.polar(theta3, r3, marker='o', ls='none', ms=8, color='r', label='数据三')

plt.title('matplotlib.pyplot.polar 用法示例', pad=25, fontsize=15)
plt.legend(bbox_to_anchor=(1.3, 1))

plt.show()

示例中 figure、title、legend 等其他方法的解释可参见我的系列文章:

绘制结果如下图:

02

分割图

【4x00】绘制雷达图

雷达图是以从同一点开始的轴上表示的三个或更多个定量变量的二维图表的形式显示多变量数据的图形方法。轴的相对位置和角度通常是无信息的。 雷达图也称为网络图,蜘蛛图,星图,蜘蛛网图,不规则多边形,极坐标图或 Kiviat 图。它相当于平行坐标图,轴径向排列。

在前面的示例中,使用了 matplotlib.pyplot.fill() 方法对三个极坐标点围成的图形进行了填充,这就有点儿接近于雷达图了,仔细观察前面的示例,在填充时第一个点和最后一个点之间没有连线,即没有闭合,而更精确的雷达图应该是闭合的,且外围应该是文字描述而不是度数。

在绘制雷达图之前需要提前了解一些函数。这些函数可以帮助我们实现闭合、自定义文字标签等。


【4x01】理解 numpy.concatenate()

numpy.concatenate() 方法用于沿现有轴连接一系列数组,我们可以利用此方法来实现闭合操作。

基本语法:numpy.concatenate((a1, a2, ...)[, axis=0, out=None])

参数 描述
a1, a2, … 要连接的数组,必须拥有相同的维度
axis 沿指定轴连接数组,可选项,如果 axis 为 None,则数组在使用前被展平,默认值为 0
out 用于接收连接后的数组,可选项

用法示例:

import numpy as np

a = np.array([1, 2, 3, 4])
b = np.array(['a', 'b', 'c', 'd'])
print(np.concatenate((a, b)))

输出结果如下:

['1' '2' '3' '4' 'a' 'b' 'c' 'd']

如果要实现数组的闭合,则可以传入原数组和一个新数组,其中新数组中的元素为原数组中的第一个元素,示例如下:

import numpy as np

a = np.array([1, 2, 3, 4])
print(np.concatenate((a, [a[0]])))

输出结果如下:

[1 2 3 4 1]

【4x02】理解 pyplot.thetagrids()

matplotlib.pyplot.thetagrids() 方法用于获取并设置当前极区图上的极轴。

基本语法:matplotlib.pyplot.thetagrids(angles, labels=None, fmt=None, **kwargs)

参数 描述
angles 网格线的角度,浮点数、度数组成的元组
labels 每个极轴要使用的文本标签,字符串组成的元组
fmt 格式化 angles 参数,如 '%1.2f' 保留两位小数,注意,将使用以弧度为单位的角度
**kwargs 其他关键字参数,参见官方文档

应用举例:

 import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

plt.polar()
angles = range(0, 360, 45)
labels = ('东', '东北', '北', '西北', '西', '西南', '南', '东南')
plt.thetagrids(angles, labels)
plt.title('matplotlib.pyplot.thetagrids() 用法示例', pad=15)

plt.show()

03


【4x03】绘制雷达图

numpy.concatenate() 方法能够解决闭合问题,matplotlib.pyplot.thetagrids() 能够解决自定义极轴和极轴的文本标记问题,因此就可以绘制一个标准的雷达图了。示例如下:

import numpy as np
import matplotlib.pyplot as plt

# 设置中文显示、画布大小
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.figure(figsize=(8.0, 6.0))

# 分割圆并执行闭合操作(0-2π之间返回间隔均匀的6个弧度:π/3、2π/3、π、4π/3、5π/3、2π)
theta = np.linspace(0, 2*np.pi, 6, endpoint=False)
theta = np.concatenate((theta, [theta[0]]))

# 设置两组数据并执行闭合操作
data1 = np.array([9, 4, 3, 5, 2, 8])
data2 = np.array([3, 6, 9, 6, 3, 2])
data1 = np.concatenate((data1, [data1[0]]))
data2 = np.concatenate((data2, [data2[0]]))

# 绘制并填充两组数据
plt.polar(theta, data1, 'bo-', label='小王')
plt.polar(theta, data2, 'ro:', label='小张')
plt.fill(theta, data1, color='b', alpha=0.3)
plt.fill(theta, data2, color='r', alpha=0.3)

# 将六个弧度(π/3、2π/3、π、4π/3、5π/3、2π)转换成角度,并分别设置标签
labels = np.array(['Python', 'Golang', 'Java', 'C++', 'PHP', 'JavaScript'])
plt.thetagrids(theta * 180/np.pi, labels)

# 设置刻度范围、标题、图例
plt.ylim(0, 10)
plt.title('编程语言掌握程度')
plt.legend(bbox_to_anchor=(1.3, 1))
plt.show()

04

分割图

【5x00】高级用法:绘制极坐标散点图

matplotlib.pyplot.polar() 方法可以实现极坐标散点图,但仅用这一个函数的话实现的样式效果并不多,以下介绍另外三种绘制极坐标散点图的方法:

  • matplotlib.pyplot.polar()matplotlib.pyplot.scatter() 结合,前者绘制极坐标图,后者在极坐标图上绘制散点图;

  • matplotlib.pyplot.subplot()matplotlib.pyplot.scatter() 结合,前者添加子图,其中指定 projection='polar' 即为极坐标图, 后者在极坐标图上绘制散点图;

  • matplotlib.pyplot.axes()matplotlib.pyplot.scatter() 结合,前者设置绘图区参数,其中指定 projection='polar'polar=True 即为极坐标图, 后者在极坐标图上绘制散点图。


【5x01】方法一:pyplot.scatter() 与 pyplot.polar()

以下用到的 matplotlib.pyplot.scatter() 函数,各参数含义以及支持的其他参数可以参见前文:

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

N = 50
r = 2 * np.random.rand(N)
theta = 2 * np.pi * np.random.rand(N)
size = 200 * r ** 2
colors = N * np.random.rand(N)

plt.polar()
plt.scatter(theta, r, s=size, c=colors, alpha=0.8)
plt.title('极坐标散点图示例一', pad=15)

plt.show()

05


【5x02】方法二:pyplot.scatter() 与 pyplot.subplot()

matplotlib.pyplot.subplot() 方法用于添加子图,如果想要子图为极坐标图,则需要指定 projection 参数为 polar,有关此函数的具体介绍可参见官方文档。其他函数的参数解释可参考前文:

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

N = 50
r = 2 * np.random.rand(N)
theta = 2 * np.pi * np.random.rand(N)
size = 200 * r ** 2
colors = N * np.random.rand(N)

# 一行一列第一个子图
plt.subplot(111, projection='polar')
plt.scatter(theta, r, s=size, c=colors, alpha=0.8)
plt.title('极坐标散点图示例二', pad=15)

plt.show()

06


【5x03】方法三:pyplot.scatter() 与 pyplot.axes()

axes 为 Matplotlib 图像中的绘图区,matplotlib.pyplot.axes() 方法可以对绘图区进行设置,同样的也可以设置 projection 参数为 polar 来实现极坐标图,设置 polar=True 也行。示例中其他函数的参数解释可参考前文:

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

N = 50
r = 2 * np.random.rand(N)
theta = 2 * np.pi * np.random.rand(N)
size = 200 * r ** 2
colors = N * np.random.rand(N)

# plt.axes(polar=True)
plt.axes(projection='polar')
plt.scatter(theta, r, s=size, c=colors, alpha=0.8)
plt.title('极坐标散点图示例三', pad=15)

plt.show()

07

分割图

【6x00】高级用法:绘制极坐标柱状图

和极坐标散点图的绘制类似,matplotlib.pyplot.polar() 方法可以实现极坐标图,但仅用这一个函数的话实现的样式效果并不多,以下介绍另外三种绘制极坐标柱状图的方法:

  • matplotlib.pyplot.polar()matplotlib.pyplot.bar() 结合,前者绘制极坐标图,后者在极坐标图上绘制柱状图;

  • matplotlib.pyplot.subplot()matplotlib.pyplot.bar() 结合,前者添加子图,其中指定 projection='polar' 即为极坐标图, 后者在极坐标图上绘制柱状图;

  • matplotlib.pyplot.axes()matplotlib.pyplot.bar() 结合,前者设置绘图区参数,其中指定 projection='polar'polar=True 即为极坐标图, 后者在极坐标图上绘制柱状图。


【6x01】方法一:pyplot.bar() 与 pyplot.polar()

以下用到的 matplotlib.pyplot.bar() 函数,各参数含义以及支持的其他参数可以参见前文:

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

r = np.random.rand(8)
theta = np.arange(0, 2 * np.pi, 2 * np.pi / 8)
colors = np.array(['#4bb2c5', '#c5b47f', '#EAA228', '#579575', '#839557', '#958c12', '#953579', '#4b5de4'])

plt.polar()
plt.bar(theta, r, color=colors, alpha=0.8)
plt.title('极坐标柱状图示例一', pad=15)

plt.show()

08


【6x02】方法二:pyplot.bar() 与 pyplot.subplot()

matplotlib.pyplot.subplot() 方法用于添加子图,如果想要子图为极坐标图,则需要指定 projection 参数为 polar,有关此函数的具体介绍可参见官方文档。其他函数的参数解释可参考前文:

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

r = np.random.rand(8)
theta = np.arange(0, 2 * np.pi, 2 * np.pi / 8)
colors = np.array(['#4bb2c5', '#c5b47f', '#EAA228', '#579575', '#839557', '#958c12', '#953579', '#4b5de4'])

plt.subplot(111, projection='polar')
plt.bar(theta, r, color=colors, alpha=0.8)
plt.title('极坐标柱状图示例二', pad=15)

plt.show()

09


【6x03】方法三:pyplot.bar() 与 pyplot.axes()

axes 为 Matplotlib 图像中的绘图区,matplotlib.pyplot.axes() 方法可以对绘图区进行设置,同样的也可以设置 projection 参数为 polar 来实现极坐标图,设置 polar=True 也行。示例中其他函数的参数解释可参考前文:

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

r = np.random.rand(8)
theta = np.arange(0, 2 * np.pi, 2 * np.pi / 8)
colors = np.array(['#4bb2c5', '#c5b47f', '#EAA228', '#579575', '#839557', '#958c12', '#953579', '#4b5de4'])

# plt.axes(polar=True)
plt.axes(projection='polar')
plt.bar(theta, r, color=colors, alpha=0.8)
plt.title('极坐标柱状图示例三', pad=15)

plt.show()

10


这里是一段防爬虫文本,请读者忽略。
本文原创首发于 CSDN,作者 TRHX。
博客首页:https://itrhx.blog.csdn.net/
本文链接:https://itrhx.blog.csdn.net/article/details/106162412

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!