как добавить легенду к графику с двумя слоями в R

Вот коды R. Когда я запускаю следующий код, у него нет легенды. Не могли бы вы помочь мне понять, как добавить легенду, показывающую, что голубая точка и гладкая — это болезнь Альцгеймера, а розовые — другие? Спасибо.

sct1 <- ggplot(human, aes(age1)) + 
  geom_point(aes(y = mean_alzheimer), colour = "deepskyblue") + 
  geom_smooth(aes(y=mean_alzheimer), method="loess", , colour ="blue4", fill="gray") +
  geom_point(aes(y = mean_other), colour = 'deeppink3') +
  geom_smooth(aes( y=mean_other), method="loess", colour="red", fill="gray") 

sct2 <- sct1 +  scale_x_continuous("AGE", breaks=c( 38, 56, 72, 122, 270), labels=c("fetal", "infant", "child", "teen", "adult") ) +
  coord_cartesian(xlim=c (0, 270), ylim = c(-0.52,0.35))+
  scale_y_continuous("Expression ") +
  scale_fill_manual(values=c("gray","black")) +
  annotate("text", x=11, y=10, label="") +
  theme_bw()

optns <- theme (
  plot.title = element_text(face="bold", size=14),
  axis.title.x = element_text(face="bold", size=12),
  axis.title.y = element_text(face="bold", size=12, angle=90),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank(),
  legend.position = c(0.8,0.3),
  legend.title = element_blank(),
  legend.text = element_text(size=12),
  legend.key.size = unit(1.5, "lines"),
  legend.key = element_blank()
)

sct2 +  ggtitle ( "Alzheimer") + optns

ЕСЛИ я добавлю цвет в aes(), сюжет будет странным. Цвет не совсем тот, что я определил.

sct1 <- ggplot(human, aes(age1)) + 
  geom_point(aes(y = mean_alzheimer, colour = "deepskyblue")) + 
  geom_smooth(aes(y=mean_alzheimer,  colour ="blue4"), method="loess", fill="gray") +
  geom_point(aes(y = mean_other, colour = 'deeppink3')) +
  geom_smooth(aes( y=mean_other, , colour="red"), method="loess", fill="gray") 

sct2 <- sct1 +  scale_x_continuous("AGE", breaks=c( 38, 56, 72, 122, 270), labels=c("fetal", "infant", "child", "teen", "adult") ) +
  coord_cartesian(xlim=c (0, 270), ylim = c(-0.52,0.35))+
  scale_y_continuous("Expression ") +
  scale_fill_manual(values=c("gray","black")) +
  annotate("text", x=11, y=10, label="") +
  theme_bw()

optns <- theme (
  plot.title = element_text(face="bold", size=14),
  axis.title.x = element_text(face="bold", size=12),
  axis.title.y = element_text(face="bold", size=12, angle=90),
  #panel.grid.major = element_blank(),
  #panel.grid.minor = element_blank(),
  #legend.position = c(0.5,0.5),
  legend.title = element_blank(),
  legend.text = element_text(size=12),
  legend.key.size = unit(1.5, "lines"),
  legend.key = element_blank()
)

sct2 +  ggtitle ( "Alzheimer") + optns



dput(head(human))
structure(list(mean_alzheimer = c(-0.0553750613, -0.0496918235, 
-0.0532426455, -0.0560890633, -0.0403871812, -0.0445302045), 
    stder_alzheimer = c(0.0069845669, 0.0081224212, 0.0071107644, 
    0.0065500585, 0.0055839854, 0.0066005107), Sample_size_alzheimer = c(16940L, 
    16940L, 16940L, 16940L, 16940L, 16940L), mean_other = c(-0.355721986, 
    -0.3934466529, -0.3391313067, -0.2490772834, -0.2482841254, 
    -0.3119203366), Stder_other = c(0.0594056892, 0.0696467566, 
    0.0618351559, 0.0538088139, 0.0498136972, 0.0585087673), 
    sample_size_other = c(256L, 256L, 256L, 256L, 256L, 256L), 
    P_value = c(1.17158668837528e-07, 2.47600854952653e-07, 1.13229142817565e-06, 
    0.0008543643, 0.0001136282, 1.82385100638758e-07), age1 = 1:6), .Names = c("mean_alzheimer", 
"stder_alzheimer", "Sample_size_alzheimer", "mean_other", "Stder_other", 
"sample_size_other", "P_value", "age1"), row.names = c(NA, 6L
), class = "data.frame")

person Ubuntu_Wen    schedule 28.06.2013    source источник
comment
Можете ли вы привести минимальный воспроизводимый пример? похоже, что легенда не отображается, потому что у вас установлен цвет за пределами aes. трудно дать точный ответ, не видя формат ваших данных   -  person Jake Burkhead    schedule 28.06.2013
comment
вы не сопоставили цвет с aes(), поэтому ggplot2 не создаст легенду. Идея заключалась бы в том, чтобы преобразовать ваши данные в длинный формат, сопоставить цвет с переменной и иметь только два слоя (один из точек, другой со сглаживанием).   -  person baptiste    schedule 28.06.2013
comment
Я пытаюсь загрузить изображение, но у меня недостаточно репутации, чтобы сделать это. Извиняюсь.   -  person Ubuntu_Wen    schedule 28.06.2013
comment
Если бы ваш пример можно было воспроизвести, мы могли бы создать график и загрузить его для вас.   -  person joran    schedule 28.06.2013
comment
картинка не нужна. просто посмотрите на данные. похоже, у вас есть 2 data.frames, 1 для болезни Альцгеймера и 1 для других. Эти два data.frames должны быть объединены (rbind) с добавлением другой переменной, чтобы различать, связаны ли они с болезнью Альцгеймера или с чем-то другим. затем вы можете расплавить данные, если это необходимо, и сделать все графики в 1 слое с помощью кода, похожего на ggplot() + geom_point(data = data, aes(x = age1, y = mean, color = has_alzheimers)). это не должно быть построено с двумя слоями, так как это одна из причин, почему ggplot такой мощный   -  person Jake Burkhead    schedule 28.06.2013
comment
K, я обновляю data.frame   -  person Ubuntu_Wen    schedule 28.06.2013
comment
обратите внимание, что вы определяете руководство fill, а не colour   -  person baptiste    schedule 28.06.2013
comment
пожалуйста, dput(head(human)) чтобы мы могли легко загрузить данные. я бы расплавил данные, т.е. что-то вроде melted = reshape:::melt(human[c("mean_alzheimers", "mean_other", "age1")], id.vars = "age1"), а затем построил бы все это за один раз с помощью aes (x = age1, y = значение, цвет = переменная)   -  person Jake Burkhead    schedule 28.06.2013


Ответы (1)


library(ggplot2)
library(reshape)

melted <- melt(human[c("age1", "mean_alzheimer", "mean_other")], id.vars = "age1")

p <- ggplot(data = melted, aes(x = age1, y = value, colour = variable)) + geom_point() + geom_smooth(method = "loess")

Затем добавьте параметры для управления цветом, текстом и т. д. по мере необходимости.

person Jake Burkhead    schedule 28.06.2013