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()
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