ggplot facet_wrap с одинаково расположенными осями - PullRequest
0 голосов
/ 03 мая 2018

Скажем, у меня есть следующий фиктивный фрейм данных:

df <- data.frame(let = LETTERS[1:13], value = sample(13), 
group = rep(c("foo", "bar"), times = c(5,8)))

df
  let value group
1    A     2   foo
2    B     1   foo
3    C    12   foo
4    D     8   foo
5    E     4   foo
6    F    13   bar
7    G    11   bar
8    H     3   bar
9    I     7   bar
10   J     5   bar
11   K    10   bar
12   L     9   bar
13   M     6   bar

Использование ggplot с facet_wrap позволяет мне создать панель для каждой из групп ...

library(ggplot2)
ggplot(df, aes(x= let, y = value)) + 
geom_point() + 
coord_flip() +
facet_wrap(~group, scales = "free")

enter image description here

.. но вертикальные оси разнесены не одинаково, то есть левый график содержит больше вертикальных отметок, чем правый. Я хотел бы заполнить правую вертикальную ось галочками (без меток) (без отложенных значений). В этом случае это добавило бы 3 пустых галочки, но оно должно быть масштабируемым до любого размера df.

Каков наилучший способ сделать это? Должен ли я изменить фрейм данных или есть способ сделать это с помощью ggplot?

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Грязное решение, для которого требуется magrittr (для составной трубы назначения %<>%):

df %<>% 
  rbind(data.frame(let = c(" ", "  ", "   "), 
                   value = NA, 
                   group = "foo"))

enter image description here

Я просто добавляю еще три записи для foo, которые являются пустыми строками (то есть просто пробелами) различной длины. Однако должно быть более элегантное решение.

0 голосов
/ 03 мая 2018

Я не уверен, почему вы хотите расположить категориальную переменную на вашем графике так, как вы это делаете, кроме эстетики (кажется, она выглядит лучше). В любом случае, простой обходной путь, который, кажется, обрабатывает общие случаи, состоит в том, чтобы отметить, что ggplot использует числовую шкалу для построения категориальных переменных. Обходной путь для вашей диаграммы - для каждого значения x построить прозрачную точку со значением y, равным количеству категориальных переменных. Точки построены для всех значений x как простое решение для случая неперекрывающихся диапазонов значений x для каждой группы. Я добавил еще одну группу в ваш фрейм данных, чтобы сделать пример более общим.

library(ggplot2)
set.seed(123)
df <- data.frame(let = LETTERS[1:19], value = c(sample(13),20+sample(6)), 
             group = rep(c("foo", "bar", "bar2"), times = c(5,8,6)))
num_rows <- xtabs(~ group, df)
max_rows <- max(num_rows)

sp <- ggplot(df, aes(y= let, x = value)) + 
      geom_point() + 
      geom_point(aes(y = max_rows +.5), alpha=0 ) +
      facet_wrap(~group, scales = "free", nrow=1 )
plot(sp)

Это дает следующий график: enter image description here

0 голосов
/ 03 мая 2018

Используйте free_x вместо free, например:

ggplot(df, aes(x= let, y = value)) + 
  geom_point() + 
  coord_flip() +
  facet_wrap(~group, scales = "free_x")+
  theme(axis.text.y=element_blank(),
        axis.ticks.y=element_blank())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...