2014-02-11 3 views
0

Я сопоставляю два фактора с аргументом color в ggplot и хочу удалить его из легенды.Удаление фактора из легенды цвета ggplot, когда указано несколько.

У меня эти данные.

Data <- structure(list(StudyArea = c("AAA", "BBB", "CCC", "AAA", "BBB", 
"CCC", "AAA", "BBB", "CCC"), Obs = c(190L, 481L, 219L, 190L, 
481L, 219L, 190L, 481L, 219L), InSituPred = c(180, 462, 199, 
180, 462, 199, 180, 462, 199), InSituSE = c(9.57382456553708, 
16.5306359391421, 9.51070020039693, 9.57382456553708, 16.5306359391421, 
9.51070020039693, 9.57382456553708, 16.5306359391421, 9.51070020039693 
), variable = c("ExSituAAA", "ExSituAAA", "ExSituAAA", "ExSituBBB", 
"ExSituBBB", "ExSituBBB", "ExSituCCC", "ExSituCCC", "ExSituCCC" 
), value = c(NA, 500, 172, 156, NA, 161, 200, 562, NA), SE = c(20.8552264204181, 
16.1382421185167, 21.43693858142, 20.8552264204181, 16.1382421185167, 
21.43693858142, 20.8552264204181, 16.1382421185167, 21.43693858142 
)), .Names = c("StudyArea", "Obs", "InSituPred", "InSituSE", 
"variable", "value", "SE"), row.names = c(NA, -9L), class = "data.frame") 

И используя приведенный ниже код, можете сделать график ниже.

ggplot(Data)+ 
    geom_point(aes(x=StudyArea, y=value, color=variable),size=3, shape=1)+ 
    geom_errorbar(aes(x=StudyArea, ymin=value-SE, ymax=value+SE, color=variable),lty = 2, cex=0.75)+ 
    geom_point(aes(x=StudyArea, y=InSituPred, color=StudyArea),size=3, shape=1)+ 
    geom_errorbar(aes(x=StudyArea, ymin=InSituPred-InSituSE, ymax=InSituPred+InSituSE, color=StudyArea),lty=1,cex=0.75)+ 
    geom_point(aes(x=StudyArea, y=Obs, color=StudyArea),shape="*",size=12) 

Fig

Я хочу, чтобы удалить StudyArea цвета из легенды (AAA: CCC) так, что он содержит только ExSituAAA, ExSituBBB, ExSituCCC.

ADDITION Используя приведенный ниже код (с полезными комментариями от @shadow), я могу создать рисунок ниже.

p <- ggplot(Data, aes(x=StudyArea))+ 
    geom_point(aes(y=value, color=variable),size=3, shape=1)+ 
    geom_errorbar(aes(ymin=value-SE, ymax=value+SE, color=variable),lty = 2, cex=0.75)+ 
    geom_point(aes(y=InSituPred, color=StudyArea),size=3, shape=1)+ 
    geom_errorbar(aes(ymin=InSituPred-InSituSE, ymax=InSituPred+InSituSE, color=StudyArea),lty=1,cex=0.75)+ 
    geom_point(aes(y=Obs, color=StudyArea),shape="*",size=12) + 
    scale_color_discrete(breaks=c("ExSituAAA", "ExSituBBB", "ExSituCCC")) 

p + scale_color_manual(name="Study Area \nPrediction", 
         values=c("red", "blue", "darkgreen","red","blue","darkgreen"), 
         breaks=c("ExSituAAA", "ExSituBBB", "ExSituCCC")) 

FigureII

Я хочу добавить linetype легенду, указывающей сплошную линию = монолитную и пунктирную линию = ExSitu.

Я уточнил linetype вручную (а не через фактор aes) с использованием lty, потому что мне нужно также указать color. Глядя ниже head, то данные $ SE является lty = 2, а данные $ InSituSE является lty 1.

>

head(Data) 
    StudyArea Obs InSituPred InSituSE variable value  SE 
1  AAA 190  180 9.573825 ExSituAAA NA 20.85523 
2  BBB 481  462 16.530636 ExSituAAA 500 16.13824 
3  CCC 219  199 9.510700 ExSituAAA 172 21.43694 
4  AAA 190  180 9.573825 ExSituBBB 156 20.85523 
5  BBB 481  462 16.530636 ExSituBBB NA 16.13824 
6  CCC 219  199 9.510700 ExSituBBB 161 21.43694 

Таким образом, любые предложения о том, как добавить linetype легенду с твердым line = InSitu и пунктирная линия = ExSitu.

Пример: Я хочу добавить ...

figIII

Спасибо заранее.

+1

Непосредственный ответ на ваш вопрос и, возможно, вопрос вкуса, во всяком случае, вот мысль: для меня кажется немного излишним отображать область исследования _both_ в x и цвет. Возможно, идея заключалась бы в использовании цвета только для того, чтобы различать In- и Ex-situ? – Henrik

+0

@Henrik, мне нужно, чтобы «цвет» 'InSituPred' и' Obs' соответствовал 'StudyArea.'. Кроме того, я хотел иметь соответствие' '' '' color' '' StudyArea.' У меня есть добавили еще несколько дополнений к вопросам, которые предоставляют больше специфики и строят из комментариев @shadow. спасибо за ваши мысли. –

ответ

2

Вы можете использовать ?scale_color_discrete, чтобы уточнить перерывы. В вашем случае это может быть примерно следующим:

ggplot(Data, aes(x=StudyArea))+ 
    geom_point(aes(y=value, color=variable),size=3, shape=1)+ 
    geom_errorbar(aes(ymin=value-SE, ymax=value+SE, color=variable),lty = 2, cex=0.75)+ 
    geom_point(aes(y=InSituPred, color=StudyArea),size=3, shape=1)+ 
    geom_errorbar(aes(ymin=InSituPred-InSituSE, ymax=InSituPred+InSituSE, color=StudyArea),lty=1,cex=0.75)+ 
    geom_point(aes(y=Obs, color=StudyArea),shape="*",size=12) + 
    scale_color_discrete(breaks=c("ExSituAAA", "ExSituBBB", "ExSituCCC")) 

EDIT: Да, можно указать цвета. Поскольку я действительно не понимаю, какую схему раскраски вам нужно, вот несколько примеров (не все они подразумеваются полностью серьезно).

p <- ggplot(Data, aes(x=StudyArea))+ 
    geom_point(aes(y=value, color=variable),size=3, shape=1)+ 
    geom_errorbar(aes(ymin=value-SE, ymax=value+SE, color=variable),lty = 2, cex=0.75)+ 
    geom_point(aes(y=InSituPred, color=StudyArea),size=3, shape=1)+ 
    geom_errorbar(aes(ymin=InSituPred-InSituSE, ymax=InSituPred+InSituSE, color=StudyArea),lty=1,cex=0.75)+ 
    geom_point(aes(y=Obs, color=StudyArea),shape="*",size=12) 
p + scale_color_manual(name="Study Area \nPrediction", 
         values=c("red", "blue", "darkgreen","red","blue","darkgreen"), 
         breaks=c("ExSituAAA", "ExSituBBB", "ExSituCCC")) 
p + scale_color_manual(name="Study Area \nPrediction", 
         values=c("black", "black", "black", "red","blue","darkgreen"), 
         breaks=c("ExSituAAA", "ExSituBBB", "ExSituCCC")) 
p + scale_color_manual(name="Study Area \nPrediction", 
         values=c("white", "yellow", "pink", "red","blue","darkgreen"), 
         breaks=c("ExSituAAA", "ExSituBBB", "ExSituCCC")) 

ДОПОЛНИТЕЛЬНО: это будет намного проще, если вы очистите и перестройте свои данные перед нанесением графика. Вот мой attampt:

df <- with(Data, data.frame(area=rep(StudyArea, 2), 
          exarea=c(variable,rep(variable[c(1,4,7)], 3)), 
          value=c(value, InSituPred), 
          se=c(SE, InSituSE), 
          obs = rep(Obs, 2), 
          situ=rep(c("in", "ex"), each=nrow(Data)))) 
df <- df[!duplicated(df),] 

Тогда зарисовки становится намного проще:

p <- ggplot(df, aes(x=area))+ 
    geom_point(aes(y=value, color=exarea),size=3, shape=1)+ 
    geom_errorbar(aes(ymin=value-se, ymax=value+se, color=exarea, lty=situ), cex=0.75)+     
    geom_point(aes(y=obs, color=exarea),shape="*",size=12) 

p + scale_color_manual(name="Study Area \nPrediction", 
        values=c("red", "blue", "darkgreen"), 
        breaks=c("ExSituAAA", "ExSituBBB", "ExSituCCC")) + 
    scale_linetype_manual(name="Situ", 
         values=c(1,2), 
         breaks=c("in", "ex"), 
         labels=c("InSitu", "ExSitu")) 

EDIT2: Можно использовать исходные данные для этого.Вы должны положить lty внутри функции aes, а затем использовать scale_linetype_manual, как и раньше. Вот оно:

p <- ggplot(Data, aes(x=StudyArea))+ 
    geom_point(aes(y=value, color=variable),size=3, shape=1)+ 
    geom_errorbar(aes(ymin=value-SE, ymax=value+SE, color=variable, lty="2"), cex=0.75)+ 
    geom_point(aes(y=InSituPred, color=StudyArea),size=3, shape=1)+ 
    geom_errorbar(aes(ymin=InSituPred-InSituSE, ymax=InSituPred+InSituSE, color=StudyArea, lty="1"),cex=0.75)+ 
    geom_point(aes(y=Obs, color=StudyArea),shape="*",size=12) 
p + scale_color_manual(name="Study Area \nPrediction", 
         values=c("red", "blue", "darkgreen","red","blue","darkgreen"), 
         breaks=c("ExSituAAA", "ExSituBBB", "ExSituCCC")) + 
    scale_linetype_manual(name="Situ", 
         values=c(1,2), 
         breaks=c("1", "2"), 
         labels=c("InSitu", "ExSitu")) 

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

+0

@shodow, спасибо за ответ. Как только я использую scale_color_discrete(), можно ли также указать используемые цвета? Я хочу, чтобы EsSituAAA: ExSituBBB был 'c (« красный »,« синий »,« темный »). Однако просто добавление кода ниже приводит к ошибке, поскольку для цвета есть две спецификации. 'scale_color_manual (values ​​= c (" red "," blue "," darkgreen "), labs (fill =" StudyArea \ n Prediction "))' –

+0

Я добавил ** ДОБАВЛЕНИЕ ** выше, но также может открыть новый вопрос ... Спасибо за продолжение! –

+0

Спасибо! Ваша реструктуризация очень полезна. Однако для приложения к другому набору данных, который у меня есть, ручное добавление 'linetype' немного более прямолинейно. Можно ли добавить «тип линии» вручную, как в примере выше? –

Смежные вопросы