Добавить легенду, используя geom_point и geom_smooth из другого набора данных - PullRequest
1 голос
/ 08 ноября 2019

Я действительно изо всех сил пытаюсь установить правильную легенду для geom_point графика с регрессией Лесса, в то время как используется 2 набора данных

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

Чтобы быть более точным, вот пример первого кода и возвращенного графика без легенды, чего я и ожидал:

# first graph, which is given what I expected but with no legend
p <- ggplot(dat1, aes(x = Hour, y = value)) +
  geom_point(color = "darkgray", size = 1) +
  geom_point(data = dat2, mapping = aes(x = Hour, y = mean), 
             color = 20, size = 3) + 
  geom_smooth(method = "loess", span = 0.2, color = "red", fill = "blue")

и графика (серым цветом)есть все данные, по часам, по дням. Красная кривая - регрессия Лесса. Синие точки - это средние значения для каждого часа):

in grey there is all the data, per hours, per days. the red curve is the loess regression. The blue dots are the means for each hours

Когда я попытался установить легенду, мне не удалось построить одну с объяснением как для вида точек (данные серого цвета, среднее значение синего цвета), так и для кривой лёсса (красного цвета). Ниже приведен пример того, что я пробовал.

# second graph, which is given what I expected + the legend for the loess that 
# I wanted but with not the dot legend

p <- ggplot(dat1, aes(x = Hour, y = value)) +
  geom_point(color = "darkgray", size = 1) +
  geom_point(data = dat2, mapping = aes(x = Hour, y = mean), 
             color = "blue", size = 3) +
  geom_smooth(method = "loess", span = 0.2, aes(color = "red"), fill = "blue") +  
  scale_color_identity(name = "legend model", guide = "legend", 
                       labels = "loess regression \n with confidence interval")

Я получил хорошую легенду только для кривой

и еще одного испытания:

# I tried to combine both date set into a single one as following but it did not 
# work at all and I really do not understand how the legends works in ggplot2 
# compared to the normal plots

A <- rbind(dat1, dat2)
p <- ggplot(A, aes(x = Heure, y = value, color = variable)) +
  geom_point(data = subset(A, variable == "data"), size = 1) +
  geom_point(data = subset(A, variable == "Moy"), size = 3) +
  geom_smooth(method = "loess", span = 0.2, aes(color = "red"), fill = "blue") +
  scale_color_manual(name = "légende", 
                     labels = c("Data", "Moy", "loess regression \n with confidence interval"), 
                     values = c("darkgray", "royalblue", "red"))

Похоже, что всенастройки легенды смешиваются «странным» образом, это серая точка, которая закрывается серой линией, а затем - синим и красным (для трех меток). у всех фон синего цвета:

1 Ответ

0 голосов
/ 09 ноября 2019

Если вам нужно обозначить среднее значение, может потребоваться немного творческий подход, потому что не так просто добавить легенду вручную в ggplot.

Я моделирую что-то похожее на ваши данные ниже.

dat1 = data.frame(
       Hour = rep(1:24,each=10),
       value = c(rnorm(60,0,1),rnorm(60,2,1),rnorm(60,1,1),rnorm(60,-1,1))
)
# classify this as raw data
dat1$Data = "Raw"
# calculate mean like you did
dat2 <- dat1 %>% group_by(Hour) %>% summarise(value=mean(value))
# classify this as mean
dat2$Data = "Mean"

# combine the data frames
plotdat <- rbind(dat1,dat2)
# add a dummy variable, we'll use it later
plotdat$line = "Loess-Smooth"

Сначала мы строим базовый точечный график:

ggplot(plotdat, aes(x = Hour, y = value,col=Data,size=Data)) +
  geom_point() + 
  scale_color_manual(values=c("blue","darkgray"))+
  scale_size_manual(values=c(3,1),guide=FALSE)

enter image description here

Обратите внимание, что с размером, мы установили ориентир на ЛОЖЬ, чтобы он не появлялся. Теперь мы добавляем гладкость по лёссу, один из способов введения легенды - это введение типа линии, и, поскольку есть только одна группа, у вас будет только одна переменная:

ggplot(plotdat, aes(x = Hour, y = value,col=Data,size=Data)) +
  geom_point() + 
  scale_color_manual(values=c("blue","darkgray"))+
  scale_size_manual(values=c(3,1),guide=FALSE)+
  geom_smooth(data=subset(plotdat,Data="Raw"),
  aes(linetype=line),size=1,alpha=0.3,
         method = "loess", span = 0.2, color = "red", fill = "blue")

enter image description here

...