Изменить цвет фона с plot_grid - PullRequest
0 голосов
/ 19 ноября 2018

как я могу изменить цвет фона при использовании plot_grid?У меня есть следующий рисунок, но я хочу, чтобы все на заднем плане было серым и не должно иметь разницы в высоте.Как я могу изменить это?

enter image description here

Вот мой код для графики и данных:

Данные

   set.seed(123456)
    Test_1 <- round(rnorm(20,mean=35,sd=3),0)/100
    Test_2 <- round(rnorm(20,mean=70,sd=3),0)/100
    ei.data <- as.data.frame(cbind(Test_1,Test_2))

intercept <- as.data.frame(matrix(0,20,1))
slope <- as.data.frame(matrix(0,20,1))
data <- cbind(intercept,slope)
colnames(data) <- c("intercept","slope")
for (i in 1:nrow(ei.data)){
  data[i,1] <- (ei.data[i,2]/(1-ei.data[i,1]))
  data[i,2] <- ((ei.data[i,1]/(1-ei.data[i,1]))*(-1))
}

Левый график

p <- ggplot(data, aes(Test_1,Test_2))+
  geom_point(shape=1,size=1)+
  theme_bw()+
  xlab(TeX("$n_{1,i}$"))+
  ylab(TeX("$t_{1,i}$"))+
  scale_y_continuous(limits=c(0,1),breaks=seq(0,1,0.2))+
  scale_x_continuous(limits = c(0,1),breaks=seq(0,1,0.2))+
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_rect(fill = "grey92", colour = NA),
        plot.background = element_rect(fill = "grey92", colour = NA),
        axis.line = element_line(colour = "black"))+
  theme(aspect.ratio=1)

p

Правый график

df <- data.frame()

q <- ggplot(df)+
  geom_point()+
  theme_bw()+
  scale_y_continuous(limits = c(0, 1),breaks=seq(0,1,0.2))+
  scale_x_continuous(limits = c(0, 1),breaks=seq(0,1,0.2))+
  xlab(TeX("$\\beta_i^{1,1}"))+
  ylab(TeX("$\\beta_i^{2,1}"))+
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_rect(fill = "grey92", colour = NA),
        plot.background = element_rect(fill = "grey92", colour = NA), axis.line = element_line(colour = "black"))+
  theme(aspect.ratio=1)+
  geom_abline(slope =data[1,2] , intercept =data[1,1], size = 0.3)+
  geom_abline(slope =data[2,2] , intercept =data[2,1], size = 0.3)+
  geom_abline(slope =data[3,2] , intercept =data[3,1], size = 0.3)+
  geom_abline(slope =data[4,2] , intercept =data[4,1], size = 0.3)+
  geom_abline(slope =data[5,2] , intercept =data[5,1], size = 0.3)+
  geom_abline(slope =data[6,2] , intercept =data[6,1], size = 0.3)+
  geom_abline(slope =data[7,2] , intercept =data[7,1], size = 0.3)+
  geom_abline(slope =data[8,2] , intercept =data[8,1], size = 0.3)+
  geom_abline(slope =data[9,2] , intercept =data[9,1], size = 0.3)+
  geom_abline(slope =data[10,2] , intercept =data[10,1], size = 0.3)+
  geom_abline(slope =data[11,2] , intercept =data[11,1], size = 0.3)+
  geom_abline(slope =data[12,2] , intercept =data[12,1], size = 0.3)+
  geom_abline(slope =data[13,2] , intercept =data[13,1], size = 0.3)+
  geom_abline(slope =data[14,2] , intercept =data[14,1], size = 0.3)+
  geom_abline(slope =data[15,2] , intercept =data[15,1], size = 0.3)+
  geom_abline(slope =data[16,2] , intercept =data[16,1], size = 0.3)+
  geom_abline(slope =data[17,2] , intercept =data[17,1], size = 0.3)+
  geom_abline(slope =data[18,2] , intercept =data[18,1], size = 0.3)+
  geom_abline(slope =data[19,2] , intercept =data[19,1], size = 0.3)+
  geom_abline(slope =data[20,2] , intercept =data[20,1], size = 0.3)
q

Организация

plot_grid(p,q,ncol=2, align = "v")

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Поскольку вы настраиваете графики таким же образом, давайте упростим настройку этих настроек (если вы передумали):

theme_plt <- function() {
  theme_bw() + 
    theme(
      panel.grid.major = element_blank(), 
      panel.grid.minor = element_blank(),
      panel.background = element_rect(fill = "grey92", colour = NA),
      plot.background = element_rect(fill = "grey92", colour = NA),
      axis.line = element_line(colour = "black")
    ) +
    theme(aspect.ratio = 1)
}

common_scales <- function() {
  list(
    scale_y_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.2)),
    scale_x_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.2))
  )
}

Ваш левый вызов графика использует неверный параметр для data который зафиксирован здесь:

ggplot(ei.data, aes(Test_1, Test_2)) +
  geom_point(shape = 1, size = 1) +
  common_scales() +
  labs(
    x = TeX("$n_{1,i}$"), y = TeX("$t_{1,i}$")
  ) +
  theme_plt() -> gg1

Вы можете упростить вашу abline повторяемость с помощью:

ggplot() +
  geom_point() +
  geom_abline(
    data = data, aes(slope = slope, intercept = intercept), size = 0.3
  ) +
  common_scales() +
  labs(
    x = TeX("$\\beta_i^{1,1}"), y = TeX("$\\beta_i^{2,1}")
  ) +
  theme_plt() -> gg2

Теперь, причина различий в высоте заключается в правильном графике, имеющем обасуб- и супер-скрипты.Таким образом, мы можем убедиться, что все биты имеют одинаковую высоту (поскольку эти графики имеют одинаковые общие элементы области графика) с помощью:

gt1 <- ggplot_gtable(ggplot_build(gg1))
gt2 <- ggplot_gtable(ggplot_build(gg2))

gt1$heights <- gt2$heights

Давайте посмотрим:

cowplot::plot_grid(gt1, gt2, ncol = 2, align = "v")

enter image description here

Вы не можете сказать из ^^, но есть горизонтальное белое поле / граница выше и ниже графиков из-за установленного aspect.ratio.RStudio никогда не покажет это ни в каком другом цвете, кроме белого (mebbe, возможно, «черный» в «темном» режиме в 1.2 в конце концов).

Другие устройства печати имеют цвет bg, который вы можете указать.Мы можем использовать устройство magick и указать правильную высоту / ширину, чтобы гарантировать отсутствие белых полей / полей:

image_graph(900, 446, bg = "grey92")
cowplot::plot_grid(gt1, gt2, ncol = 2, align = "v")
dev.off()

^^ будет по-прежнему выглядеть , как будто оно имеет верх / низграница в RStudio, если область / окно графика не имеет размера, соответствующего формату изображения, но фактическое «изображение» графика не будет иметь никакого.

0 голосов
/ 26 ноября 2018

Я думаю, что различные решения слишком сложны.Поскольку cowplot::plot_grid() возвращает новый объект ggplot2, вы можете просто стилизовать его, используя механизмы создания тем ggplot2.

Сначала воспроизводимый пример кода проблемы, упрощенный здесь:

library(ggplot2)
library(latex2exp)

set.seed(123456)
Test_1 <- round(rnorm(20,mean=35,sd=3),0)/100
Test_2 <- round(rnorm(20,mean=70,sd=3),0)/100
ei.data <- as.data.frame(cbind(Test_1,Test_2))

intercept <- as.data.frame(matrix(0,20,1))
slope <- as.data.frame(matrix(0,20,1))
data <- cbind(intercept,slope)
colnames(data) <- c("intercept","slope")
for (i in 1:nrow(ei.data)){
  data[i,1] <- (ei.data[i,2]/(1-ei.data[i,1]))
  data[i,2] <- ((ei.data[i,1]/(1-ei.data[i,1]))*(-1))
}

theme_plt <- function() {
  theme_bw() + 
    theme(
      panel.grid.major = element_blank(), 
      panel.grid.minor = element_blank(),
      panel.background = element_rect(fill = "grey92", colour = NA),
      plot.background = element_rect(fill = "grey92", colour = NA),
      axis.line = element_line(colour = "black")
    ) +
    theme(aspect.ratio = 1)
}

common_scales <- function() {
  list(
    scale_y_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.2)),
    scale_x_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.2))
  )
}

ggplot(ei.data, aes(Test_1, Test_2)) +
  geom_point(shape = 1, size = 1) +
  common_scales() +
  labs(
    x = TeX("$n_{1,i}$"), y = TeX("$t_{1,i}$")
  ) +
  theme_plt() -> gg1

ggplot() +
  geom_point() +
  geom_abline(
    data = data, aes(slope = slope, intercept = intercept), size = 0.3
  ) +
  common_scales() +
  labs(
    x = TeX("$\\beta_i^{1,1}"), y = TeX("$\\beta_i^{2,1}")
  ) +
  theme_plt() -> gg2

cowplot::plot_grid(gg1, gg2, align = "v")

Как мы видим, эти два рисунка имеют немного разные размеры, и, следовательно, фон не совпадает.

Решение состоит в том, чтобы просто добавить оператор темыпосле вызова plot_grid():

cowplot::plot_grid(gg1, gg2, align = "v") +
  theme(plot.background = element_rect(fill = "grey92", colour = NA))

Это позволило создать равномерный фон выбранного цвета.Вам, конечно, придется настроить выходные размеры графика, чтобы избежать большого количества серого цвета над и под двумя цифрами.

Чтобы более четко выделить происходящее, давайте стилизуем комбинированный график с другим цветомвыбор:

cowplot::plot_grid(gg1, gg2, align = "v") +
  theme(plot.background = element_rect(fill = "cornsilk", colour = "blue"))

Мы можем видеть, что утверждение темы применяется к холсту, на котором два участка вставляются с помощью plot_grid().

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

cowplot::plot_grid(gg1, gg2, align = "vh")

Обычно, align = "h" будет достаточно (align = "v" неверно, когдаграфики располагаются в одном ряду), но поскольку тема имеет фиксированное соотношение сторон, нам необходимо выровнять ее по горизонтали и вертикали, поэтому align = "vh".

0 голосов
/ 19 ноября 2018

С помощью png() вы можете правильно сохранить изображение, изменив bg:

png(bg = "grey92") # set the same bg
cowplot::plot_grid(p,q,ncol=2, align = "v")
#gridExtra::grid.arrange(p,q,ncol=2)
dev.off()

enter image description here

ОБНОВЛЕНИЕ :

При этом вы можете удалить даже белую рамку на графике (не нужно сохранять png):

library(gridExtra)
library(grid)
grid.draw(grobTree(rectGrob(gp=gpar(fill="grey92", lwd=0)), # this changes the bg in the graphics (R viewer)
                   arrangeGrob(p,q,ncol=2)))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...