ggplot2: Как изменить положение точек в geom_beeswarm? - PullRequest
0 голосов
/ 13 февраля 2019

Я готовлю коробочный график, который должен отображать как боксплот, так и точки данных.Точки данных должны смещаться вправо, в то время как поле должно находиться слева.

Я использую функцию geom_beeswarm пакета ggbeeswarm R-Package, чтобы избежать наложения точек, подобно geom_jitter.

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

Я пробовал с помощью position = position_nudge (х = 0,5) но параметр неизвестен для geom_beeswarm.То же самое касается nudge_x = 0,5.

Есть ли у кого-то другое решение для перемещения графиков geom_beeswarm вправо?

Воспроизводимый пример

df <- data.frame('variable'=rep(c('control','treatment'),each=20),
'value'=c(runif(20, min=0, max=3), rnorm(60)))

ggtest<-ggplot(df,aes(variable, value)) +
geom_beeswarm(priority='random',cex=2.5)
ggtest

1 Ответ

0 голосов
/ 13 февраля 2019

Попробуй это.Сначала создайте новую переменную, которая является копией вашего "variable", просто используйте paste0, чтобы добавить число, чтобы избежать путаницы, я назвал его "variable2".

Напечатайте новый df, чтобы увидеть разницу.Этот новый variable2 будет использоваться как aes() для geom_beeswarm(), затем просто используйте scale_x_discrete и поиграйтесь с theme(), чтобы центрировать текст на x-axis.

Снова Iпредлагаем напечатать график до вызова scale_x_discrete() ecc .. чтобы понять, что я имею в виду.

df$variable2 <- paste0(df$variable, "2") # create a second almost identical variable

ggplot(df,aes(variable, value)) +
  geom_beeswarm(aes(variable2),priority='random',cex=2.5) + # use variable2 as custom aes() for the bees
  geom_boxplot() +
 # play with this to customize labels, we just want to hide "control2" and "treatment2"
  scale_x_discrete(breaks = c("control", "treatment")) + 
 # with this we center the text and remove the tick marks to improve the plot
  theme(axis.text.x = element_text(hjust=-1),
        axis.ticks.x = element_blank(),
        panel.grid.major.x = element_blank()) # removes vertical grid white lines

enter image description here

Пример данных:

library(ggbeeswarm)

df <- data.frame('variable'=rep(c('control','treatment'),each=20),
                 'value'=c(runif(20, min=0, max=3), rnorm(60)))

Обновление для ответа на запрос OP с большим интервалом.

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

Это заставит ggplot сделать некоторый интервал, и новый geom будет скрыт путем установки того же color, что и bg panel.

Я использовал geom_boxplot().

Новый пример данных:

df <- data.frame('variable'=rep(letters[1:7],each=20),
                 'value'=c(runif(40, min=0, max=3), rnorm(100)))
df$variable2 <- paste0(df$variable, "2") # create a second almost identical variable

Создайте две новые переменные, которые мы можем использовать для построения третьего объекта, который будет маскироваться с использованием того же color, что и bg.

df$variable3 <- paste0(df$variable, "3")
df$value3 <- c(runif(40, min=0, max=3), rnorm(100))

Наконец:

ggplot(df,aes(variable, value)) +
  geom_beeswarm(aes(variable2),priority='random',cex=2.5) + 
  geom_boxplot() +
  geom_boxplot(aes(variable3, value3), color="white") + # this is the boxplot that we will hide (notice the color choice)
  scale_x_discrete(breaks = c(letters[1:7])) + 
  theme(axis.text.x = element_text(hjust=-6), # adjust to center the x-labels
        axis.ticks.x = element_blank(),
        panel.background = element_rect(color="white", fill="white"),
        panel.grid.major.x = element_blank(),
        panel.grid.major = element_blank(), # to remove grid lines
        panel.grid.minor = element_blank(), 
        axis.line = element_line(size = 0.5, linetype = "solid",
                                 colour = "black"))

enter image description here

Опять же, это можно настроить еще больше.

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