Как избежать чрезмерного скопления пузырьков на пузырьковом графике? - PullRequest
1 голос
/ 28 февраля 2020

Я хочу отдельно отобразить данные в виде пузырьков, как показано на рисунке справа (я делаю это в PowerPoint только для визуализации). enter image description here В данный момент я могу создать только график, который выглядит слева, где пузырь перекрывается. Как я могу сделать это в R?

b <- ggplot(df, aes(x = Year, y = Type))

b + geom_point(aes(color = Spp, size = value), alpha = 0.6) +
  scale_color_manual(values = c("#0000FF", "#DAA520",  "#228B22","#E7B888")) +
  scale_size(range = c(0.5, 12)) 

1 Ответ

3 голосов
/ 28 февраля 2020

Вы можете использовать аргумент position_dodge() в вашем geom_point. Если вы примените его непосредственно к своему коду, он будет располагать точки горизонтально, поэтому идея состоит в том, чтобы переключать переменные x и y и использовать coord_flip, чтобы получить его правильным образом:

library(ggplot2)
ggplot(df, aes(y = as.factor(Year), x = Type))+ 
  geom_point(aes(color = Group, size = Value), alpha = 0.6, position = position_dodge(0.9)) +
  scale_color_manual(values = c("#0000FF", "#DAA520",  "#228B22","#E7B888")) +
  scale_size(range = c(1, 15)) +
  coord_flip()

enter image description here

Похоже, что вы пытаетесь достичь?


РЕДАКТИРОВАТЬ: Добавление текста в середине каждой точки

Чтобы добавить маркировку в каждую точку, вы можете использовать geom_text и установить то же самое position_dodge2 аргумент, чем для geom_point.

Примечание: я использую position_dodge2 вместо position_dodge и немного изменяю значения ширины, потому что я нашел position_dodge2 более приспособленным к этому случаю.

library(ggplot2)
ggplot(df, aes(y = as.factor(Year), x = Type))+ 
  geom_point(aes(color = Group, size = Value), alpha = 0.6, 
             position = position_dodge2(width  = 1)) +
  scale_color_manual(values = c("#0000FF", "#DAA520",  "#228B22","#E7B888")) +
  scale_size(range = c(3, 15)) +
  coord_flip()+
  geom_text(aes(label = Value, group = Group), 
            position = position_dodge2(width = 1))

enter image description here

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

Поскольку вы не предоставили воспроизводимый пример, я сделал пример, который, возможно, не полностью отражает ваш исходный набор данных. Если мой ответ не работает для вас, вам следует рассмотреть возможность воспроизведения воспроизводимого примера (см. Здесь: Как создать великолепный воспроизводимый пример R )

Group <- c(LETTERS[1:3],"A",LETTERS[1:2],LETTERS[1:3])
Year <- c(rep(1918,4),rep(2018,5))
Type <- c(rep("PP",3),"QQ","PP","PP","QQ","QQ","QQ")
Value <- sample(1:50,9)
df <- data.frame(Group, Year, Value, Type)
df$Type <- factor(df$Type, levels = c("PP","QQ"))
...