Python绘图——3D曲面图

童舒 统计分析与数据挖掘 2023-06-11 16:00 发表于江苏

上一节我们学习了如何绘制3D散点图,这一节我们主要学习如何绘制3D曲面图,以及绘制多组曲面图。


3D曲面图


3D曲面图通常用于可视化具有两个自变量和一个因变量的数据,可以直观地展示数据的变化趋势、形状或空间分布。比如你有一个函数,其中的因变量(Z)与两个自变量(X和Y)相关,你可以使用3D曲面图来直观地展示函数的形状和变化趋势。还可以使用3D曲面图来展示流体动力学模拟中的压力分布、结构力学模拟中的应力分布等。我们先绘制一个3D曲面图看一看效果:
import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D
# 创建数据x = np.linspace(-5, 5, 100)y = np.linspace(-5, 5, 100)X, Y = np.meshgrid(x, y)Z = np.sin(np.sqrt(X**2 + Y**2))
# 创建画布和坐标轴fig = plt.figure()ax = fig.add_subplot(111, projection='3d')
# 绘制3D曲面图ax.plot_surface(X, Y, Z, cmap='viridis')
# 设置坐标轴标签ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')
# 设置标题ax.set_title('3D Surface Plot')
# 显示图形plt.show()
输出:

图片


在这里我们使用np.linspace函数创建了X和Y的网格,范围从-5到5,共有100个点。然后,我们使用np.meshgrid函数生成X和Y的坐标矩阵。接下来,我们定义了一个自定义函数,计算Z的值。最后,我们使用ax.plot_surface方法绘制3D曲面图,并设置了坐标轴标签和标题。这里的绘图方式与上一节我们学习的3D散点图十分相似,相关参数的更改可以部分参照上一节内容进行修改。

我们可以根据自己的数据和需求来自定义X、Y和Z的值,并相应地调整绘图代码。这样可以绘制出适合你的数据和问题的3D曲面图。

自定义3D曲面图


假设我们有一组产品的销售数据,其中包括产品的价格和对应的销量。我们可以使用3D曲面图将这些数据可视化,以便更好地理解产品价格、销量和销售业绩之间的关系:
import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D
# 产品价格prices = np.array([10, 20, 30, 40, 50, 60, 70, 80])# 产品销量sales = np.array([100, 150, 200, 250, 300, 350, 400, 450])
# 生成价格、销量网格price, sale = np.meshgrid(prices, sales)
# 销售业绩数据performance = np.array([ [1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400], [1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600], [1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800], [1600, 1800, 2000, 2200, 2400, 2600, 2800, 3000], [1800, 2000, 2200, 2400, 2600, 2800, 3000, 3200], [2000, 2200, 2400, 2600, 2800, 3000, 3200, 3400], [2200, 2400, 2600, 2800, 3000, 3200, 3400, 3600], [2400, 2600, 2800, 3000, 3200, 3400, 3600, 3800]])
fig = plt.figure()ax = fig.add_subplot(111, projection='3d')
# 绘制3D曲面图ax.plot_surface(price, sale, performance, cmap='coolwarm')
# 设置坐标轴标签ax.set_xlabel('Price')ax.set_ylabel('Sales')ax.set_zlabel('Performance')
# 设置图形标题ax.set_title('Sales Performance with Price and Sales')
plt.show()
输出:

图片


首先我们先设置了产品价格和产品销量,并使用np.meshgrid函数生成对应的坐标。performance是一个二维数组,每个数组元素表示在特定价格和销量条件下的销售业绩。例如,performance[0, 0]表示在价格为10、销量为100的条件下的销售业绩,performance[0, 1]表示在价格为10、销量为150的条件下的销售业绩,以此类推。

这些销售业绩数据可以是实际的销售额、利润或其他相关指标。在3D曲面图中,这些数据将决定曲面的高度,即在不同价格和销量组合下的销售业绩高低。较高的曲面表示较好的销售业绩,而较低的曲面表示较差的销售业绩。

绘制多个3D曲面图


如果我们想同时绘制出几个不同的图,我们可以在同一个画布上创建多个子图,并在每个子图上绘制不同的曲面图
import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D
# 创建数据x = np.linspace(-5, 5, 100)y = np.linspace(-5, 5, 100)X, Y = np.meshgrid(x, y)Z1 = np.sin(np.sqrt(X**2 + Y**2))Z2 = np.cos(X) * np.sin(Y)Z3 = np.exp(-(X**2 + Y**2)/10) * np.cos(np.sqrt(X**2 + Y**2))
# 创建画布和子图fig = plt.figure()
# 子图1ax1 = fig.add_subplot(131, projection='3d')ax1.plot_surface(X, Y, Z1, cmap='viridis')ax1.set_xlabel('X')ax1.set_ylabel('Y')ax1.set_zlabel('Z1')
# 子图2ax2 = fig.add_subplot(132, projection='3d')ax2.plot_surface(X, Y, Z2, cmap='plasma')ax2.set_xlabel('X')ax2.set_ylabel('Y')ax2.set_zlabel('Z2')
# 子图3ax3 = fig.add_subplot(133, projection='3d')ax3.plot_surface(X, Y, Z3, cmap='magma')ax3.set_xlabel('X')ax3.set_ylabel('Y')ax3.set_zlabel('Z3')
# 设置整体标题fig.suptitle('Multiple 3D Surface Plots')
# 调整子图布局fig.tight_layout()
# 显示图形plt.show()
输出:

图片


我们使用了add_subplot函数在画布上创建了三个子图,分别用于绘制不同的3D曲面图。每个子图使用不同的曲面数据和颜色映射,并设置了对应的坐标轴标签。最后,通过调整整体标题和子图布局,使图形显示更加美观。我们可以根据需要添加更多的子图,并调整代码中的数据和参数,以满足我们的需求。

总结


本公众号是我们几个人用来督促自己坚持学习并与各位同好交流而设立,如果您觉得我们的推送对您有所帮助,请不吝点赞、转发、在看,或帮助点击文章中出现的广告支持我们的工作图片图片图片


由于微信订阅号的推送规则越来越迷,为防止错过精彩连载内容,请将我们的公众号设为星标方法如下:

图片


参考资料


[1] 3D surface — Matplotlib 3.7.1 documentation

https://matplotlib.org/stable/plot_types/3D/surface3d_simple.html

[2] Python绘图——3D散点图



图片

作者:三五七

图片

图片

“统计分析与数据服务”是一个分享以原创为主的数据挖掘、统计软件操作、生信分析、机器学习等内容的文章、教程和学习视频的公众号。创建的原目的是为了敦促学生学习相关知识和进行写作训练。如果您喜欢我们的推送内容,欢迎点赞、转发、在看,您的支持将是我们深入学习的动力!




收录于合集 #Python
 83
上一篇Python绘图——3D散点图下一篇生信分析:基于R语言绘制相关性热图

微信扫一扫
关注该公众号