最近我经常使用R Markdown,对它的功能非常满意。
但是,我在python绘图时遇到了问题。我有一段Python代码,在其中生成多个图形。
当我在R中这样做时,RStudio会将该块生成的所有图形侧边并排显示。
不幸的是,当我在一段Python代码中执行相同操作时,RStudio会打开一个新窗口并显示画布,然后代码执行被暂停直到我关闭该窗口,之后才绘制下一个图形,我必须再次关闭该窗口,以此类推。
是否有可能强制RStudio将图形内嵌,并继续执行代码? 提前感谢您的帮助!
最近我经常使用R Markdown,对它的功能非常满意。
但是,我在python绘图时遇到了问题。我有一段Python代码,在其中生成多个图形。
当我在R中这样做时,RStudio会将该块生成的所有图形侧边并排显示。
不幸的是,当我在一段Python代码中执行相同操作时,RStudio会打开一个新窗口并显示画布,然后代码执行被暂停直到我关闭该窗口,之后才绘制下一个图形,我必须再次关闭该窗口,以此类推。
是否有可能强制RStudio将图形内嵌,并继续执行代码? 提前感谢您的帮助!
针对我之前的评论,我将详细解释一下。在使用 matplotlib
时,图形会使用 Qt 进行渲染,这就是为什么会弹出窗口。
如果我们使用 fig.savefig
而不是 pyplot.show
,然后再使用 pyplot.close
,就可以避免弹出窗口了。这里是一个最简示例:
---
output: html_document
---
## Python *pyplot*
```{python pyplot, echo=FALSE}
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
fig, ax = plt.subplots()
ax.plot(t, s)
ax.set(xlabel='time (s)', ylabel='voltage (mV)',
title='About as simple as it gets, folks')
ax.grid()
fig.savefig("pyplot.png")
plt.close(fig)
```
```{r, echo=FALSE}
knitr::include_graphics("pyplot.png")
```
这会在没有任何处理中断的情况下产生以下结果:
来源: matplotlib.org
N.B. 根据 RStudio v1.2.679-1 预览版的发布说明,此版本将显示 Python 代码块发送的 matplotlib 图。
使用上述最新预览版,更新代码块以使用 pyplot.show
将会按要求内联显示。
```{python pyplot, echo=FALSE}
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
fig, ax = plt.subplots()
ax.plot(t, s)
ax.set(xlabel='time (s)', ylabel='voltage (mV)',
title='About as simple as it gets, folks')
ax.grid()
plt.show()
```
如果您使用Anaconda作为Python发行版,可能会遇到一个问题,即由于缺少路径/环境变量而导致RStudio无法找到Qt。
错误信息类似于:
此应用程序无法启动,因为在“”中找不到或加载Qt平台插件“windows”,重新安装该应用程序可能会解决此问题。
快速修复方法是将以下内容添加到Python代码块中以设置环境变量。
import os
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = '/path/to/Anaconda3/Library/plugins/platforms'
/path/to
。knitr::include_graphics
的方法之外,我使用的是 输出图像:*新行+缩进* ![output](pyplot.png)
,这样可以使图像显示得稍微小一些,如果绘制的图像很大,则非常有用。这样您就可以展示许多图片并保持报告易读性。 - mjbeyeler
matplotlib.pyplot
,它使用Qt进行绘制,结果显示在弹出窗口中。您可以在这里和这里阅读有关阻塞行为和解决方法的信息。 - Kevin Arseneau