Экспорт в PDF изменяет масштаб оси в r - PullRequest
1 голос
/ 25 февраля 2020

Следующий пример выглядит как мои данные:

library(ggplot2)
library(gridExtra)

set.seed(123)
a=sample(1:100, 100)
b=sample(1:50, 100, replace = TRUE)
obj= data.frame(a,b)

ggplot(obj, aes(a, b, col=a))+
               geom_point()+
               geom_path()+
               coord_cartesian(xlim =c(0, 100), ylim = c(0, 50))

Числа масштабируются здесь, xaxis в два раза длиннее оси y, как видно в R. Однако, как только я расположу их с grid.arrange и перенести их в PDF, графики станут квадратными:

plot1=ggplot(obj, aes(a, b, col=a))+
               geom_point()+
               geom_path()+
               coord_cartesian(xlim =c(0, 100), ylim = c(0, 50))

plot2= ggplot(as.data.frame(c(1,2),c("1","2")), aes(1,1))+
               geom_point()

plot3= ggplot(obj,aes(a))+
               geom_histogram()

grid.arrange(plot1, plot2, plot1, plot3, nrow=2)

Я сделал свой PDF в альбомной форме, чтобы соответствовать графикам, но они остались в квадрате. Добавление ширины, кажется, просто масштабирует положение четырех графиков, а не оси. Я играл с Cowplot, но этот не совместим с PDF (я запускаю al oop на многих файлах данных, которые собирают графики в один файл PDF. У кого-нибудь есть другие предложения? Заранее спасибо.

И бонусный вопрос ... Как поменять легенду, чтобы темные 25 были на вершине?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Если вы хотите сохранить одинаковое соотношение между длиной x и y, возможно, вы можете добавить аргумент aspect.ratio в theme вашего первого графика. Здесь я использовал aspect.ratio = 0.5, чтобы сделать ось x вдвое длиннее оси y, но вы можете поиграть с ней, чтобы получить подходящий размер для вашего графика.

Чтобы изменить порядок легенды, вы можете использовать аргумент guide_colorbar и guide_legend в функции guides.

В целом вы можете сделать следующее:

plot1=ggplot(obj, aes(a, b, col=a))+
  geom_point()+
  geom_path()+
  coord_cartesian(xlim =c(0, 100), ylim = c(0, 50))+
  theme(aspect.ratio = 0.5)+
  guides(color = guide_colorbar(reverse=TRUE),
         size = guide_legend(reverse = TRUE))

plot2= ggplot(as.data.frame(c(1,2),c("1","2")), aes(1,1))+
  geom_point()

plot3= ggplot(obj,aes(a))+
  geom_histogram()

grid.arrange(plot1, plot2, plot1, plot3, nrow=2)

enter image description here

Выглядит ли то, что вы пытаетесь достичь?

1 голос
/ 25 февраля 2020

Вам нужны только две цифры в левом столбце, должны иметь размеры 1: 2, а две правые должны быть квадратными? Если это так, вы можете попробовать комбинацию использования аргументов heights и widths для arrangeGrob() или grid.extra(), а также указать ширину и высоту всего изображения в ggsave. Я обнаружил, что использование комбинации arrangeGrob и ggsave является наиболее стабильным при сохранении предсказуемых размеров.

Вы можете попробовать:

library(ggplot2)
library(gridExtra)

set.seed(123)
a=sample(1:100, 100)
b=sample(1:50, 100, replace = TRUE)
obj= data.frame(a,b)

plot1=ggplot(obj, aes(a, b, col=a))+
  geom_point()+
  geom_path()+
  coord_cartesian(xlim =c(0, 100), ylim = c(0, 50))  #+
  #theme(legend.position = "none")

plot2= ggplot(as.data.frame(c(1,2),c("1","2")), aes(1,1))+
  geom_point()

plot3= ggplot(obj,aes(a))+
  geom_histogram()

bigplot <- arrangeGrob(plot1, plot2, plot1, plot3, 
                       nrow=2, 
                       heights = c(2, 2),
                       widths = c(4, 2))

ggsave("bigplot.pdf", 
       bigplot,
       width = 11,
       height = 8.5,
       units = "in")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...