una ¿Cómo obtengo tamaños exactos de fuente, línea, punto y figura en ggplot2?



tamaño letra graficos r (1)

Para una presentación final del artículo me han pedido que actualice mis cifras para que cumplan con las siguientes especificaciones:

  1. las líneas del eje son 0.25 mm
  2. líneas de ejes alrededor con garrapatas frente a
  3. las líneas de datos son 0.5 mm
  4. la fuente es 10pt
  5. las figuras deben tener 80 o 169 mm de ancho
  6. debe ser 300 dpi

Lo que he intentado:

library(ggplot2)
library(cowplot)
theme_set(theme_bw())

x <- rnorm(100)
mydata <- data.frame(x = x,
                     y = x^2 + runif(100),
                     z = rep(letters[1:4], 25))

p <- ggplot(data = mydata, aes(x, y)) + 
  geom_point(aes(color = z)) + 
  geom_smooth(color = 'black', se = FALSE, size = 0.5) +
  theme(text = element_text(family = 'Times', size = 10, color = 'black'),
        axis.ticks.length = unit(-0.1, 'cm'),
        axis.text.x = element_text(margin = margin(t = 4, unit = 'mm')),
        axis.text.y = element_text(margin = margin(r = 4, unit = 'mm')),
        panel.grid = element_blank(),
        axis.line = element_line(size = 0.25),
        legend.position = c(0.5, 0.75))

p
ggsave(plot = p, 
       filename = 'myplot.png', 
       width = 80, height = 50, dpi = 300, units = 'mm')

p2 <- cowplot::plot_grid(plotlist = list(p, p, p, p), nrow = 1)
ggsave(plot = p2,
       filename = 'mymultipleplot.png',
       width = 169, height = 50, dpi = 300, units = 'mm')

Que devuelve las siguientes dos parcelas:

Puedo averiguar cómo manejar algunos de los problemas aquí (por ejemplo, posiciones de leyenda), pero tengo dificultades con lo siguiente:

  1. ¿Cómo puedo obtener marcas en los ejes superior y derecho?
  2. ¿Cómo puedo obtener los tamaños correctos ...
    • Estos parecen mucho más grandes que 10 pt. (descárguelos o abrir en una nueva ventana para ver la versión sin escalar)
    • Los tamaños no se mantienen en las dos figuras a pesar de estar especificados en el tema (fuente, línea).
    • No sé cómo confirmar que las líneas tienen el tamaño correcto (en puntos o mm) ... ¿ ggsave hace su propia escala?

actualización Para mi tarea actual, exporté como archivos svg y los edité en Inkscape. Tardó algunas horas, pero fue más fácil que obtener ggplot para contort a las especificaciones.

Pero, sería útil saber para el futuro cómo hacer esto programáticamente dentro de ggplot2.


Respuesta a la pregunta: 1) como dijo Henrik en los comentarios:

Para la pregunta 1 (¿Cómo puedo obtener marcas en los ejes superior y derecho?), Vea el nuevo argumento sec.axis en scale_ en ggplot 2.2.0. Pruebe, por ejemplo, ggplot (mpg, aes (displ, hwy)) + geom_point () + scale_x_continuous (sec.axis = dup_axis ()) + scale_y_continuous (sec.axis = dup_axis ())

2) el problema aquí es que tienes la misma resolución con diferentes tamaños. Dado que la altura de las dos figuras es la misma, puede solucionar este problema escalando el tamaño de la fuente multiplicando manualmente el tamaño de la fuente por la relación del ancho: por ej.

theme(text = element_text(family = 'Times', size = 10*(80/169), color = 'black')

El código completo debería verse así:

library(ggplot2)
library(cowplot)
theme_set(theme_bw())

x <- rnorm(100)
mydata <- data.frame(x = x,
                     y = x^2 + runif(100),
                     z = rep(letters[1:4], 25))

p1 <- ggplot(data = mydata, aes(x, y)) + 
  geom_point(aes(color = z)) + scale_x_continuous(sec.axis = dup_axis()) + 
  scale_y_continuous(sec.axis = dup_axis()) + 
  geom_smooth(color = 'black', se = FALSE, size = 0.5) +
  theme(text = element_text(family = 'Times', size = 10*(80/169), color = 'black'),
        axis.ticks.length = unit(-0.1, 'cm'),
        axis.text.x = element_text(margin = margin(t = 4, unit = 'mm')),


        axis.text.y = element_text(margin = margin(r = 4, unit = 'mm')),

        panel.grid = element_blank(),
        axis.line = element_line(size = 0.25),
        legend.position = c(0.5, 0.75))

p2 <- ggplot(data = mydata, aes(x, y)) + 
  geom_point(aes(color = z)) + scale_x_continuous(sec.axis = dup_axis()) + 
  scale_y_continuous(sec.axis = dup_axis()) + 
  geom_smooth(color = 'black', se = FALSE, size = 0.5) +
  theme(text = element_text(family = 'Times', size = 10, color = 'black'),
        axis.ticks.length = unit(-0.1, 'cm'),
        axis.text.x = element_text(margin = margin(t = 4, unit = 'mm')),


        axis.text.y = element_text(margin = margin(r = 4, unit = 'mm')),

        panel.grid = element_blank(),
        axis.line = element_line(size = 0.25),
        legend.position = c(0.5, 0.75))


p1
ggsave(plot = p1, 
       filename = 'myplot.png', 
       width = 80, height = 50, dpi = 300, units = 'mm')

p2multi <- cowplot::plot_grid(plotlist = list(p2, p2, p2, p2), nrow = 1)

ggsave(plot = p2multi ,
       filename = 'mymultipleplot.png',
       width = 169, height = 50, dpi = 300, units = 'mm')




ggplot2