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
相关产品推荐
相关产品推荐

