R Markdown: 如何使RStudio内联显示Python图形而不是在新窗口中显示?

20

最近我经常使用R Markdown,对它的功能非常满意。

但是,我在python绘图时遇到了问题。我有一段Python代码,在其中生成多个图形。

当我在R中这样做时,RStudio会将该块生成的所有图形侧边并排显示。

不幸的是,当我在一段Python代码中执行相同操作时,RStudio会打开一个新窗口并显示画布,然后代码执行被暂停直到我关闭该窗口,之后才绘制下一个图形,我必须再次关闭该窗口,以此类推。

是否有可能强制RStudio将图形内嵌,并继续执行代码? 提前感谢您的帮助!


3
我认为这是值得奖赏的问题。 - InfiniteFlash
4
请问您能否发布一些生成所讨论图表的Python示例代码? - user5359531
1
这是Python的行为,与RStudio IDE没有直接关系。我假设您正在使用matplotlib.pyplot,它使用Qt进行绘制,结果显示在弹出窗口中。您可以在这里这里阅读有关阻塞行为和解决方法的信息。 - Kevin Arseneau
1个回答

23

针对我之前的评论,我将详细解释一下。在使用 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")
```

这会在没有任何处理中断的情况下产生以下结果:

enter image description here

来源: 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用户

如果您使用Anaconda作为Python发行版,可能会遇到一个问题,即由于缺少路径/环境变量而导致RStudio无法找到Qt

错误信息类似于:

此应用程序无法启动,因为在“”中找不到或加载Qt平台插件“windows”,重新安装该应用程序可能会解决此问题。

快速修复方法是将以下内容添加到Python代码块中以设置环境变量。

import os
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = '/path/to/Anaconda3/Library/plugins/platforms'

用你的Anaconda发行版的相关位置替换/path/to

嗨,感谢您的回答!那就是我现在正在做的,除了您用 knitr::include_graphics 的方法之外,我使用的是 输出图像:*新行+缩进* ![output](pyplot.png),这样可以使图像显示得稍微小一些,如果绘制的图像很大,则非常有用。这样您就可以展示许多图片并保持报告易读性。 - mjbeyeler
1
一般来说,我认为它是可以的,但不幸的是我无法重现他的最小示例。也许是因为我正在使用Anaconda Python?我总是收到以下弹出错误消息:“此应用程序无法启动,因为在“”中找不到或加载Qt平台插件“windows”,重新安装该应用程序可能会解决此问题。”(我已经检查过Qt是否安装在我的Anaconda发行版上)。 - mjbeyeler
1
@Michael,那个错误是由于在您的路径中找不到Qt引起的(与Windows上的Anaconda安装有关)。我会在我的答案中添加一条注释。 - Kevin Arseneau
1
@Michael 我和你一样遇到了“此应用程序无法启动,因为...应用程序可能会解决此问题。”的问题。每次我在 .rmd 文件中编写一个 Python 代码块时都会出现这个问题。我可能会在帖子中标记你或以某种方式向你发送消息。这将非常有用。此外,看起来 Kevin 发布了一个潜在的解决方案。我们必须尝试它! - InfiniteFlash
当使用plotly而不是matplotlib时怎么样?如何内联显示plotly图形?Fig.show()会打开一个新窗口吗? - rm1104
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接