gpt4 book ai didi

python - 如何使用 Sympy `_backend` 的 `plot` 属性

转载 作者:行者123 更新时间:2023-12-01 03:00:45 25 4
gpt4 key购买 nike

在下面的示例中,我使用 Sympy 来绘制图:

from sympy import symbols, plot
x = symbols('x')
p = plot(x*x, x**3, (x, -2, 2), show=False)
for n, line in enumerate(p, 2):
line.label='$x^{%d}$'%n
line.line_color = ['k', 'r'][n-2]
p.legend = True

x2x3.png

如您所见,图例放置在线条上方,而 Sympy 则没有提供一种直接更改图例位置的方法。

经过一番研究我发现,直接在源代码中*/sympy/plotting/plot.py,此评论:

Especially if you need publication ready graphs and this module is not enough for you - just get the _backend attribute and add whatever you want directly to it. In the case of matplotlib (the common way to graph data in python) just copy _backend.fig which is the figure and _backend.ax which is the axis and work on them as you would on any other matplotlib object.

因此我尝试了

be = p._backend 

但我得到的是:

AttributeError: 'Plot' object has no attribute '_backend'

我应该做什么来移动图例或以其他方式调整情节使用此 ._backend 属性?

<小时/>

▶      U  P  D  A  T  E      ◀

再次查看源代码后,我意识到 ._backend仅在绘图提交到屏幕后才实例化属性,如p.show()

有了这些新知识,总是在交互式解释器中,我尝试过

...
p.show()
p._backend.ax.legend(loc='4') # bottom right

并且绘图已更新,图例位置位于“正确”的位置。

我的问题解决了吗?恐怕我没有,因为这适用于IPython session ,当您发出 IPython 的魔力时%matplotlib (可以与实时绘图交互),并且,仅在这些条件下。

特别是。 以下代码,作为脚本执行,

from sympy import symbols, plot 
x = symbols('x')
p = plot(x*x, x**3, (x, -2, 2), show=False)
for n, line in enumerate(p, 2):
line.label='$x^{%d}$'%n
line.line_color = ['k', 'r'][n-2]
p.legend = True
p.show()
p._backend.ax.legend(loc=4) # bottom-right
p.save('plot_with_legend_OK_maybe.png')

保存绘图,图例位于右上角、绘制线上。

这是我的更新版本

问题

是否可以使用其 .backend 属性更改绘图,并将更改保留在保存的图像文件中?

最佳答案

快速回答:

使用p._backend.fig.savefig('plot_with_legend_OK.png')代替p.save('..')

这使用 savefig据我所知,来自 matplotlib 的命令(如果您想知道可以使用的其他选项)。

<小时/>

关于为什么它不起作用的长(呃)故事。我们可以查看 self.save(path) 的代码,当您执行 p.save('plot_with_legend_OK_maybe.png') 时,会调用该代码。

    def save(self, path):
if hasattr(self, '_backend'):
self._backend.close()
self._backend = self.backend(self)
self._backend.save(path)

如您所见,如果建立了_backend,它将被关闭,一个新的后端将被调用,然后它将使用该后端保存图形。这将有效地撤消您之前对后端所做的所有更改。这就是为什么您不能在使用 matplotlib 后端更改的绘图上使用 sympy show()save() 命令。

这样做的原因很简单,正如 sympy 的开发人员所给出的那样 here :

Simplicity of code takes much greater importance than performance. Don't use it if you care at all about performance. A new backend instance is initialized every time you call show() and the old one is left to the garbage collector.

这也适用于save()

关于python - 如何使用 Sympy `_backend` 的 `plot` 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43869393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com