python画图|极坐标下的3D surface

前述学习过程中,我们已经掌握了3D surface的基本绘制技巧,详见链接:

python画图|3D surface基础教程-CSDN博客

基础教程中的3D surface绘制位于笛卡尔坐标系,但有时候会用到极坐标绘图。虽然我们已经学过简单的极坐标绘图技巧,详见链接:

python画图|极坐标中画直方图_ax1.plot()怎么画直方图-CSDN博客

但前面的极坐标绘图学习也是基于笛卡尔坐标系。

因此,很有必要继续探索3D 极坐标系下的surface图绘制。

【1】官网教程

打开官网链接,看到漂亮的3D图:

3D surface with polar coordinates --- Matplotlib 3.9.2 documentation

很有必要,读懂官网程序。

【2】程序解读

程序开始,是亘古不变的numpy、matplotlib引入:

复制代码
import matplotlib.pyplot as plt #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算

然后设定要画图,画3D图:

复制代码
fig = plt.figure() #定义要画图
ax = fig.add_subplot(projection='3d') #定义要画3D图

到这里其实都是前置条件,说明了要画图,给出了画图必须得数据计算支撑模块numpy和输出图形支撑模块matplotlib。

然后才开始定义变量:

复制代码
# Create the mesh in polar coordinates and compute corresponding Z.
r = np.linspace(0, 1.25, 50) #定义自变量r
p = np.linspace(0, 2*np.pi, 50) #定义自变量p
R, P = np.meshgrid(r, p) #自变量r和p充分组合
Z = ((R**2 - 1)**2) #定义因变量R

# Express the mesh in the cartesian system.
X, Y = R*np.cos(P), R*np.sin(P) #定义因变量XY

这里的meshgrid让r和p充分组合,之后:先完成了Z的定义,在完成了Z和Y的定义。

接下来输出图形:

复制代码
# Plot the surface.
ax.plot_surface(X, Y, Z, cmap=plt.cm.YlGnBu_r) #画surface面,颜色按照YlGnBu_r分布

最后对坐标属性进行了设定,并输出图形:

复制代码
# Tweak the limits and add latex math labels.
ax.set_zlim(0, 1) #设定Z轴范围
ax.set_xlabel(r'$\phi_\mathrm{real}$') #设定X轴为实轴
ax.set_ylabel(r'$\phi_\mathrm{im}$') #设定Y轴为虚轴
ax.set_zlabel(r'$V(\phi)$') #设定Z轴为角度轴

plt.show() #输出图形

++图1++

图1即为输出图形。

至此增添注释后的完整代码为:

python 复制代码
import matplotlib.pyplot as plt #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算

fig = plt.figure() #定义要画图
ax = fig.add_subplot(projection='3d') #定义要画3D图

# Create the mesh in polar coordinates and compute corresponding Z.
r = np.linspace(0, 1.25, 50) #定义自变量r
p = np.linspace(0, 2*np.pi, 50) #定义自变量p
R, P = np.meshgrid(r, p) #自变量r和p充分组合
Z = ((R**2 - 1)**2) #定义因变量R

# Express the mesh in the cartesian system.
X, Y = R*np.cos(P), R*np.sin(P) #定义因变量XY

# Plot the surface.
ax.plot_surface(X, Y, Z, cmap=plt.cm.YlGnBu_r) #画surface面,颜色按照YlGnBu_r分布

# Tweak the limits and add latex math labels.
ax.set_zlim(0, 1) #设定Z轴范围
ax.set_xlabel(r'$\phi_\mathrm{real}$') #设定X轴为实轴
ax.set_ylabel(r'$\phi_\mathrm{im}$') #设定Y轴为虚轴
ax.set_zlabel(r'$V(\phi)$') #设定Z轴为角度轴

plt.show() #输出图形

【3】修改代码

cmap=plt.cm.YlGnBu_r为渐变式的上色,color为纯色。画图结果为:

++图2++

由图2课件,整个图形已经更换为红色。

【4】改写代码

改写代码,实现:

【a】并列输出多个图形;

【b】设定不同颜色的输出。

首先,将fig定义改为subplots形式,并约定每个子模型都画3D图:

复制代码
fig ,[ax1,ax2,ax3]= plt.subplots(1,3,sharey=True,figsize=(6,2)) #定义要画图
ax1 = fig.add_subplot(1,3,1,projection='3d') #定义要画3D图
ax2 = fig.add_subplot(1,3,2,projection='3d') #定义要画3D图
ax3 = fig.add_subplot(1,3,3,projection='3d') #定义要画3D图

然后,修改画图plot_surface模块中的颜色指定:

复制代码
ax1.plot_surface(X, Y, Z, cmap=plt.cm.PuBuGn) #画surface面,颜色按照PuBuGn分布
ax2.plot_surface(X, Y, Z, color='r') #画surface面,颜色为红色
ax3.plot_surface(X, Y, Z, color='g') #画surface面,颜色为绿色

此时的结果为:

++图3++

图3即为并列输出结果,此时只有最左侧图形为渐变色。这里使用了PuBuGn代码,这个代码代表了一种新的渐变,详情可参考下述链接:

Choosing Colormaps in Matplotlib --- Matplotlib 3.9.2 documentation

上图3中,似乎渐变图是最好看的,参考上述链接,修改颜色代码后:

复制代码
# Plot the surface.
ax1.plot_surface(X, Y, Z, cmap=plt.cm.PuBuGn) #画surface面,颜色按照PuBuGn分布
ax2.plot_surface(X, Y, Z, cmap='Accent') #画surface面,颜色为v
ax3.plot_surface(X, Y, Z, cmap='summer_r') #画surface面,颜色为summer_r

此时的输出结果为:

++图4++

由图4可见,不同颜色的表达给人的感觉不同。

为精益求精,尝试把每个图的方框去掉,并且加上图名:

改后的执行去除方框功能和附近其他代码为:

复制代码
fig ,[ax1,ax2,ax3]= plt.subplots(1,3,sharey=True,figsize=(6,2)) #定义要画图
fig.delaxes(ax1) #去除方框
fig.delaxes(ax2) #去除方框
fig.delaxes(ax3) #去除方框

增加图名代码为:

复制代码
# Tweak the limits and add latex math labels.
ax1.set_title(label='cmap=plt.cm.PuBuGn' )
ax2.set_title(label='cmap=Accent' )
ax3.set_title(label='cmap=summer_r' )

输出图形为:

++图5++

图5即为无方框、带图名并列输出结果。

【5】总结

学习了极坐标下的3D surface画法,尝试修改了图形颜色,掌握了多个图形输出的方法,掌握了图形方框和图名设置方法。

相关推荐
一点媛艺5 分钟前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风9 分钟前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生1 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功1 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
闲晨1 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
_.Switch2 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
老猿讲编程2 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk3 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*3 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue3 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang