Python数据分析(01) 绘制三维曲面图像

前言

        图像便于展示自己的研究成果,或作为研究步骤用于分析结论、提供灵感。下面介绍python3绘制三维曲面图的步骤。

绘制步骤

包依赖

        绘制三维曲面图,依赖下面两个包。numpy, matplotlib

import numpy as np
from matplotlib import pyplot as plt

定义画布和坐标轴

        使用plt.figure()生成一个下标为1的画布。
        使用plt.axes(projection='3d')生成一个三维的坐标轴,以控制三维数据在坐标轴上绘制。如果不指定参数为3d,返回二维坐标轴。

fig = plt.figure()
ax = plt.axes(projection="3d")

根据函数生成数据

        一般根据自己的需要,选定一个三维空间上的二元函数 z = f ( x , y ) z=f(x,y) z=f(x,y)。在我的另一篇博文机器学习(2) 感知机原理及实现中,选定了一个峰值函数用于展示山峰的形状,借以理解梯度下降法的含义。峰值函数选自于matlab的peaks演示函数,该函数的表达式为:
z = 3 ( 1 − x ) 2 e − x 2 − ( y + 1 ) 2 − 10 ( x 5 − x 2 − y 5 ) e − x 2 − y 2 − 1 3 e − ( x + 1 ) 2 − y 2 \displaystyle{z=3(1-x)^2e^{-x^2-(y+1)^2}-10(\frac{x}{5}-x^2-y^5)e^{-x^2-y^2}-\frac{1}{3}e^{-(x+1)^2-y^2}} z=3(1x)2ex2(y+1)210(5xx2y5)ex2y231e(x+1)2y2
        首先生成X轴方向和Y轴方向的网格型数据。

x = y = np.arange(start=-4, stop=4, step=0.1)
X, Y = np.meshgrid(x, y)

        上面这段代码用np.arange(start=-4,stop=4,step=0.1)生成从-4开始到4结束,步长为0.1的80个数据。也就是说,希望在80 × \times × 80的6400个坐标点上分别计算坐标点的函数值并赋给Z。用于生成这6400个点的函数就是np.meshgrid(x,y),mesh是网,grid是格,意思是根据坐标向量生成网格中心点的坐标。这样经过转换X.size()==6400, Y.size()==6400, (Xi, Yi)=(X[i],Y[i])。接下来只需要根据生成函数,代入每个点的X轴、Y轴坐标即可。

Z = 3 * (1-X)**2 * np.exp(-X**2-(Y+1)**2)- 10 * (X/5- X**3 - Y**5)*np.exp(-X**2-Y**2)-1/3*np.exp(-(X+1)**2-Y**2)

作图

        利用坐标轴的ax.plot_surface(X,Y,Z)功能即可将6400个坐标绘制成一个平滑的曲线。该函数有其他参数,如alpha=0.9控制曲线的透明度为90%;cstride=2column stride控制列数据每间隔2个点拟合一个平滑的曲线,rstride=2row column控制行数据每间隔2个点拟合一个平滑的曲线,cstride,rstride设置的数值越小,则曲线越贴合给定的数据;cmap='rainbow'控制图像的着色方式为彩虹色,z的数值越大,颜色更偏向于暖色系,z数值越小,颜色更偏向于深色系,cmap还可以等于'cool','winter','YlGnBu'等

ax.plot_surface(X,Y,Z,alpha=0.9, cstride=1, rstride = 1, cmap='rainbow')
plt.show()

结果展示

  • 山峰函数的全貌。
import numpy as np
from matplotlib import pyplot as plt
fig = plt.figure()
ax = plt.axes(projection="3d")
x = y = np.arange(start=-4, stop=4, step=0.1)
X, Y = np.meshgrid(x, y)
Z = 3 * (1-X)**2 * np.exp(-X**2-(Y+1)**2)- 10 * (X/5- X**3 - Y**5)*np.exp(-X**2-Y**2)-1/3*np.exp(-(X+1)**2-Y**2)
ax.plot_surface(X,Y,Z,alpha=0.9, cstride=1, rstride = 1, cmap='rainbow')
plt.show()

山峰函数全貌

  • 山峰函数上半轴
import numpy as np
from matplotlib import pyplot as plt
fig = plt.figure()
ax = plt.axes(projection="3d")
x = y = np.arange(start=-4, stop=4, step=0.1)
X, Y = np.meshgrid(x, y)
Z = 3 * (1-X)**2 * np.exp(-X**2-(Y+1)**2)- 10 * (X/5- X**3 - Y**5)*np.exp(-X**2-Y**2)-1/3*np.exp(-(X+1)**2-Y**2)
Z[Z<0]=0
ax.plot_surface(X,Y,Z,alpha=0.9, cstride=1, rstride = 1, cmap='rainbow')
plt.show()

山峰函数上半轴

  • 倒锥形曲面(倒山峰形)
import numpy as np
from matplotlib import pyplot as plt
fig = plt.figure()
ax = plt.axes(projection="3d")
x = y = np.arange(start=-4, stop=4, step=0.1)
X, Y = np.meshgrid(x, y)
Z = X**2+Y**2
ax.plot_surface(X,Y,Z,alpha=0.9, cstride=1, rstride = 1, cmap='rainbow')
plt.show()

倒山峰

  • 30
    点赞
  • 221
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
Python可以使用openpyxl库读取Excel文件,并使用Matplotlib库绘制三维曲面。 首先,我们需要使用openpyxl库打开Excel文件,读取相应的数据。可以使用load_workbook()函数打开Excel文件并获取特定的工作表。然后,使用iter_rows()函数迭代每一行,通过遍历每一行的单元格,将数据保存到一个列表中。 接下来,我们可以使用Matplotlib库来创建三维曲面。首先,导入matplotlib和mpl_toolkits.mplot3d库。然后,创建一个figure对象和一个子对象,通过将子对象设为三维模式,以便绘制三维形。 接下来,创建X,Y和Z坐标轴的数据。根据从Excel中读取的数据,创建一个网格状的数据点。然后,使用plot_surface()函数将这些数据绘制三维曲面。 最后,我们可以使用xlabel(),ylabel()和zlabel()函数为坐标轴添加标签,并使用show()函数显示形。 下面是一个示例代码: ```python import openpyxl import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 打开Excel文件 wb = openpyxl.load_workbook('data.xlsx') # 选择工作表 sheet = wb['Sheet1'] # 读取数据 data = [] for row in sheet.iter_rows(values_only=True): data.append(row) # 创建figure和子对象 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 创建X,Y和Z坐标轴的数据 X, Y = range(len(data[0])), range(len(data)) X, Y = np.meshgrid(X, Y) Z = data # 绘制三维曲面 ax.plot_surface(X, Y, Z) # 添加坐标轴标签 ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') # 显示形 plt.show() ``` 在上面的代码中,我们假设要读取的Excel文件名为'data.xlsx',工作表名为'Sheet1'。我们将数据保存到一个名为'data'的列表中,并将X和Y轴的数据分别设置为数据列表的索引。 然后,我们使用plot_surface()函数将这些数据绘制三维曲面,并使用set_xlabel(),set_ylabel()和set_zlabel()函数添加坐标轴标签。最后,使用show()函数显示形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ProfSnail

谢谢老哥嗷

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值