如何使用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数据可视化工具箱中,以更好地了解数据分布。