Jupyter Notebook rpy2 Rmagics:如何设置默认的绘图大小?

时间:2016-11-22 15:00:39

标签: python r plot jupyter-notebook rpy2

我在Jupyter笔记本中使用%%R单元格魔法。我知道您可以设置每个单元格的绘图大小,例如:

%%R -w 800 -h 600

但我想为整个笔记本/ R会话设置默认值。

我看过How to only include a framework when building for device, not iOS Simulator?,看过the documentation,看过this blog post on the R Jupyter Notebook Kernel关于按单元格设置绘图大小,但除非我遗漏了明显的东西,否则没有似乎是一种为R magics中的绘图设置默认绘图大小的方法。

这可能吗?是否有隐藏设置,或者必须为每个单元格单独设置-w-h

2 个答案:

答案 0 :(得分:0)

好问题。目前我认为默认设置是R默认设置,但使用jyputer默认设置是有意义的(如果有的话 - 我需要查看它)。

以下黑客行事......如果" R magic"正在使用R中的默认绘图设置。不幸的是它没有。

%%R
my_png <- function(...) {
    lst <- as.list(...)
    if (is.null(lst$w)) {
        lst$w <- 1000 # default width
    }
    if (is.null(lst$h)) {
        lst$h <- 700 # default height
    }
    do.call("png", lst)
}
options(device=my_png)

在bitbucket上的rpy2跟踪器上打开一个问题以请求该功能是有意义的。

答案 1 :(得分:0)

古老的问题,但我也有同样的想法,找到了该页面,然后设法抓了一下,因此希望这对某人有用。

解决方法是猴子补丁rpy2,它直接调用R的png方法,而没有设置默认参数的方法。请注意,这种方法通常是 Bad Idea ,而且很脆弱,但无法避免。向rpy2发出功能请求以包含默认参数的机制可能是值得的。

下面是猴子补丁:

# these are the defaults we want to set:
default_units = 'in' # inch, to make it more easily comparable to matpplotlib
default_res = 100 # dpi, same as default in matplotlib
default_width = 10
default_height = 9
# try monkey-patching a function in rpy2, so we effectively get these
# default settings for the width, height, and units arguments of the %R magic command
import rpy2
old_setup_graphics = rpy2.ipython.rmagic.RMagics.setup_graphics

def new_setup_graphics(self, args):
    if getattr(args, 'units') is not None:
        if args.units != default_units: # a different units argument was passed, do not apply defaults
            return old_setup_graphics(self, args)
    args.units = default_units
    if getattr(args, 'res') is None:
        args.res = default_res
    if getattr(args, 'width') is None:
        args.width = default_width
    if getattr(args, 'height') is None:
        args.height = default_height        
    return old_setup_graphics(self, args)

rpy2.ipython.rmagic.RMagics.setup_graphics = new_setup_graphics