Obtener el ancho del área de trazado en ggplot2

¿Hay alguna manera de obtener el ancho del área de trazado en la ventana de la cuadrícula? Crece o se reduce, por ejemplo, si el plot.margin se cambia o si aumenta el tamaño de fuente de las tags del eje y. ¿Está escondido en algún lugar de str(p) ?

Cualquier medida de tamaño funcionaría. Necesito poder medir el cambio relativo en el ancho del área de trazado en diferentes escenarios, como el cambio del tamaño de fuente de las tags del eje y.

enter image description here

 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 

ACTUALIZACIÓN – Para aclarar: ayúdenme a calcular a/b .

enter image description here

 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) 

Esto me intrigó lo suficiente como para mirarlo más profundo. Esperaba que la función grid.ls proporcionara la información para navegar a las ventanas gráficas correctas para obtener la información, pero para su ejemplo hay grid.ls pasos que se reemplazan por ‘…’ y no pude ver cómo cambiar eso para dar algo con lo que se pueda trabajar fácilmente. Sin embargo, al usar grid.ls u otras herramientas, puede ver los nombres de las diferentes ventanas gráficas. Las ventanas de interés se denominan ‘panel.3-4-3-4’ para su ejemplo, a continuación se muestra un código que navegará al primero, encuentre el ancho en pulgadas, navegue al segundo y encuentre el ancho de ese en pulgadas.

 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 

No pude encontrar una manera fácil de llegar al segundo panel sin abrir el primero. Esto funciona y proporciona la información que necesita. Desafortunadamente, dado que saca el primer panel de la lista, no puede volver y encontrar información adicional o modificarla. Pero esto proporciona la información que solicitó y que podría usarse en futuras plots.

Tal vez alguien más sepa cómo navegar al segundo panel sin tener que abrir el primero, o obtener el vpPath completo de cada uno de ellos para navegar directamente.

La ttwig en ggplot2 usa gráficos de cuadrícula. Una escena gráfica que se ha producido utilizando el paquete de gráficos de cuadrícula consiste en grobs y viewports.

Puede usar el paquete gridDebug para la inspección de los grobs.

  1. showGrob muestra las ubicaciones y los nombres de los grobs utilizados para dibujar la escena

      showGrob() 
  2. Obtener el gpath del grob

      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" 
  3. Recuperar el gorb

     h < - grid.get(gPath="GRID.gTableParent.45019") 
  4. obtener h propiedades (por ejemplo)

     h$layoutvp$width 

Solicitud:

 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) 

Esta respuesta es principalmente en respuesta a los comentarios de @java_xof. La respuesta es demasiado larga e incluye código, por lo que no cabe en un comentario. Sin embargo, también puede ayudar con la pregunta original (o al menos dar un punto de partida).

Aquí hay una función y un código que la usa (requiere los paquetes tcltk y tkrplot):

 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, "", 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'))) 

Definir la función anterior, luego ejecutar las siguientes líneas producirá 3 gráficos de los mismos datos aleatorios. Puede ver que los resultados de par()$pin y par()$plt (y otros parámetros) son exactamente los mismos para los 3 gráficos, aunque las regiones de trazado difieran en los trazados.

También habrá 3 ventanas nuevas que aparecieron, en las ventanas puede mover el puntero del mouse sobre el gráfico y en la parte inferior de la ventana verá la ubicación actual del puntero en las coordenadas del dispositivo normalizadas y en pulgadas (ambas de la esquina inferior izquierda de la región del dispositivo). Puede desplazar el puntero del mouse sobre las esquinas del gráfico (o cualquier otra parte) para ver los valores y comparar los 3 gráficos.

Esto puede ser suficiente para responder al menos parte de la pregunta original (simplemente no programáticamente, lo cual sería más útil). La función se puede modificar para imprimir otras medidas también. Puedo expandir esto e incluirlo en un paquete en el futuro si otros estuvieran interesados.