如何在Python/SageMath中绘制带等高线的3D图及二次型水平集
嘿,我来帮你搞定这两个绘图需求,尤其是你卡在SageMath二次型绘图的部分~
一、Python中绘制带等高线的3D图形
在Python里,我们可以用matplotlib的mplot3d模块绘制3D曲面,再叠加2D等高线投影到xy平面,示例代码如下:
import matplotlib.pyplot as plt import numpy as np # 定义要绘制的函数 def f(x, y): return (1/4)*x**2 + (1/9)*y**2 # 生成网格数据 x = np.linspace(-4, 4, 100) y = np.linspace(-4, 4, 100) X, Y = np.meshgrid(x, y) Z = f(X, Y) # 创建绘图对象和3D轴 fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') # 绘制3D曲面 surf = ax.plot_surface(X, Y, Z, cmap='gist_rainbow', alpha=0.7) # 绘制xy平面上的等高线投影 contour = ax.contour(X, Y, Z, zdir='z', offset=0, cmap='gist_rainbow', linewidths=1.5) # 添加颜色条、标签和标题 fig.colorbar(surf, shrink=0.5, aspect=5) ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') ax.set_title('3D Surface with Contours') plt.show()
这段代码会生成一个半透明的3D曲面,同时在xy平面(z=0位置)显示对应的等高线,颜色条可以帮你对应数值和颜色。
二、SageMath中绘制二次型及其水平集(解决你的代码问题)
你之前的代码出现分离文件的问题,大概率是因为没有正确合并图形、未明确函数定义,或者没有使用合适的查看器。下面是修正后的完整代码,能在同一个窗口里显示3D二次型曲面和对应的水平集(等高线):
# 1. 明确定义二次型函数 f(x, y) = (1/4)*x^2 + (1/9)*y^2 # 2. 创建空的图形容器,用于合并3D曲面和等高线 combined_plot = Graphics() # 3. 添加3D二次型曲面,设置半透明以便看清等高线 combined_plot += plot3d(f, (x, -4, 4), (y, -4, 4), opacity=0.6, color='lightcyan', label='Quadratic Form') # 4. 添加指定h值的水平集(等高线) for h in [0.5, 1, 2, 3, 4, 5]: combined_plot += contour_plot(f, (x, -4, 4), (y, -4, 4), fill=False, labels=True, contours=[h], # 只绘制当前h对应的等高线 color='darkorange', linewidth=1.2, label=f'Level set h={h}') # 5. 设置图形属性并显示,用jviewer确保3D和等高线在同一窗口 combined_plot.set_title(r"Quadratic Form $f(x,y)=\frac{1}{4}x^2+\frac{1}{9}y^2$ & Its Level Sets") combined_plot.show(viewer='jmol', figsize=(8, 6))
你之前代码的问题分析:
- 没有明确定义函数
f,导致contour_plot调用的f可能未关联到你的二次型 contours=10会自动生成10条等高线,但你需要的是指定h值的水平集,应该把参数设为[h]- 未指定合适的viewer,SageMath默认可能会把3D图和2D等高线分开输出,
viewer='jmol'可以让两者在同一个3D视图里叠加显示 - 给3D曲面设置
opacity(透明度),能让下方的等高线更清晰
如果想把水平集画成3D平面(而不是xy平面的投影),可以用implicit_plot3d替换contour_plot,示例:
for h in [0.5, 1, 2]: combined_plot += implicit_plot3d(f(x,y) == h, (x,-4,4), (y,-4,4), (z,0,h), color='red', opacity=0.3)
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

