python画图|极坐标中画直方图

python极坐标画图时,不仅可以画实线图,画散点图,也可以直方图。

实线图画法如下述链接。

python画图|极坐标画图基础教程-CSDN博客

散点图画法如下述链接。

python画图|极坐标中画散点图-CSDN博客

今天我们一起学习一下直方图画法。

【1】官网教程

首先依然是导航到官网,乖乖学习官网教程:

https://matplotlib.org/stable/gallery/pie_and_polar_charts/polar_bar.html#sphx-glr-gallery-pie-and-polar-charts-polar-bar-py

 官网运行示例代码,在极坐标汇总画出了直方图,为此我对代码做了注释。

【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() #输出图形

最后的输出结果为:

 1a09e53bda874b0fb226344479cb28f0.png

图1

【3】修改代码

【3.1】将N=20改为N=100

N=20到N=100,是将随机数增多,相应增多极坐标的点,具体的输出结果为:

ef49f4e54e4043eb89fbe3b9acad5560.png

图2

输出结果如图2所示,方块变多,交织重叠在一起。

【3.2】将ax.bar中的 bottom=0改为bottom=radii

由图2可见,不同的方块交织重叠在一起,对图片分析有一定影响,因此考虑将方块的起始位置改为对应的半径长度,输出结果为:

288994da26e14ce9b3b4a1b386d746c6.png

图3

由图3可见,中心区域出现了零散的空白,重叠部分已经明显消除。

【3.3】将ax.bar中的width=width改为width=0.5*width

由图3可见,在半径较大的区域,不同的方块交织依然重叠在一起,对图片分析依然有一定影响,因此考虑将方块的宽度改为原来的一半,此时的输出结果为:

a3077917c5bb4f7b9ea3da50d3af0641.png

图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])代码。此时的输出结果为:

99477e68edfe4c09977d4f9b95cc591f.png

图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') #设置图名

此时的输出结果为:

03374649558c4b79a0fe49fb911d1d76.png

图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() #输出图形

输出结果为:

0c120b8a8e9e44d483a253fc24b31dad.png

图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方框

此时的输出结果为;

60661e5cb14543d48a523f811dace047.png

图8

可见图8中所有方框都不显示了。

【5】总结

本文学习了画极坐标下的直方图,灵活修改了方块的位置、宽度等属性。此外成功实现同时在极坐标下输出直方图、散点图和实线图。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值