【问题标题】:Saving Python SymPy figures with a specific resolution/pixel density保存具有特定分辨率/像素密度的 Python SymPy 图形
【发布时间】:2026-01-14 22:25:01
【问题描述】:

我想知道是否有办法改变 sympy 图的像素密度/分辨率。例如,让我们考虑下面的简单代码 sn-p:

import sympy as syp

x = syp.Symbol('x')
miles_to_km = x * 1.609344
miles_to_km.evalf()

graph = syp.plot(miles_to_km, show=False)
graph.save('./figures/miles_to_km.png')
graph.show()

注意事项:

  • 当我尝试使用 graph.savefig 时,我得到了一个 AttributeError: 'Plot' object has no attribute 'saveimage' 我在一些在线资源中偶然发现了 saveimage 方法,听起来这是常用的方法——我猜 API 改变了?

  • graph.save('./figures/miles_to_km.png', dpi=300) 产生类型错误:TypeError: save() got an unexpected keyword argument 'dpi'

  • plot 中使用dpi 属性不会引发任何错误,但也不影响图像质量:graph = syp.plot(miles_to_km, dpi=300, show=False)

我也尝试过使用 matplotlib 后端:

plt.figure()
graph = syp.plot(miles_to_km, show=False)
#graph.save('./figures/miles_to_km.png')
plt.savefig('./figures/miles_to_km.png')
graph.show()

plt = matplotlib.pyplot。但是,画布是空白的。相关信息可能是我在启用了%matplotlib inline 的 IPython 笔记本中运行它。

  • 我正在使用 SymPy v. 0.7.6

下面的backend 解决方法显示了 IPython 笔记本中的绘图,但它也会生成一个白色画布(如 png)

graph = syp.plot(miles_to_km, show=False)
backend = graph.backend(graph)
backend.fig.savefig('ch01_2.png', dpi=300)
backend.show()

编辑和解决方案:

感谢Cody Piersall 的回答,问题现已解决。我更新到 IPython 4.0 (Jupyter notebook) 并将其绘制如下

graph = syp.plot(miles_to_km, show=False)
backend = graph.backend(graph)
backend.process_series()
backend.fig.savefig('miles_to_km.png', dpi=300)
backend.show()

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    这个问题已经解决了,你现在可以简单地使用这个了:

    graph = sympy.plot(f, show = False)
    graph.save('fig.png')
    

    不幸的是,它似乎不允许选择 dpi。

    【讨论】:

      【解决方案2】:

      假设您使用的是 matplotlib 后端,如果您安装了 matplotlib,这是默认设置,您只需 import matplotlib.pyplot 并使用 pyplot.savefig

      这是因为 sympy 使用 matplotlib 进行绘图,并且由于 matplotlib 是有状态的,它知道您正在使用哪个绘图。

      这是您的示例,但使用 savefig 保存到 png。

      import sympy as syp
      
      x = syp.Symbol('x')
      miles_to_km = x * 1.609344
      miles_to_km.evalf()
      
      graph = syp.plot(miles_to_km, show=False)
      
      # Does not work in IPython Notebook, but works in a script.
      import matplotlib.pyplot as plt
      plt.savefig('./figures/miles_to_km.png', dpi=300)
      

      如果您在 IPython 笔记本中,上述方法将不起作用,但您仍然可以使用指定的 dpi 保存它们。你只需要对它有点棘手。

      # works in IPython Notebook
      backend = graph.backend(graph)
      ackend.fig.savefig('300.png', dpi=300)
      backend.fig.savefig('20.png', dpi=20)
      

      【讨论】:

      • 谢谢,我忘了说我也试过了,但是画布是空白的。即使我在 sympy 情节之前实例化 plt.figure()。也许我应该提到我正在使用交互模式在 IPython 笔记本中运行它
      • @SebastianRaschka 啊!只要它在脚本中,它就可以工作,但我也只是在 IPython 笔记本中尝试过,但它没有工作。我不知道为什么......
      • 嗯,也许这是一个错误或交互模式的另一个怪癖。无论如何,让我们看看是否有人有想法,如果没有,我将在 github repo 中打开一个问题。它现在不是那么重要,但对我来说非常方便。刚开始写一本新书,我喜欢将 IPython 笔记本作为读者的额外资源,同时我想使用书本本身的图像。
      • @SebastianRaschka 我有一个解决方法,您可以根据自己的意愿使用。
      • 非常感谢您的快速提示,但是当我使用这种方法时,我仍然遇到“空白”png 问题。也许我错过了什么?我把上面的代码贴出来了。