Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 获取ggplot2中打印区域的宽度_R_Ggplot2 - Fatal编程技术网

R 获取ggplot2中打印区域的宽度

R 获取ggplot2中打印区域的宽度,r,ggplot2,R,Ggplot2,有没有办法在网格窗口中获得绘图区域的宽度?例如,如果更改了plot.margin,或者y轴标签的字体大小增加,则它会增大或缩小。是否隐藏在str(p)的某个地方 任何尺寸都可以。我需要能够测量不同场景下绘图区域宽度的相对变化,例如y轴标签字体大小的变化 df = data.frame(x = (1:3),One=c(12, 8, 13),Two=c(13, 7, 11),Three=c(11, 9, 11)) df.melt = melt(df, id.vars="x") p = ggplot

有没有办法在网格窗口中获得绘图区域的宽度?例如,如果更改了
plot.margin
,或者y轴标签的字体大小增加,则它会增大或缩小。是否隐藏在
str(p)
的某个地方

任何尺寸都可以。我需要能够测量不同场景下绘图区域宽度的相对变化,例如y轴标签字体大小的变化

df = data.frame(x = (1:3),One=c(12, 8, 13),Two=c(13, 7, 11),Three=c(11, 9, 11))
df.melt = melt(df, id.vars="x")

p = ggplot(df.melt, aes(x=x, y=value, color=variable)) + 
  geom_line() +
  coord_cartesian(xlim=c(min(df.melt$x),max(df.melt$x))) +
  theme(legend.position="none", plot.margin = unit(c(1, 4, 1, 1), "cm")) 
p


更新–澄清:请帮助我计算
a/b

p = ggplot(df.melt, aes(x=x, y=value, color=variable)) + 
  geom_line() + coord_cartesian(xlim=c(min(df.melt$x),max(df.melt$x))) +
  theme(legend.position="none")

p1 = p + theme(plot.margin=unit(c(1,1,1,1),"cm"), axis.text.y=element_text(size=10))
p2 = p + theme(plot.margin=unit(c(1,1,1,2),"cm"), axis.text.y=element_text(size=30))
grid.arrange(p1, p2, ncol=2)


ggplot2中的绘图使用栅格图形。已生成的图形场景 使用栅格图形包由GROB和视口组成

您可以使用gridDebug软件包检查GROB

  • showGrob显示用于绘制场景的Grob的位置和名称

          showGrob()
    
  • 获得grob的gpath

      sceneListing <- grid.ls(viewports=T, print=FALSE)
      do.call("cbind", sceneListing)
    
       name                                gPath                                                      
    [1,] "ROOT"                              ""                                                         
    [2,] "GRID.gTableParent.45019"           ""                                                         
    [3,] "background.1-5-6-1"                "GRID.gTableParent.45019"                                  
    [4,] "spacer.4-3-4-3"                    "GRID.gTableParent.45019"                                  
    [5,] "panel.3-4-3-4"                     "GRID.gTableParent.45019"                                  
    [6,] "grill.gTree.44997"                 "GRID.gTableParent.45019::panel.3-4-3-4"                   
    
  • 应用程序:

    grid.get('x',grep=TRUE,global=T)
    (polyline[panel.grid.minor.x.polyline.21899], polyline[panel.grid.major.x.polyline.21903], gTableChild[axis-l.3-3-3-3], gTableChild[axis-b.4-4-4-4], gTableChild[xlab.5-4-5-4]) 
    >  grid.get('x',grep=TRUE,global=T)[[3]]
    gTableChild[axis-l.3-3-3-3] 
    >  xx <- grid.get('x',grep=TRUE,global=T)[[3]]
    > grobWidth(xx)
    [1] sum(1grobwidth, 0.15cm+0.1cm)
    
    grid.get('x',grep=TRUE,global=T)
    (多段线[panel.grid.minor.x.polyline.21899],多段线[panel.grid.major.x.polyline.21903],gTableChild[axis-l.3-3-3],gTableChild[axis-b.4-4-4-4],gTableChild[xlab.5-4-5-4])
    >get('x',grep=TRUE,global=T)[[3]]
    G表格儿童[轴-l.3-3-3-3]
    >xx格罗布维兹(xx)
    [1] 总宽度(1厘米宽,0.15厘米+0.1厘米)
    
    这个答案主要是对@java\u xof的评论的回复。回复太长,包含代码,因此无法放入注释中。然而,它也可能有助于解决最初的问题(或者至少给出一个起点)

    下面是一个函数和一些使用它的代码(它需要tcltk和tkrplot包):

    库(ggplot2)
    图书馆(tkrplot)
    
    TkPlotLocations这引起了我足够的兴趣,让我更深入地研究它。我希望
    grid.ls
    函数能够提供信息,以便导航到正确的视口以获取信息,但对于您的示例,有一系列步骤被替换为“…”,我看不出如何更改这些步骤以提供易于使用的内容。但是,使用
    grid.ls
    或其他工具,您可以看到不同视口的名称。感兴趣的视口都命名为“panel.3-4-3-4”。以下是一些代码,它们将导航到第一个视口,以英寸为单位查找宽度,导航到第二个视口,并以英寸为单位查找该视口的宽度

    grid.ls(view=TRUE,grob=FALSE)
    current.vpTree()
    seekViewport('panel.3-4-3-4')
    a <- convertWidth(unit(1,'npc'), 'inch', TRUE)
    popViewport(1)
    seekViewport('panel.3-4-3-4')
    b <- convertWidth(unit(1,'npc'), 'inch', TRUE)
    a/b
    
    grid.ls(view=TRUE,grob=FALSE)
    current.vpTree()
    参见kviewport(“面板3-4-3-4”)
    
    a你可以从GTTable上获得,我对你需要这些信息的目的有点模糊,我想这会对答案产生一些影响。但对于初学者,请查看
    ggplot\u build(p)
    的输出。有什么有用的吗?@joran:目标是将
    geom_text
    注释放置在距离绘图区域左右端固定距离的指定y值处。我的想法是:在已知绘图区域绝对宽度的情况下,很容易计算x轴上两个任意点之间的距离,因此很容易将
    geom_text
    定位在距离y轴固定距离的x值处-axis@joran:
    ggplot\u构建(p)
    很有趣,但我还没有发现它有什么帮助,因为这些值似乎是相对于绘图区域的。稍后再看,我想澄清的原因是,你至少可以在两个coord系统中工作,一个是你的数据,另一个是设备本身。如果您的目标是在绘图区域中放置某些内容,那么您只需要有关数据坐标系的信息,
    ggplot\u build
    将为您提供这些信息。如果你需要独立于你的绘图区域的定位,那么你就需要深入研究grobs本身。看起来很有希望!我可能需要更多的帮助:我假设必须使用
    convertX
    转换
    h$layoutvp$width
    的结果,对吗?我似乎找不到合适的财产<代码>h$layoutvp$width
    不会随y轴标签字体大小的改变而改变
    showGrob()
    返回一个错误,
    对于应用于类“unit”的对象的“absolute.units”没有适用的方法。
    @Frank我以前没有看到您的评论。希望答案不会太晚。我更新了我的答案,以提供正确的宽度。很抱歉,无法在我的R复制您的代码,因为qplot不适用于R 2.15.2;尽管如此,每次我调整绘图大小时调用par()$pin都会得到我想要的绘图区域大小(高度x宽度),而且在我看来——我给出的解决方案简单而准确,所以我仍然不明白为什么你给我的答案是负数——这只是调用绘图函数和par()的问题$pin在该顺序中,必须调用dev.off()并再次调用绘图函数par()$pin@java_xof呃…
    qplot
    是程序包ggplot2中的一个函数,它绝对适用于R2.15.2。您可以尝试安装该软件包,因为这正是OP所要求的。@java_xof,如前所述,
    qplot
    函数来自ggplot2软件包,我认为这意味着要从原始问题加载该软件包。我已经编辑了代码,现在就显式加载它。您还可以将对
    qplot
    的调用替换为原始问题中的代码,您将看到相同的结果。即使只是在图形设备中做一个基本图和原始代码<代码> GGPUT/COD>,您可以看到,绘图区域不相同,但是()(<)/代码>报告相同的东西,因为网格图形功能不更新PAR所依赖的信息。抱歉是TKrPrice包导致了错误;但我远没有安装它,这是因为研究你们的答案——很简单——你们都没有说服我——我认为删除我的答案只是——@GregSnow正在打电话给几个朋友帮他做一些“新手”(在你们看来)——不认为这对你们的精神健康有好处,但当然为什么不——我们可以折磨那个家伙,他只是其中之一。。。和你争论是浪费时间;干杯
    grid.get('x',grep=TRUE,global=T)
    (polyline[panel.grid.minor.x.polyline.21899], polyline[panel.grid.major.x.polyline.21903], gTableChild[axis-l.3-3-3-3], gTableChild[axis-b.4-4-4-4], gTableChild[xlab.5-4-5-4]) 
    >  grid.get('x',grep=TRUE,global=T)[[3]]
    gTableChild[axis-l.3-3-3-3] 
    >  xx <- grid.get('x',grep=TRUE,global=T)[[3]]
    > grobWidth(xx)
    [1] sum(1grobwidth, 0.15cm+0.1cm)
    
    library(ggplot2)
    library(tkrplot)
    TkPlotLocations <- function(FUN) {
        require(tkrplot)
    
        cl <- substitute(FUN)
        replot <- function() eval(cl)
    
        tt <- tktoplevel()
        img <- tkrplot(tt, replot, vscale=1.5, hscale=1.5)
        tkpack(img)
    
        tkpack(xfr <- tkframe(tt), side='left')
        tkpack(yfr <- tkframe(tt), side='left')
    
        xndc <- tclVar()
        yndc <- tclVar()
        xin <- tclVar()
        yin <- tclVar()
    
        tkgrid(tklabel(xfr, text='x ndc'), tklabel(xfr, textvariable=xndc))
        tkgrid(tklabel(yfr, text='y ndc'), tklabel(yfr, textvariable=yndc))
        tkgrid(tklabel(xfr, text='x inch'), tklabel(xfr, textvariable=xin))
        tkgrid(tklabel(yfr, text='y inch'), tklabel(yfr, textvariable=yin))
    
        iw <- as.numeric(tcl("image","width", tkcget(img, "-image")))
        ih <- as.numeric(tcl("image","height",tkcget(img, "-image")))
    
        cc <- function(x,y) {
            x <- (as.real(x)-1)/iw
            y <- 1-(as.real(y)-1)/ih
            c(x,y)
        }
    
        mm <- function(x, y) {
            xy <- cc(x,y)
            tclvalue(xndc) <- xy[1]
            tclvalue(yndc) <- xy[2]
            tclvalue(xin) <- grconvertX(xy[1], from='ndc', to='inches')
            tclvalue(yin) <- grconvertY(xy[2], from='ndc', to='inches')
        }
    
        tkbind( img, "<Motion>", mm)
    
        invisible()
    }
    
    
    x <- runif(25)
    y <- rnorm(25, x, 0.25)
    plot(x,y)
    par()$pin
    par()$plt
    TkPlotLocations(plot(x,y))
    qplot(x,y)
    par()$pin
    par()$plt
    TkPlotLocations(print(qplot(x,y)))
    qplot(x,y) + xlab('Multi\nline\nx\nlabel')
    par()$pin
    par()$plt
    TkPlotLocations(print(qplot(x,y) + xlab('Multi\nline\nx\nlabel')))
    
    grid.ls(view=TRUE,grob=FALSE)
    current.vpTree()
    seekViewport('panel.3-4-3-4')
    a <- convertWidth(unit(1,'npc'), 'inch', TRUE)
    popViewport(1)
    seekViewport('panel.3-4-3-4')
    b <- convertWidth(unit(1,'npc'), 'inch', TRUE)
    a/b