matplotlib 如何高亮显示3D曲面图切片

yebdmbv4  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(153)

我想知道如何在matplotlib的帮助下突出显示3D曲面图(由SymPy Plotting Backends完成)(因为我在这里找到了一个示例:How do I highlight a slice on a matplotlib 3D surface plot?)它使用matplotlib。
要创建表面3D绘图,请使用SPB(后端=MB)使用以下代码完成:

  1. from sympy import *
  2. from spb import * # pip install sympy_plot_backends
  3. import matplotlib.pyplot as plt
  4. init_printing()
  5. var("t, omega, s, alpha")
  6. expr = exp(-t) * sin(t)
  7. res = laplace_transform(expr, t, s, noconds=True)
  8. print(res)
  9. colorscale = [
  10. [0, "green"],
  11. [0.01, "orange"],
  12. [0.05, "red"],
  13. [1, "red"]
  14. ]
  15. print('The Laplace Transform plot in 3-D:')
  16. plot3d(abs(res.subs(s, alpha + I * omega)), (alpha, -2, 2), (omega, -2, 2),
  17. use_cm=True, colorbar=False, backend=MB)
  18. print('The slice highlighted plot:')
  19. #Z = abs(res.subs(s, alpha + I * omega))
  20. #y0 = 10
  21. #C[y0] = plt.cm.Reds_r(Z[y0]/2)
  22. #plt.figure(figsize = (15,15))
  23. #plt.plot((alpha, -2, 2), (omega, -2, 2),Z[y0,:], color=plt.cm.Reds(.7))
  24. #plt.show()

我注解掉我的试验,它不像我想要的那样工作,这是从alpha轴的一侧看起来应该像的切片:

z9gpfhce

z9gpfhce1#

按照这个问题的建议绘制一个切片是很难用SPB实现的。相反,我们将以不同的方式实现它。
首先,绘制曲面:

  1. from sympy import *
  2. from spb import *
  3. var("t, omega, s, alpha")
  4. expr = exp(-t) * sin(t) #* exp(-t / 2)
  5. res = laplace_transform(expr, t, s, noconds=True)
  6. func = abs(res.subs(s, alpha + I*omega))
  7. p1 = plot3d(
  8. func, (alpha, -2, 2), (omega, -2, 2), {"cmap": "winter", "vmax": 2},
  9. zlim=(0, 2.5), use_cm=True, colorbar=False
  10. )

接下来,绘制切片,它只不过是3D空间中的参数曲线。例如,在alpha=-0.5处绘制切片:

  1. p2 = plot3d_parametric_line((-0.5, omega, func.subs(alpha, -0.5)), (omega, -2, 2), {"color": "r"}, use_cm=False)

最后,合并将这些图合并:

  1. (p1 + p2).show()

在这里你可以看到Matplotlib的局限性:它不知道线应该被渲染在表面的顶部。这个问题在Plotly中不存在,这就是为什么我在上一个问题中建议后端。
要使用Matplotlib解决这个问题,我们可以绘制两个曲面:

  • 一个表面从alpha=-2alpha=-0.5-eps,其中eps是一个小数字。
  • 另一个表面从alpha=-0.5+epsalpha=2

我们对两个曲面应用相同的颜色Map表。

  1. eps = 0.01
  2. p1 = plot3d(
  3. (func, (alpha, -2, -0.5-eps), (omega, -2, 2), {"cmap": "winter", "vmax": 2}),
  4. (func, (alpha, -0.5+eps, 2), (omega, -2, 2), {"cmap": "winter", "vmax": 2}),
  5. zlim=(0, 2.5), use_cm=True, colorbar=False
  6. )

然后,将其与切片合并结合:

  1. (p1 + p2).show()

展开查看全部

相关问题