使用 Seaborn 和 Matplotlib 创建 3D 绘图
在这个解释中,我们看看什么是 3D 绘图,并且我们还学习了如何在 seaborn 和 matplotlib 的帮助下创建几个不同的 3D 绘图。
使用 Seaborn 和 Matplotlib 创建 3D 绘图
让我们从导入 Matplotlib、NumPy 和 Seaborn 开始。
import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np
现在我们使用 NumPy 的随机模块来创建一些 x
、y
和 z
数据,我们总共有 50 个点。
mean = 3
number = 50
x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)
我们可以使用 Matplotlib 制作几种不同的 3D 图。每当我们想用 Matplotlib 进行 3D 绘图时,我们首先需要使用 axes()
函数创建一组轴。
我们将使用 projection
关键字并将 3D 值作为字符串传递。这将告诉 Matplotlib 我们将在三个维度上创建一些东西。
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
如果我们检查 axes
的类型,我们将看到这些是 3D 子图轴。
print(type(axes))
输出:
<class 'matplotlib.axes._subplots.Axes3DSubplot'>
我们需要调用 scatter3D()
函数并传递我们的 x
、y
和 z
数据点。这并不容易表示哪一个是 x
轴、y
轴等等,所以让我们为 3 个维度设置标签。
import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np
seaborn.set_style("darkgrid")
mean = 3
number = 50
x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
print(type(axes))
axes.scatter3D(x1, y1, z1)
axes.set_xlabel("x")
axes.set_ylabel("y")
axes.set_zlabel("z")
plot.show()
输出:
如果我们想增加散点的大小,我们可以引用这个 s
参数并将其增加到 100。
import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np
seaborn.set_style("darkgrid")
mean = 3
number = 50
x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
print(type(axes))
axes.scatter3D(x1, y1, z1, s=100)
axes.set_xlabel("x")
axes.set_ylabel("y")
axes.set_zlabel("z")
plot.show()
输出:
我们可以使用 view_init()
方法旋转这个三维图形。这个方法接受两个参数,第一个是我们的仰角,第二个是我们的方位角。
我们将以度为单位更改仰角,而不是弧度。我们可能还想在地平线上旋转这个图形,这就是我们的方位角。
import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np
seaborn.set_style("darkgrid")
mean = 3
number = 50
x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
print(type(axes))
axes.scatter3D(x1, y1, z1)
axes.set_xlabel("x")
axes.set_ylabel("y")
axes.set_zlabel("z")
axes.view_init(45, 215)
plot.show()
输出:
Matplotlib 提供了创建线图的选项,我们将创建一些新数据来炫耀。我们需要创建 z
,一个从 0 到 10 的线性空间,然后根据 z
轴的余弦和正弦创建 x
和 y
。
与 scatter3D()
一样,我们调用 plot3D()
,这将给我们一个线图。
import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
sb.set_style("whitegrid")
OMEGA = 2
Z1 = np.linspace(0, 10, 100)
X1 = np.cos(OMEGA * Z1)
Y1 = np.sin(OMEGA * Z1)
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
axes.plot3D(X1, Y1, Z1)
# keeps padding between figure elements
plot.tight_layout()
plot.show()
现在我们有了一个在三维空间中表示的漂亮的螺旋形图。
我们可以为二维绘图使用相同的关键字来设置这条线的样式。假设我们可以改变我们的线宽,让这个螺旋线变暗一点。
名为 OMEGA
的参数基本上控制了我们希望在绘图中看到多少个螺旋。
import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
sb.set_style("whitegrid")
OMEGA = 4
Z1 = np.linspace(0, 10, 100)
X1 = np.cos(OMEGA * Z1)
Y1 = np.sin(OMEGA * Z1)
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
axes.plot3D(X1, Y1, Z1, lw=3)
# keeps padding between figure elements
plot.tight_layout()
plot.show()
现在我们可以在图中看到更厚的螺旋。
我们还可以使用 Matplotlib 创建 3 维曲面和线框。
让我们创建一个 FUNC_Z()
函数。它将采用 x
和 y
值并将我们将绘制到表面的函数返回。
def FUNC_Z(x, y):
return 50 - (x ** 2 + y ** 2)
我们使用 linspace 在 -5 和 5 之间为 x
和 y
创建 50 个间隔。我们需要创建一个网格而不是只有 x 和 y 值。
我们可以使用 meshgrid()
函数创建它。我们需要向它传递 x
和 y
值,以便它重复它们。
X1, Y1 = np.meshgrid(X_VAL, Y_VAL)
完整代码:
import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
def FUNC_Z(x, y):
return 50 - (x ** 2 + y ** 2)
sb.set_style("whitegrid")
N = 50
X_VAL = np.linspace(-5, 5, N)
Y_VAL = np.linspace(-5, 5, N)
X1, Y1 = np.meshgrid(X_VAL, Y_VAL)
Z1 = FUNC_Z(X1, Y1)
axes = plot.axes(projection="3d")
axes.plot_surface(X1, Y1, Z1)
plot.show()
输出:
让我们使用 plot_wireframe()
函数创建一个线框图。这段代码看起来与表面非常相似。
import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
def FUNC_Z(x, y):
return 50 - (x ** 2 + y ** 2)
sb.set_style("whitegrid")
N = 50
X_VAL = np.linspace(-5, 5, N)
Y_VAL = np.linspace(-5, 5, N)
X1, Y1 = np.meshgrid(X_VAL, Y_VAL)
Z1 = FUNC_Z(X1, Y1)
axes = plot.axes(projection="3d")
axes.plot_wireframe(X1, Y1, Z1)
plot.show()
现在我们有一个线框而不是一个表面,它没有填充中间部分。
如果我们改变网格上的点数,我们可以改变这个线框的美感。
import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
def FUNC_Z(x, y):
return 50 - (x ** 2 + y ** 2)
sb.set_style("whitegrid")
N = 10
X_VAL = np.linspace(-5, 5, N)
Y_VAL = np.linspace(-5, 5, N)
X1, Y1 = np.meshgrid(X_VAL, Y_VAL)
Z1 = FUNC_Z(X1, Y1)
axes = plot.axes(projection="3d")
axes.plot_wireframe(X1, Y1, Z1)
plot.show()
由于我们改变了网格的大小,它将创造出具有更多空间的不同美学。我们还可以选择使用鼠标,单击该图形,然后拖动它。
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn