python极坐标画图时,不仅可以画实线图,画散点图,也可以直方图。
实线图画法如下述链接。
散点图画法如下述链接。
今天我们一起学习一下直方图画法。
【1】官网教程
首先依然是导航到官网,乖乖学习官网教程:
官网运行示例代码,在极坐标汇总画出了直方图,为此我对代码做了注释。
【2】代码解读
最初依然是numpy和matplotlib定义:
import matplotlib.pyplot as plt #引入matplotlib模块画图 import numpy as np #引入numpy模块做数学计算
然后是定义一批数据用于画图:
np.random.seed(19680801) #定义随机数种子 # Compute pie slices N = 20 #定义常数 theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False) #在[0,2pi)中取20个点 radii = 10 * np.random.rand(N) #输出20个随机数,每个随机数*10后赋值给r
先定义了随机数种子,然后要求定义20个随机数,这些随机数扩大10倍后背赋值给r。
theta直接在[0,2pi)中取20个点,因为一个圆周360°,转化为弧度就是2pi,所以追踪这20个点刚好可以在极坐标中旋转一圈。
然后继续定义了width和colors:
width = np.pi / 4 * np.random.rand(N) #定义方块宽度 colors = plt.cm.viridis(radii/10. ) #定义颜色
最后是定义要画极坐标图:
ax = plt.subplot(projection='polar') #定义要画极坐标图
出图之前详细定义了图形属性:
ax.bar(theta, radii, width=width, bottom=0, color=colors, alpha=0.5) #定义极坐标中要画成方块 plt.show() #输出图形
最后的输出结果为:
图1
【3】修改代码
【3.1】将N=20改为N=100
N=20到N=100,是将随机数增多,相应增多极坐标的点,具体的输出结果为:
图2
输出结果如图2所示,方块变多,交织重叠在一起。
【3.2】将ax.bar中的 bottom=0改为bottom=radii
由图2可见,不同的方块交织重叠在一起,对图片分析有一定影响,因此考虑将方块的起始位置改为对应的半径长度,输出结果为:
图3
由图3可见,中心区域出现了零散的空白,重叠部分已经明显消除。
【3.3】将ax.bar中的width=width改为width=0.5*width
由图3可见,在半径较大的区域,不同的方块交织依然重叠在一起,对图片分析依然有一定影响,因此考虑将方块的宽度改为原来的一半,此时的输出结果为:
图4
由图4可见, 在半径较大的区域,不同的方块交织少量重叠在一起,图片的阅读更加轻松便捷。
【3.4】增加ax.set_rticks([0.5, 5.5, 10.5, 16])
图1到图4均输出了较为密集的坐标轴(圆圈),为降低坐标轴的密度,尝试自主设定需要输出的坐标轴内半径,在ax.bar()前一行增加ax.set_rticks([0.5, 5.5, 10.5, 16])代码。此时的输出结果为:
图5
由图5可见,图片按照设定的代码,依次输出了半径为[0.5,5,5,10.5,16]的圆圈。
【3.5】增加图名
图片需要一个名字,为此在plt.show()前面增加一行代码:
ax.set_title("A bar plot on a polar axis", va='bottom') #设置图名
此时的输出结果为:
图6
由图可见,图名已经显示。
完整代码如下:
import matplotlib.pyplot as plt #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算
# Fixing random state for reproducibility
np.random.seed(19680801) #定义随机数种子
# Compute pie slices
N = 100 #定义常数
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False) #在[0,2pi)中取20个点
radii = 10 * np.random.rand(N) #输出20个随机数,每个随机数*10后赋值给r
width = np.pi / 4 * np.random.rand(N) #定义方块宽度
colors = plt.cm.viridis(radii/10. ) #定义颜色
ax = plt.subplot(projection='polar') #定义要画极坐标图
ax.set_rticks([0.5, 5.5, 10.5, 16]) #设置输出坐标
ax.bar(theta, radii, width=0.5*width, bottom=radii, color=colors, alpha=0.5) #定义极坐标中要画成方块
ax.set_title("A bar plot on a polar axis", va='bottom') #设置图名
plt.show() #输出图形
【4】同时输出直方图、散点图和实线图
在前述学习过程中,已经掌握实线图和散点图的画法,此处将它们同时输出:
在前述完整代码中,自colors以下,更改为:
fig,[ax1,ax2,ax3] = plt.subplots(1, 3, sharey=True, figsize=(6, 2)) #定义画图
这里要求绘制1行3列的图形,共享Y轴 。
绘制直方图:
ax1 = fig.add_subplot(1,3,1,projection='polar') b=ax1.bar(theta, radii, width=0.5*width, bottom=radii, color=colors, alpha=0.5) #定义极坐标中要画成方块 ax1.set_title("A bar plot on a polar axis", va='bottom') #设置图名
绘制散点图:
ax2 = fig.add_subplot(1,3,2,projection='polar') c=ax2.scatter(theta, radii,c=radii,s=15*radii,cmap='hsv', alpha=0.5) #定义极坐标中要画成散点图 ax2.set_title("A scatter plot on a polar axis", va='bottom') #设置图名
绘制实线图:
ax3 = fig.add_subplot(1,3,3,projection='polar') a=ax3.plot(theta, radii, alpha=0.5) #定义极坐标中要画成实线 ax3.set_title("A bar plot on a polar axis", va='bottom') #设置图名
输出图形:
plt.show() #输出图形
输出结果为:
图7
图7输出了三种极坐标图形。
在图7的基础上,我们看到出现了方框,下一步将其删除。增加一行代码在fig,[ax1,ax2,ax3] = plt.subplots(1, 3, sharey=True, figsize=(6, 2)) #定义画图之下,改后为:
fig,[ax1,ax2,ax3] = plt.subplots(1, 3, sharey=True, figsize=(6, 2)) #定义画图 fig.delaxes(ax1) #删除图1方框 fig.delaxes(ax2) #删除图2方框 fig.delaxes(ax3) #删除图3方框
此时的输出结果为;
图8
可见图8中所有方框都不显示了。
【5】总结
本文学习了画极坐标下的直方图,灵活修改了方块的位置、宽度等属性。此外成功实现同时在极坐标下输出直方图、散点图和实线图。