2012-04-27 30 views
100

ggplot2の凡例について質問があります。私は同じグラフに3行をプロットし、使用された3色の凡例を追加したい。これは、使用されるコードggplot2ラインプロットに凡例を追加

library(ggplot2)  
require(RCurl) 

link<-getURL("https://dl.dropbox.com/s/ds5zp9jonznpuwb/dat.txt") 
datos<- read.csv(textConnection(link),header=TRUE,sep=";") 
datos$fecha <- as.POSIXct(datos[,1], format="%d/%m/%Y")  

temp = ggplot(data=datos,aes(x=fecha, y=TempMax,colour="1")) + 
      geom_line(colour="red") + opts(title="TITULO") + 
      ylab("Temperatura (C)") + xlab(" ") + 
      scale_y_continuous(limits = c(-10,40)) + 
      geom_line(aes(x=fecha, y=TempMedia,colour="2"),colour="green") + 
      geom_line(aes(x=fecha, y=TempMin,colour="2"),colour="blue") + 
      scale_colour_manual(values=c("red","green","blue")) 

temp 

と出力され

ggplot three lines

私が使用した三色や変数の名前で凡例を追加したい

(TempMax、TempMediaとTempMin) 。私は試しました

scale_colour_manual 

しかし、正確な方法を見つけることができません。

残念ながら、元のデータはリンク先から削除され、復元できませんでした。しかし、彼らは私が複数のGEOM年代に個々の色を指定していた場合、私はそれが間違ってやっていることを発見する傾向があり、この形式

"date","Tmax","Tmin","Tmed","Precip.diaria","Wmax","Wmed" 
2000-07-31 00:00:00,-1.7,-1.7,-1.7,-99.9,20.4,20.4 
2000-08-01 00:00:00,22.9,19,21.11,-99.9,6.3,2.83 
2000-08-03 00:00:00,24.8,12.3,19.23,-99.9,6.8,3.87 
2000-08-04 00:00:00,20.3,9.4,14.4,-99.9,8.3,5.29 
2000-08-08 00:00:00,25.7,14.4,19.5,-99.9,7.9,3.22 
2000-08-09 00:00:00,29.8,16.2,22.14,-99.9,8.5,3.27 
2000-08-10 00:00:00,30,17.8,23.5,-99.9,7.7,3.61 
2000-08-11 00:00:00,27.5,17,22.68,-99.9,8.8,3.85 
2000-08-12 00:00:00,24,13.3,17.32,-99.9,8.4,3.49 
+0

私は好奇心天気を伝説が(例えば異なるgeom_lineなど)プロットの要素を区切るために接続することができ、まだしています。 –

+0

3行しかない場合は、dirrectlabelsパッケージを見ることをお勧めします。 [(リンク)](http://learnr.wordpress.com/2010/01/03/directlabels-adding-direct-labels-to-ggplot2-and-lattice-plots/) –

+0

@TylerRinker私はこれまでに他の目的は今のところcsgillespieからの答えが私のためにうまくいく – pacomet

答えて

58

でメテオ・データ・ファイルから来ました。ここで私はあなたのデータをプロットします方法は次のとおりです。

##Subset the necessary columns 
dd_sub = datos[,c(20, 2,3,5)] 
##Then rearrange your data frame 
library(reshape2) 
dd = melt(dd_sub, id=c("fecha")) 

すべてのことが残っていますが、単純なggplotコマンドです:

ggplot(dd) + geom_line(aes(x=fecha, y=value, colour=variable)) + 
    scale_colour_manual(values=c("red","green","blue")) 

例プロット

enter image description here

+48

geom_lineなどの要素を別々に追加して凡例を追加する方法についてはまだ興味がありますが、これは質問の本来の目的でした。 –

136

@Etienneを行う方法を尋ねたので、これはデータを溶かすことなく(これは一般的に好ましい方法ですが、それが不可能な場合もあります)、私は以下の代替案を提示します。元のデータのサブセットを持つ

スタート:

datos <- 
structure(list(fecha = structure(c(1317452400, 1317538800, 1317625200, 
1317711600, 1317798000, 1317884400, 1317970800, 1318057200, 1318143600, 
1318230000, 1318316400, 1318402800, 1318489200, 1318575600, 1318662000, 
1318748400, 1318834800, 1318921200, 1319007600, 1319094000), class = c("POSIXct", 
"POSIXt"), tzone = ""), TempMax = c(26.58, 27.78, 27.9, 27.44, 
30.9, 30.44, 27.57, 25.71, 25.98, 26.84, 33.58, 30.7, 31.3, 27.18, 
26.58, 26.18, 25.19, 24.19, 27.65, 23.92), TempMedia = c(22.88, 
22.87, 22.41, 21.63, 22.43, 22.29, 21.89, 20.52, 19.71, 20.73, 
23.51, 23.13, 22.95, 21.95, 21.91, 20.72, 20.45, 19.42, 19.97, 
19.61), TempMin = c(19.34, 19.14, 18.34, 17.49, 16.75, 16.75, 
16.88, 16.82, 14.82, 16.01, 16.88, 17.55, 16.75, 17.22, 19.01, 
16.95, 17.55, 15.21, 14.22, 16.42)), .Names = c("fecha", "TempMax", 
"TempMedia", "TempMin"), row.names = c(NA, 20L), class = "data.frame") 

あなたがで所望の効果を得ることができます(これはまた、元のプロットコードをクリーンアップ):

ggplot(data = datos, aes(x = fecha)) + 
    geom_line(aes(y = TempMax, colour = "TempMax")) + 
    geom_line(aes(y = TempMedia, colour = "TempMedia")) + 
    geom_line(aes(y = TempMin, colour = "TempMin")) + 
    scale_colour_manual("", 
         breaks = c("TempMax", "TempMedia", "TempMin"), 
         values = c("red", "green", "blue")) + 
    xlab(" ") + 
    scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
    labs(title="TITULO") 

考えはということです各行は、colourの美的感覚を一定の文字列にマッピングすることによって色を与えられる。凡例に表示したい文字列を選択するのが最も簡単です。この場合、プロットされる変数yの名前と同じであるという事実は重要ではありません。任意の文字列のセットにすることができます。これがaesコールの内部にあることは非常に重要です。この "変数"へのマッピングを作成しています。

scale_colour_manualは、これらの文字列を適切な色にマッピングできるようになりました。結果は、いくつかの場合において enter image description here

であり、レベルと色の間のマッピングは手動スケール(これを指摘するため@DaveRGPのおかげで)の値を命名することによって明示的に行う必要がある。

ggplot(data = datos, aes(x = fecha)) + 
    geom_line(aes(y = TempMax, colour = "TempMax")) + 
    geom_line(aes(y = TempMedia, colour = "TempMedia")) + 
    geom_line(aes(y = TempMin, colour = "TempMin")) + 
    scale_colour_manual("", 
         values = c("TempMedia"="green", "TempMax"="red", 
           "TempMin"="blue")) + 
    xlab(" ") + 
    scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
    labs(title="TITULO") 

(前と同じ数字を与える)。名前付きの値を使用すると、ブレークを使用して凡例内の順序を設定し、その順序で任意の順序を使用できます。

ggplot(data = datos, aes(x = fecha)) + 
    geom_line(aes(y = TempMax, colour = "TempMax")) + 
    geom_line(aes(y = TempMedia, colour = "TempMedia")) + 
    geom_line(aes(y = TempMin, colour = "TempMin")) + 
    scale_colour_manual("", 
         breaks = c("TempMedia", "TempMax", "TempMin"), 
         values = c("TempMedia"="green", "TempMax"="red", 
           "TempMin"="blue")) + 
    xlab(" ") + 
    scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
    labs(title="TITULO") 

+0

ニース、私はしばらくの間これを行う方法が不思議でした。 – mitchus

+21

ブライアン - 似たような状況があり、あなたの答えが私を助けてくれたので、**尋ねられた質問に**答えてくれてありがとう。 – MikeTP

+2

私はこの解決策が大好きですが、限界があると思います。 'breaks'と 'values'変数のマッピング間にアルファベットのソートの問題はありますか? TempM {a} x、TempM {e} diaとTempM {i} nはきちんと並んでいますが、これを変数名に適用すると、色はアルファベット順に 'breaks'に一致するように見えます。 。これを反映/修正するために上記を明確化/改良することはできますか? – DaveRGP

関連する問題