Легенда графика плотности ggplot2 показывает неправильные имена групп и неправильные цвета - PullRequest
0 голосов
/ 22 января 2020

Следующий код отображает два частично перекрывающихся распределения плотности из двух независимых фреймов данных с разными длинами.

library(ggplot2)
#Define colors to be used in plot for each group
mycolRO <- rgb(0.8, 0.2, 0, max = 1, alpha = 0.5) #Color for Group "Road"
mycolRA <- rgb(0.2, 0.6, 0.4, max = 1, alpha = 0.5)    #Color for Group "Rail"

#Create some data
dfRoad <- data.frame(DiffRO=2+rnorm(300))
dfRail <- data.frame(DiffRA=rnorm(500))

#Plot density distributions
  ggplot() +
  geom_density(aes(x=DiffRO, fill = mycolRO, alpha=0.5), data=dfRoad) +
  geom_density(aes(x=DiffRA, fill = mycolRA, alpha=0.5), data=dfRail) +
  xlim(-6, 6) +
  theme_classic() +
  ggtitle("") +
  xlab("Value") +
  ylab("Density") +
  theme(plot.title = element_text(color="black", size=17, face="bold"),
  axis.title.x = element_text(color="black", size=17, face="bold"),
  axis.title.y = element_text(color="black", size=17, face="bold"),
  axis.text=element_text(size=15))+
  labs(fill = "Group")+
  theme(legend.title = element_text(color = "black", size = 15), legend.text = element_text(color = "black", size=12))+
  theme(legend.position = c(0.2,0.8), legend.direction = "vertical")+
  guides(alpha=FALSE)


Легенда показывает правильный базовый цвет, но не со значением прозрачности (альфа), определенным выше, который должен быть альфа = 0,5. Кроме того, я хотел бы видеть правильные имена переменных ("DiffRO" и "DiffRA") в качестве записей легенды вместо цветовых кодов.

Спасибо за любую помощь.

1 Ответ

2 голосов
/ 22 января 2020

Вот два способа сделать то, что вы хотите.
Общими точками для обоих являются:

  1. Цвета задаются вручную с помощью scale_fill_manual.
  2. theme вызовы упрощены, нет необходимости повторно вызывать theme.

Сначала я воссоздаю данные, на этот раз установив начальное значение ГСЧ перед вызовом rnorm.

set.seed(1234)
dfRoad <- data.frame(DiffRO = 2 + rnorm(300))
dfRail <- data.frame(DiffRA = rnorm(500))

Ваш путь исправлен.

Легенда метки также должна быть установлена ​​вручную в scale_fill_manual.

#Plot density distributions
ggplot() +
  geom_density(aes(x=DiffRO, fill = mycolRO, alpha=0.5), data=dfRoad) +
  geom_density(aes(x=DiffRA, fill = mycolRA, alpha=0.5), data=dfRail) +
  xlim(-6, 6) +
  ggtitle("") +
  xlab("Value") +
  ylab("Density") +
  scale_fill_manual(labels = c("Road", "Rail"),
                    values = c(mycolRO, mycolRA)) +
  theme_classic() +
  theme(plot.title = element_text(color="black", size=17, face="bold"),
        axis.title.x = element_text(color="black", size=17, face="bold"),
        axis.title.y = element_text(color="black", size=17, face="bold"),
        axis.text=element_text(size=15),
        legend.title = element_text(color = "black", size = 15), 
        legend.text = element_text(color = "black", size=12),
        legend.position = c(0.2,0.8), legend.direction = "vertical")+
  labs(fill = "Group") +
  guides(alpha = FALSE)

Другой способ, более простой.

Данные объединяются и переформатируются из двух разных наборов данных только в один набор данных. Для этого я использую пакет reshape2.

dflong <- reshape2::melt(dfRoad)
dflong <- rbind(dflong, reshape2::melt(dfRail))

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

ggplot(dflong, aes(x = value, group = variable, fill = variable, alpha = 0.5)) +
  geom_density() +
  xlim(-6, 6) +
  ggtitle("") +
  xlab("Value") +
  ylab("Density") +
  scale_fill_manual(values = c(mycolRA, mycolRO)) +
  theme_classic() +
  theme(plot.title = element_text(color="black", size=17, face="bold"),
        axis.title.x = element_text(color="black", size=17, face="bold"),
        axis.title.y = element_text(color="black", size=17, face="bold"),
        axis.text = element_text(size=15),
        legend.title = element_text(color = "black", size = 15), 
        legend.text = element_text(color = "black", size=12),
        legend.position = c(0.2,0.8), legend.direction = "vertical") +
  labs(fill = "Group") +
  guides(alpha = FALSE)

enter image description here

...