【问题标题】:Plots made with rpy sent to X11 suddenly close?用 rpy 发送到 X11 的绘图突然关闭?
【发布时间】:2012-09-21 06:27:20
【问题描述】:

我正在使用 RPy2 制作一些情节。绘图显示,但 X11 窗口立即消失。

我输入的内容如下,其中 CCFS 是一个数据矩阵

 import rpy2.robjects as robjects
 r = robjects.r

 pca = r.princomp(CCFS)
 r.plot(pca,main="Eigenvalues")
 r.biplot(pca,main="biplot")
 r['dev.off']() #*EDIT* the problem persists even if I remove this line.

我是否没有包含某些内容?我知道有一些东西要绘制,因为 princomp 返回一个不为空的 ListVector。

【问题讨论】:

  • 您是在交互式提示下执行此操作吗?如果是这样,请尝试不发出最后一个 'dev.off' 操作。
  • 我做了,但没有任何改变。情节确实出现了,但随后就关闭了。我将添加一个 x11 标记。
  • 不,这是在 Python 模块中。
  • 好的,那么它可能会因为程序退出而消失。您需要程序一直运行直到完成,否则您需要使用批处理模式设备,例如 pdfpng
  • X 服务器继续运行,当然,但是当 Python 脚本 终止时,它打开的所有窗口都会自动关闭。

标签: python x11 graphing rpy2


【解决方案1】:

添加

input()         # for Python3
# raw_input()   # for Python2

到脚本的末尾,以防止程序在用户按下 Enter 之前结束。

【讨论】:

  • 这行得通!但是,它没有解释为什么 X11 窗口不存在。例如,示例 RPy biplot 脚本没有使用它,所以我认为我错过了一个更大的点。
  • r 对象被垃圾回收时,它显然会关闭它创建的任何窗口。我不知道您指的是什么 biplot 脚本,但如果它来自文档,它可能只是显示重要的部分,假设您了解 raw_input() 或者您会在更大的脚本中使用代码不会到此为止。
  • 啊,我明白了。在 biplot 行之后,我不会将 RPy 用于脚本中的任何其他内容。因此,当然,智能垃圾收集器会立即关闭所有窗口。好像这还不够,Python 脚本也到此结束。正如@Zack 指出的那样,即使 X11 窗口在垃圾收集器中幸存下来,它也会杀死它。谢谢 - 现在说得通了。
  • "raw_input" 在 Python 3 中被重命名为 "input",但是这个技巧仍然有效。
【解决方案2】:

正如 Zack 指出的那样,在交互式图形设备上调用 dev.off() 只会导致设备关闭(并且显示的内容消失)。另一方面,在检查绘图之前,通常需要关闭非交互式设备(参见rpy2's documentation on graphical devices)。

我猜测您的 Python 代码被称为独立程序/脚本,而不是交互式 Python 会话的一部分。换句话说,我怀疑你在 shell 中有类似 python myscript.py 的东西(myscript.py 的内容是你上面的代码);当脚本结束时,嵌入式 R 显然终止,并带有交互式绘图。这可能也是 Zack 的想法。尝试python -i myscript.py,然后在Python 控制台import sys; sys.exit(0) 中查看退出Python 意味着关闭R 交互设备。

【讨论】:

  • 你是对的。我已经习惯了 Matplotlib 功能,在您关闭绘图之前,脚本会停止,即使您从独立脚本生成绘图也是如此。
  • 未来可能会通过 rpy2 自定义 R 设备以实现这种行为(例如,rpy.sourceforge.net/rpy2/doc-2.3/html/…)。但是,情况还不是这样。
猜你喜欢
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
相关资源
最近更新 更多