将两个Sympy图显示为两个Matplotlib子图

rxztt3cl  于 2023-11-22  发布在  其他
关注(0)|答案(3)|浏览(125)

此代码

  1. from sympy import *
  2. x=Symbol('x')
  3. p1 = plot(x**2,(x,-2,2))
  4. p2 = plot(x**3,(x,-2,2))

字符串
导致两个单独的图。
我想用matplotlib将它们显示为子图,而不是两个单独的图:

  1. import matplotlib.pyplot as plt
  2. fig = plt.figure()
  3. ax1 = fig.add_subplot(121)
  4. ax2 = fig.add_subplot(122)
  5. plt.show()


如何添加p1p2,使它们显示为matplotlib图中的子图?

bqucvtff

bqucvtff1#

问题是sympy Plot创建了自己的图形和轴。它并不意味着绘制到现有的轴。
但是,您可以在显示渐近图之前,用现有的轴替换绘制图的轴。

  1. from sympy import Symbol,plot
  2. import matplotlib.pyplot as plt
  3. def move_sympyplot_to_axes(p, ax):
  4. backend = p.backend(p)
  5. backend.ax = ax
  6. backend._process_series(backend.parent._series, ax, backend.parent) # backend.process_series() no longer works
  7. backend.ax.spines['right'].set_color('none')
  8. backend.ax.spines['bottom'].set_position('zero')
  9. backend.ax.spines['top'].set_color('none')
  10. plt.close(backend.fig)
  11. x=Symbol('x')
  12. p1 = plot(x**2,(x,-2,2), show=False)
  13. p2 = plot(x**3,(x,-2,2), show=False)
  14. fig, (ax,ax2) = plt.subplots(ncols=2)
  15. move_sympyplot_to_axes(p1, ax)
  16. move_sympyplot_to_axes(p2, ax2)
  17. plt.show()

字符串


的数据

展开查看全部
busg9geu

busg9geu2#

我的解决方案没有直接将p1p2添加到子图中,而是捕获并使用它们的(x,y)坐标。

  1. import matplotlib.pyplot as plt
  2. from sympy import symbols
  3. import numpy as np
  4. from sympy import symbols
  5. from sympy.plotting import plot
  6. # part 1
  7. # uses symbolic plot of functions
  8. x = symbols('x')
  9. #p1, p2 = plot(x**2, x**3, (x, -2, 2))
  10. # this plot will not show ...
  11. # only produce 2 curves
  12. p1, p2 = plot((x**2, (x, -2, 2)), \
  13. (x**3, (x, -2, 2)), \
  14. show=False)
  15. # collect (x,y)'s of the unseen curves
  16. x1y1 = p1.get_points() # array of 2D
  17. x2y2 = p2.get_points()
  18. # part 2
  19. # uses regular matplotlib to plot the data
  20. fig = plt.figure(figsize=(8, 5))
  21. ax1 = fig.add_subplot(121)
  22. ax2 = fig.add_subplot(122)
  23. # do subplot 1
  24. ax1.plot(x1y1[0], x1y1[1], 'g') # plot x**2 in green
  25. ax1.set_xlim([-2, 2])
  26. ax1.set_xlabel('X1')
  27. ax1.set_ylabel('Y1')
  28. ax1.set_title('Line1') # destroyed by another .title(); axis metho1
  29. # do subplot 2
  30. ax2.plot(x2y2[0], x2y2[1], 'r') # plot x**3 in red
  31. ax2.set_xlim([-2, 2])
  32. ax2.set_xlabel('X2')
  33. ax2.set_ylabel('Y2')
  34. ax2.set_title('Line2')
  35. fig.subplots_adjust(wspace=0.4) # set space between subplots
  36. plt.show()

字符串
结果图:


的数据

展开查看全部
92vpleto

92vpleto3#

您可以简单地使用plotgrid在一个图中获得2个或多个图。
参见:sympy.plotting.PlotGrid()
下面是一个工作示例:

  1. import sympy as sp
  2. from matplotlib import pyplot as plt
  3. # define functions
  4. x = symbols('x')
  5. f = sin(x)
  6. g = cos(x)
  7. # create separate plots
  8. p1 = plot(f, show=False, xlim=(-pi, pi), line_color='blue', legend=True)
  9. p2 = plot(g, show=False, xlim=(-pi, pi), line_color='red', legend=True)
  10. # create a plotgrid with 2 rows and 1 column
  11. plotgrid = sp.plotting.PlotGrid(2, 1, p1, p2, show=False, size=(5., 3.5))
  12. plotgrid.show()

字符串
结果图:


的数据

展开查看全部

相关问题