Вручную определите размер кадра, используя ggplot2 и geom_boxplot

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

Если вы, например. имеют график 2x2, и каждый из кадров должен быть квадратным с высотой и шириной 400x400 пикселей, вы не можете установить размер всего графика 800x800, так как все еще есть тексты осей (и они могут быть разные по длине из-за «масштабов Команда ="free_y" в facet_wrap(~variable,scales="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()

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 096
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это с помощью 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") для краткости):

Теперь, если вы также хотите, чтобы полосы (текст, который выглядит как заголовки панелей в более темном поле) были включены в поле 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)

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

Большое спасибо за быстрый ответ! Определенно интересный подход, но он, похоже, задает размеры панели, а не отдельного кадра. При использовании вашего кода отдельные рамки блочной диаграммы по-прежнему различаются по высоте и ширине. Я добавил быстрый графический пример для пояснения, какие размеры мне нужно установить для определенного значения -> связь. Длина красных стрелок на картинке должна быть установлена ​​на определенные значения, чтобы они всегда были квадратичными.

cbr 07.07.2019 09:58

Приведенный вами пример выглядит как результат facet_grid() вместо facet_wrap(). Кроме того, я не совсем уверен, что именно вы имеете в виду, когда говорите «кадр»; на мой взгляд, то, что вы указали красными стрелками, - это панель, так что не могли бы вы уточнить, что вы подразумеваете под рамкой? Вы имеете в виду в том числе полосы? Вы имеете в виду исключение поля по умолчанию 10% вокруг объектов?

teunbrand 07.07.2019 12:01

Поскольку мне не хватает подходящего слова (извините, я не слишком знаком с терминами r), позвольте мне упростить и сказать, что я имею в виду рамку, граничащую с двумя блочными диаграммами, представленными на изображении (обычно это прямоугольник с черными краями). Изображение, вероятно, facet_grid, но оно было просто для иллюстрации.

cbr 08.07.2019 15:36

Хорошо, я обновлю свой ответ некоторыми вариантами и иллюстрациями!

teunbrand 08.07.2019 19:06

Большое спасибо - это именно то, что я искал! Очень признателен!

cbr 09.07.2019 14:18

Другие вопросы по теме