Как получить точный размер шрифта, линии, точки и фигуры в ggplot2?

Для окончательного представления статьи мне было предложено обновить мои данные, чтобы они соответствовали следующим спецификациям:

  • осевые линии 0,25 мм
  • осевые линии вокруг с тиками, стоящими в
  • линии данных составляют 0,5 мм
  • font 10pt
  • цифры должны быть шириной 80 или 169 мм.
  • должен быть 300 dpi

Что я пробовал:

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

Что возвращает следующие два графика:

введите описание изображения здесь

введите описание изображения здесь

Я могу выяснить, как обрабатывать некоторые из проблем здесь (например, положения легенды), но я испытываю трудности со следующим:

  • Как я могу получить тики вокруг верхней и правой осей?
  • Как я могу получить правильные размеры...
    • Они выглядят намного больше, чем 10 pt. (загрузить их или открыть в новом окне, чтобы просмотреть немасштабированную версию)
    • Размеры не поддерживаются на двух рисунках, несмотря на то, что они указаны в теме (шрифт, строка).
    • Я не знаю, как подтвердить, что строки имеют правильный размер (в точках или мм)... делает ggsave собственное масштабирование?

update. Для моей текущей задачи я экспортировал файлы svg и отредактировал их в Inkscape. Потребовалось несколько часов, но было проще, чем заставить ggplot искажать спецификации.

Но было бы полезно знать, как это сделать программно в ggplot2.

Ответы

Ответ 1

Отвечайте на вопрос: 1), как сказал Хенрик в комментариях:

Для вопроса 1 (Как я могу получить тики вокруг верхней и правой осей?), см. новый аргумент sec.axis в scale_ в ggplot 2.2.0. Попробуйте, например. ggplot (mpg, aes (смещение, hwy)) + geom_point() + scale_x_continuous (sec.axis = dup_axis()) + scale_y_continuous (sec.axis = dup_axis())

2) проблема заключается в том, что у вас есть такое же разрешение с разными размерами. Поскольку высота двух фигур одинакова, вы можете исправить эту проблему, масштабируя размер шрифта вручную, умножая размер шрифта на отношение ширины: например,

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

Весь код должен выглядеть следующим образом:

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