如何使用Matplotlib在 Python 中绘制 3D 密度图?

如何使用Matplotlib在 Python 中绘制 3D 密度图?

Python中的Matplotlib是一个非常流行的数据可视化库。它可以用于绘制各种类型的图形,包括2D和3D图形。本文将介绍如何使用Matplotlib在Python中绘制3D密度图。

密度图简介

在统计学和概率论中,密度图是一种可视化数据分布的图形。它与直方图类似,但是在绘制时,不是简单地将数据点放入桶中,而是将每个数据点表示为一小部分(通常是一个高斯函数)。这些小部分称为内核,并将它们平滑地堆叠在一起以形成连续的曲面。因此,密度图不受桶大小的影响。

Matplotlib中的3D绘图

在Matplotlib中绘制3D图形需要使用mpl_toolkits.mplot3d。为了在Jupyter Notebook中使用此工具,需要在代码中使用以下语句:

%matplotlib notebook

这将在Notebook单元格中启用交互式图形。

接下来,我们需要创建一个3D图形对象。为此,需要从mpl_toolkits.mplot3d导入Axes3D,并使用类Axes3D创建一个实例。以下代码创建一个基本的3D图形对象:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

在这里,我们首先导入了matplotlib.pyplot,然后导入Axes3D。接下来,我们使用函数fig.add_subplot()创建一个子图,然后将projection参数设置为’3d’以指定它是一个3D图形对象。

创建数据集

要创建密度图,需要有一些数据。在这个例子中,我们将使用NumPy生成随机数据。以下代码显示了如何生成一组x、y、z数据:

import numpy as np

# Generate data
np.random.seed(1)
x = np.random.standard_normal(100)
y = np.random.standard_normal(100)
z = np.random.standard_normal(100)

我们使用NumPy中的random.standard_normal函数生成100个随机数,并将它们存储在三个变量x、y和z中。

绘制3D散点图

在创建密度图之前,我们先看一下如何绘制一个简单的3D散点图。以下代码绘制了上面生成的数据的3D散点图:

# Create scatter plot
ax.scatter(x, y, z, s=5, alpha=0.5)

在这里,我们使用plot.scatter()函数创建一个散点图。s参数控制点的大小,alpha参数控制点的透明度。

绘制3D密度图

有了以上的准备,我们现在可以进入本文的主题:绘制3D密度图。

要绘制3D密度图,需要使用scipy库中的gaussian_kde函数来估算数据的核密度。以下代码估算数据集的核密度:

from scipy.stats import gaussian_kde

# Estimate density
density = gaussian_kde([x, y, z])([x, y, z])

在这里,我们导入了包含gaussian_kde函数的scipy.stats库。这个函数需要三个参数:一个包含x、y、z数据的列表,以及一个用于生成输出的新数据点的列表。

接下来,我们可以使用Axes3D.bar3d()函数创建一个3D密度图:

# Create density plot
ax.bar3d(x, y, z, 0.05, 0.05, density, alpha=0.5)

在这里,我们使用plot.bar3d()函数创建一个3D密度图。x、y、z参数是数据集的三个坐标,0.05是每个数据点的宽度和深度,density参数是数据集的密度。

完整的代码如下所示:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from scipy.stats import gaussian_kde

# Generate data
np.random.seed(1)
x = np.random.standard_normal(100)
y = np.random.standard_normal(100)
z = np.random.standard_normal(100)

# Create 3D plot object
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Create scatter plot
# ax.scatter(x, y, z, s=5, alpha=0.5)

# Estimate density
density = gaussian_kde([x, y, z])([x, y, z])

# Create density plot
ax.bar3d(x, y, z, 0.05, 0.05, density, alpha=0.5)

plt.show()

在上述代码中,我们未注释的代码是用来绘制3D散点图的,我们可以将其与绘制3D密度图的代码进行对比,看看它们的区别。

调整样式

通过matplotlib,可以调整3D密度图的样式。以下代码将图形的颜色设置为单色渐变:

from matplotlib.cm import ScalarMappable
from matplotlib.colors import Normalize

# Create colormap
my_cmap = plt.cm.get_cmap('winter')
sm = ScalarMappable(norm=Normalize(vmin=density.min(), vmax=density.max()), cmap=my_cmap)

# Create density plot with colormap
ax.bar3d(x, y, z, 0.05, 0.05, density, alpha=0.8, color=sm.to_rgba(density))

在这里,我们从matplotlib.cm导入ScalarMappable和Normalize。ScalarMappable将密度值映射到颜色,Normalize对密度进行规范化。my_cmap是用于生成颜色渐变的颜色映射。在以下代码中,我们通过将color参数设置为颜色映射的颜色来绘制3D密度图。

完整的代码在注释处进行了更新:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from scipy.stats import gaussian_kde
from matplotlib.cm import ScalarMappable
from matplotlib.colors import Normalize

# Generate data
np.random.seed(1)
x = np.random.standard_normal(100)
y = np.random.standard_normal(100)
z = np.random.standard_normal(100)

# Create 3D plot object
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Estimate density
density = gaussian_kde([x, y, z])([x, y, z])

# Create colormap
my_cmap = plt.cm.get_cmap('winter')
sm = ScalarMappable(norm=Normalize(vmin=density.min(), vmax=density.max()), cmap=my_cmap)

# Create density plot with colormap
ax.bar3d(x, y, z, 0.05, 0.05, density, alpha=0.8, color=sm.to_rgba(density))

plt.show()

结论

通过这篇文章,我们了解了如何使用Matplotlib在Python中绘制3D密度图。首先,我们生成了一组随机数据,并使用gaussian_kde函数估算了它们的密度。接着,我们创建了一个3D图形对象,并使用bar3d函数创建了3D密度图。最后,我们演示了如何自定义图形样式,将3D密度图渲染为单色渐变。使用这些技巧,可以轻松地将3D密度图添加到Python数据可视化工具箱中,以更好地了解数据分布。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程