ggplot: одинаковая ширина полосы с разным количеством полос

#r #ggplot2 #bar-chart

#r #ggplot2 #гистограмма

Вопрос:

Я хотел бы иметь диаграммы, в которых столбцы имеют одинаковую ширину на разных графиках, независимо от того, сколько столбцов показано. Я не хочу показывать графики на одной странице или упорядочивать их с помощью фасетов grid.arrange или чего-то подобного, а просто иметь два графика с полосами одинаковой ширины.

Я мог бы сделать это, просто умножив ширину на количество полос на графике, деленное на количество полос на графике с наибольшим количеством полос (см. Пример). Но было бы более удобным и несколько более чистым кодом, если бы я мог сделать это без каких-либо вычислений перед вызовом ggplot.

Есть ли способ указать ширину полосы в единицах измерения, таких как линии, em, сантиметры?

Или я могу получить доступ к количеству уровней переменной, сопоставленной с x-эстетикой в вызове geom_col ? (Обратите внимание на переменную, сопоставленную с x-эстетическими изменениями между графиками)

Или есть другое простое решение?

 ggplot(data.frame(x=factor(1:2), y=4:5), aes(x=x, y=y))   
  geom_col(width=0.7*2/3)

ggplot(data.frame(A=factor(1:3), y=3:5), aes(x=A, y=y))   
  geom_col(width=0.7*3/3)
 

Ответ №1:

AFAIK, вы не можете установить абсолютную ширину в geom_col() / geom_bar() , поэтому вам придется либо предварительно рассчитать пропорции и соотношение сторон полос, либо использовать geom_segment() , который принимает size аргумент, который является абсолютным. Они не имеют внутренних параметров в виде прямоугольников и, однако, не принимают отдельные colour fill аргументы и.

 library(ggplot2)
library(patchwork)

g1 <- ggplot(data.frame(x=factor(1:2), y=4:5), aes(x=x, y=y, xend = x, yend = 0))   
  geom_segment(size = 20)

g2 <- ggplot(data.frame(A=factor(1:3), y=3:5), aes(x=A, y=y, xend=A, yend = 0))   
  geom_segment(size = 20)

g1   g2
 

Комментарии:

1. Это должно сработать, большое спасибо. Если мне понадобится заливка и цвет, я все равно могу рассчитать размеры вручную и использовать geom_rect