You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib中set_aspect('equal')对不同3D函数绘图效果差异问题

3D绘图函数中set_aspect('equal')的兼容问题

我在VSCode中使用Matplotlib 3.7.1编写了一个可接收3D函数字符串的绘图函数,遇到了以下矛盾情况:

  • 绘制圆环面、球面这类函数时,启用ax.set_aspect('equal')能让图形显示正常,关闭该设置则图形会扭曲拉伸;
  • 绘制函数x*y**3 - y*x**3时,启用ax.set_aspect('equal')会导致图形严重扭曲无法识别,关闭后显示正常。

我尝试过调整坐标轴范围、使用set_box_aspect或set_aspect('auto'),都无法解决问题。希望能让这个函数兼容各类数学函数,不需要硬编码适配。

相关代码如下:

import matplotlib
import matplotlib.pyplot as plt

import sympy
import numpy as np

def queryMatplotlib3dEq(sol, ax):
    lhs, rhs = sol.split("=")

    def f(x, y):
        if (lhs == "z"):
            return eval(rhs)
        else:
            return eval(lhs)

    x = np.linspace(-10, 10, 10000)
    y = np.linspace(-10, 10, 10000)
    X, Y = np.meshgrid(x, y)
    if (lhs == 'z' or rhs == 'z'):
        Z = f(X, Y)
    ax.plot_surface(X, Y, Z, cmap="viridis")
  
    # ax.set_box_aspect((1, 1, 1))

    #Removing this makes some functions look bad, and other functions look good
    # ax.set_aspect('equal')

    # ax.relim()
    # ax.autoscale_view()

#With set_aspect('equal') these looks great, without it they look warped
# qVal = "(8- (x**2 + y**2)**(1/2))**2 + z**2 = 3"
# qVal="x**2+y**2+z**2=100"

# #With set_aspect('equal') this looks terribly warped, without it it looks great
qVal="x*y**3 -y*x**3"

x, y, z = sympy.symbols('x y z')

if ('=' in qVal):
    lhs, rhs = qVal.split('=')
    eq = sympy.Eq(eval(lhs), eval(rhs))
else:
    eq = sympy.Eq(eval('z'), eval(qVal))

sols = ['z=' + v.replace('sqrt', 'np.sqrt')
        for v in map(str, sympy.solve(eq, z))]

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

for sol in sols:
    print(sol)
    queryMatplotlib3dEq(sol, ax)

plt.show()

内容的提问来源于stack exchange,提问作者Joshua Guevara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:00:33