使用 Seaborn 和 Matplotlib 创建 3D 绘图

Salman Mehmood 2024年2月15日
使用 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 的随机模块来创建一些 xyz 数据,我们总共有 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() 函数并传递我们的 xyz 数据点。这并不容易表示哪一个是 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()

输出:

seaborn 3d 绘图输出 1

如果我们想增加散点的大小,我们可以引用这个 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()

输出:

seaborn 3d 绘图输出 2

我们可以使用 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()

输出:

seaborn 3d 绘图输出 3

Matplotlib 提供了创建线图的选项,我们将创建一些新数据来炫耀。我们需要创建 z,一个从 0 到 10 的线性空间,然后根据 z 轴的余弦和正弦创建 xy

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()

现在我们有了一个在三维空间中表示的漂亮的螺旋形图。

seaborn 3d 绘图输出 4

我们可以为二维绘图使用相同的关键字来设置这条线的样式。假设我们可以改变我们的线宽,让这个螺旋线变暗一点。

名为 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()

现在我们可以在图中看到更厚的螺旋。

seaborn 3d 绘图输出 5

我们还可以使用 Matplotlib 创建 3 维曲面和线框。

让我们创建一个 FUNC_Z() 函数。它将采用 xy 值并将我们将绘制到表面的函数返回。

def FUNC_Z(x, y):
    return 50 - (x ** 2 + y ** 2)

我们使用 linspace 在 -5 和 5 之间为 xy 创建 50 个间隔。我们需要创建一个网格而不是只有 x 和 y 值。

我们可以使用 meshgrid() 函数创建它。我们需要向它传递 xy 值,以便它重复它们。

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()

输出:

seaborn 3d 绘图输出 6

让我们使用 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()

现在我们有一个线框而不是一个表面,它没有填充中间部分。

seaborn 3d 绘图输出 7

如果我们改变网格上的点数,我们可以改变这个线框的美感。

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()

由于我们改变了网格的大小,它将创造出具有更多空间的不同美学。我们还可以选择使用鼠标,单击该图形,然后拖动它。

seaborn 3d 绘图输出 8

作者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

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

相关文章 - Seaborn Plot