Определите размер фрейма вручную, используя ggplot2 и geom_boxplot - PullRequest
0 голосов
/ 05 июля 2019

Как я могу вручную определить размер кадров отдельных графиков при построении нескольких коробочных диаграмм с использованием ggplot2?

Если у вас, например, есть график 2x2, и каждый из кадров должен быть квадратичным с высотой и шириной 400x400 пикселейвы не можете установить размер всего графика на 800x800, так как тексты осей все еще существуют (и они могут отличаться по длине из-за команды "scale =" free_y "в facet_wrap (~ variable, scale =" free_y "))Это приводит к «сжатию» вместо квадратичных размеров кадра.

p<-ggplot(data=data.frame,aes(x=x,y=value))+
geom_boxplot(size=0.1, fill="grey90")+
geom_point(aes(x=x, y=value, fill="black"),inherit.aes=FALSE, colour="red", size=2, position=position_jitterdodge(jitter.width = 0.25), show.legend=FALSE)+
facet_wrap(~variable,scales="free_y")+
theme_bw()

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

1 Ответ

0 голосов
/ 06 июля 2019

Вы можете сделать это с gtables следующим образом.Сначала мы построим график.

library(ggplot2)
library(grid)
# I don't have your data so I'll just use the diamonds dataset
p <- ggplot(diamonds, aes(x = cut, y = price)) +
  geom_boxplot() +
  facet_wrap(~ clarity, scales = "free_y")

Затем мы преобразуем график в gtable, получим расположение панелей и отрегулируем ширину и высоту по нашему вкусу.

gt <- ggplotGrob(p)
# Usually panels don't span multiple cells in the table, so we can take the
# left ("l") and top ("t") positions of the panels.
panel_x <- panel_cols(gt)[,"l"]
panel_y <- panel_rows(gt)[,"t"]
gt$widths[panel_x]  <- unit(400/72, "inches")
gt$heights[panel_y] <- unit(400/72, "inches")

grid.newpage(); grid.draw(gt)

К сожалению, функция unit() не позволяет указывать размеры в пикселях, поэтому я предположил, что разрешение вашего вывода будет 72 пикселя на дюйм.Посмотрите на ?unit, чтобы увидеть варианты.

РЕДАКТИРОВАТЬ:

Вот как выглядит выше (для краткости unit(100/72, "inches")):

enter image description here

Теперь, если вы также хотите, чтобы полосы (текст, выглядящий как заголовки панелей в более темном поле) были включены в поле 400x400, возможно, вы захотите найти положения полос вдольстроки и вычтите их из единиц, которые вы поставляете.

gt <- ggplotGrob(p)
panel_x <- panel_cols(gt)[,"l"]
panel_y <- panel_rows(gt)[,"t"]
strip_y <- unique(gt$layout$t[grepl("strip", gt$layout$name)])
gt$widths[panel_x]  <- unit(100/72, "inches")
gt$heights[panel_y] <- unit(100/72, "inches") - gt$heights[strip_y]

grid.newpage(); grid.draw(gt)

Что выглядит следующим образом:

enter image description here

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