~ 今天的代码学习——绘制3D图(参数曲线)
代码
# @Author : 发疯的谢必安
# @Time : 2024/3/18 19:20
# @Description: 3D 曲线
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
mpl.rcParams[ 'legend.fontsize']= 10
fig = plt.figure()
ax= fig.add_subplot(111, projection='3d')
theta =np.linspace(-4 * np.pi, 4 * np.pi, 100)
z=np.linspace(-4,4,100)*0.3
r = z ** 3 + 1
x = r * np.sin(theta)
y = r * np. cos(theta)
ax.plot(x,y,z, label= 'parametric curve' )
ax.legend()
plt. show()
方法及参数
mpl.rcParams
: 这是一个配置字典,允许你自定义多种matplotlib
的样式和行为配置。rcParams
中的rc
意味着 “runtime configuration”(运行时配置)。legend.fontsize
: 这是mpl.rcParams
字典中的一个键,用于设置图例中字体的大小。fontsize
字面上的意思是 “字体大小”。plt.figure()
: 这是matplotlib.pyplot
模块中的一个函数,用于创建一个新的图形。figure
字面意思是 “图形”,在matplotlib
中,它是绘图的顶级容器。fig.gca(projection='3d')
:fig
: 是之前通过plt.figure()
创建的图形实例的变量名。gca
: 是figure
实例的方法,代表 “get current axis”(获取当前坐标轴)。该方法返回当前活动的轴实例,如果没有活动的轴实例,则创建一个新的。projection='3d'
: 是gca
方法的参数,表示请求的坐标轴应该是三维的。字面意义是 “投影”,这里用来指定创建的坐标轴是三维空间坐标轴。
np.linspace
: 这是numpy
库中的一个函数,用于生成一个等间隔的数字数组。linspace
中的lin
表示 “linear”(线性的),space
表示 “spacing”(间隔),整体含义是“线性间隔”。theta
,z
,r
,x
,y
: 这些变量名代表的是数学中常用的参数和变量名,用于计算和表示3D参数曲线的不同维度:theta
: 通常用于极坐标或球坐标系统中表示角度的一个变量。z
: 这里指的是3D空间中的第三个坐标,与二维平面的x
和y
坐标轴垂直。r
: 在极坐标系统中,r
通常表示距原点的半径。在这段代码中,r
与z
相关,用于计算x
和y
。x
和y
: 代表3D空间中的水平和垂直坐标轴。
ax.plot
: 这是Axes3D
对象的方法,用于在三维空间中绘制线条或者标记点。ax
: 代表了当前的三维坐标轴实例。plot
: 字面上是 “画图” 或 “绘制” 的意思,这里用于绘制数据点形成的线条。
label='parametric curve'
:label
参数在plot
方法中用于指定为这条曲线设置的图例名称。parametric curve
直译为 “参数曲线”,表示这是按照参数方程定义的曲线。plt.show()
: 这是matplotlib.pyplot
模块的函数,用于显示所有已经绘制的图形。show
字面上的意思是 “展示”。
关于ax= fig.add_subplot(111, projection=‘3d’)
在 matplotlib
中,fig.add_subplot()
方法用于向图形窗口(figure)中添加一个子图(subplot)。这个方法非常灵活,允许你定制子图的布局和特性。当你想要在一个图形窗口中展示多个图表,或者创建特定的图表布局时,add_subplot
方法是非常有用的。
方法解释
-
fig: 这是你想要添加子图的图形窗口(figure)的实例。在
matplotlib
中,你通常首先创建一个figure
实例,然后在这个figure
上添加一个或多个子图(subplots)。 -
add_subplot(): 这个方法属于
figure
类。它的作用是在figure
中添加一个新的子图。
参数解释
add_subplot
方法有几种不同的参数形式,但其中最常见的是三个整数的形式(nrows
, ncols
, index
),或者是一个三位整数(如 111
)。在调用 add_subplot(111, projection='3d')
时,参数的意义如下:
-
111(或
nrows
,ncols
,index
): 这三个整数参数定义了子图的格局和位置。-
nrows
和ncols
: 这两个参数将figure
窗口分割成nrows * ncols
的网格(行×列)。在这个例子中,111
相当于nrows=1
和ncols=1
,意味着整个figure
只包含一个子图。 -
index
: 这个参数指定了子图在网格中的位置。索引从1开始,左到右,上到下编号。在这个例子中,只有一个子图,所以index
也是1。
-
-
projection=‘3d’: 这个参数指定了子图的类型。通过设置
projection='3d'
,告诉matplotlib
你想要创建一个三维轴(Axes),而不是默认的二维轴。这需要mpl_toolkits.mplot3d
模块中的功能,该模块通过在代码中导入来激活三维绘图能力。
使用示例
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # 尽管看起来我们没有直接使用这个导入,但它是必须的,以注册3D投影
fig = plt.figure() # 创建一个figure对象
ax = fig.add_subplot(111, projection='3d') # 向这个figure添加一个3D子图
# 现在你可以使用ax实例来绘制三维图形了
通过这种方式,你可以创建三维的散点图、曲面图、线图等。add_subplot
方法以及 projection='3d'
参数是创建三维可视化的关键步骤。
Debug~
当你看到“未使用的import语句”这样的警告时,这意味着你的代码中导入了一个模块或者库,但之后并没有直接使用它。在mpl_toolkits.mplot3d
的 Axes3D
的情况下,这个警告可能会令人困惑,因为 Axes3D
的导入方式与其他模块略有不同。
在使用 matplotlib
的 mplot3d
来创建三维图时,你通常会这样开始你的代码:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
你可能会遇到这样的情况:虽然你导入了 Axes3D
,但实际上并没有在代码中显式地引用 Axes3D
类。这是因为在 matplotlib
的早期版本中,仅仅通过导入 Axes3D
就足以注册三维投影,这使得你可以创建三维轴而不需要直接使用 Axes3D
类。因此,即使看起来你没有使用 Axes3D
,只要你添加了三维轴,导入它就是必要的。在这种情况下,你的代码可能会是这样的:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
这里,三维轴是通过 add_subplot
方法的 projection='3d'
参数创建的,而不是直接使用 Axes3D
实例。因此,IDE或代码编辑器可能会认为 Axes3D
的导入是未使用的。
然而,最新的 matplotlib
版本已经改进了这一点,使得即使不显式导入 Axes3D
,只要你使用 projection='3d'
参数,三维轴也能成功创建。这意味着在新版本的 matplotlib
中,如果你的代码不直接使用 Axes3D
类,你可以不导入它,从而避免“未使用的import语句”的警告。
如果你确定你需要在你的代码中保留这个导入(例如,为了确保向后兼容性),但想要避免警告,你可以考虑使用一个IDE或编辑器特定的方法来抑制这个特定的警告。不过,对于大多数用途而言,只要你确保使用的 matplotlib
版本不要求显式导入 Axes3D
,你就可以安全地移除这个导入语句。
end
import matplotlib as mpl
# from mpl_toolkits.mplot3d import Axes3D
# mpl_toolkits.mplot3d 是 matplotlib 库中用于3D图形的模块,
# Axes3D() 方法用于创建实例
import numpy as np
import matplotlib.pyplot as plt
# runtime configuration parametric ,运行时配置参数,图例的字体大小设置为10
mpl.rcParams[ 'legend.fontsize']= 10
# figure 是顶级容器,可以看作是画布,创建画布 ,实例化
fig = plt.figure()
# # 向这个figure添加一个3D子图
ax= fig.add_subplot(111, projection='3d')
# 希腊字母θ ,linear space 线性间隔即等差数列
theta =np.linspace(-4 * np.pi, 4 * np.pi, 100)
z=np.linspace(-4,4,100)*0.3
r = z ** 3 + 1
x = r * np.sin(theta)
y = r * np. cos(theta)
# 在建立好的坐标系即轴上根据x,y,z 的值画出该曲线
ax.plot(x,y,z, label= 'parametric curve' )
# 标注图例
ax.legend()
# 绘图
plt. show()