2012-01-16 10 views
1

私は をforループ内で実行するggplot呼び出しで線種の設定を自動化しようとしています。データにはvar2変数に約20個の値があり、これは Eurostoxx(インデックス)と他の値を一度にグラフ化することによってループします。ggplot in r:自動的に線種を設定する

 Date value    var1     var2 

     2011-09-30 20.67 Return on Equity    Eurostoxx 

Iを各グラフに実線でEurostoxxしたいと思う(それがスイッチするとき、それは読者に 紛らわしい):

は、ここで最初の行です。

私は手動で線種を設定する方法を知っている:

gp<- gp + scale_linetype_manual("",values=c("Eurostoxx"="dotted","Automobiles and Parts"="solid")) 

が、data.frameでエラー

エラー(スケールの$ output_breaksにこの

secnam<-unique(g$var2)[!unique(g$var2)%in%"Eurostoxx"] 
secnam 

#"Automobiles and Parts" 

gp<- gp + scale_linetype_manual("",values=c("Eurostoxx"="dotted",secnam="solid")) 

の実行を自動化する私の試みを()、I(scale $ labels())): 行名に欠損値が含まれています

以下のコードは問題を再現します。

gfull<-structure(list(Date = structure(c(15247, 15278, 15308, 15338, 
15247, 15278, 15308, 15338, 15247, 15278, 15308, 15338, 15247, 
15278, 15308, 15338, 15247, 15278, 15308, 15338, 15247, 15278, 
15308, 15338), class = "Date"), value = c(20.67, 19.81, 19.81, 
19.92, 1.2966, 1.4054, 1.3744, 1.3828, 16.36, 16.58, 16.86, 16.7, 
0.8263, 0.9167, 0.8642, 0.8197, 13.32, 12.82, 12.59, 12.55, 1.1672, 
1.1721, 1.1643, 1.1509), var1 = c("Return on Equity", "Return on Equity", 
"Return on Equity", "Return on Equity", "Price to Book", "Price to Book", 
"Price to Book", "Price to Book", "Return on Equity", "Return on Equity", 
"Return on Equity", "Return on Equity", "Price to Book", "Price to Book", 
"Price to Book", "Price to Book", "Return on Equity", "Return on Equity", 
"Return on Equity", "Return on Equity", "Price to Book", "Price to Book", 
"Price to Book", "Price to Book"), var2 = c("Eurostoxx", "Eurostoxx", 
"Eurostoxx", "Eurostoxx", "Eurostoxx", "Eurostoxx", "Eurostoxx", 
"Eurostoxx", "Automobiles and Parts", "Automobiles and Parts", 
"Automobiles and Parts", "Automobiles and Parts", "Automobiles and Parts", 
"Automobiles and Parts", "Automobiles and Parts", "Automobiles and Parts", 
"Utilities", "Utilities", "Utilities", "Utilities", "Utilities", 
"Utilities", "Utilities", "Utilities")), .Names = c("Date", "value", 
"var1", "var2"), row.names = c(71L, 72L, 73L, 74L, 4511L, 4512L, 
4513L, 4514L, 145L, 146L, 147L, 148L, 4585L, 4586L, 4587L, 4588L, 
1477L, 1478L, 1479L, 1480L, 5917L, 5918L, 5919L, 5920L), class = "data.frame") 

コード:

g<-gfull 
g<-subset(gfull, var2 %in% c("Eurostoxx","Automobiles and Parts")) 

    gp <- ggplot(g, aes(Date, value,group=var2,lty=var2)) 
    gp <-gp + facet_grid(var1~., scales="free") 
    gp<- gp + geom_line() 

#EUROSTOXX is dotted 

g<-gfull 
g<-subset(g,var2%in%c("Eurostoxx","Utilities")) 
    gp <- ggplot(g, aes(Date, value,group=var2,lty=var2)) 
    gp <-gp + facet_grid(var1~., scales="free") 
    gp<- gp + geom_line() 

#EUROSTOXX is solid 

    secnam<-unique(g$var2)[!unique(g$var2)%in%"Eurostoxx"] 
    gp<- gp + scale_linetype_manual("",values=c("Eurostoxx"="dotted",secnam="solid")) 
    gp 

    #Error in data.frame(scale$output_breaks(), I(scale$labels())) : 
    #row names contain missing values 
+0

コードチャンクを使用してコードをフォーマットできますか? –

+0

'data.frame'に必要な線種の値を含む新しい変数を作成し、' scale_linetype_identity'(未テスト)を使用することができます。 – baptiste

+0

コメントをいただきありがとうございます。私はこのコードチャンクを次回のために調べます。 Baptiste、あなたの提案は正しかった.Joranは以下のように語った。 – Aidan

答えて

1

があり、おそらくあなたが達成しようとしている何をして、よりエレガントな方法ですが、のは、まさにc("Eurostoxx"="dotted",secnam="solid")が何であるかを調べてみましょう、あなたの特定の問題に対処するために:

> c("Eurostoxx"="dotted",secnam="solid") 
Eurostoxx secnam 
"dotted" "solid" 

を「固体」という名前にして、secnamに名前を付けようとしましたが、Rは機能しません方法。 (少なくとも、ないevalparsesubstituteなどを使用して掘り下げるせず、それは我々が必要以上に複雑だ。)

代わりに、names機能を使用して、ちょうど線種のベクトルを作成し、直接名前を変更します:

> l <- c("dotted","solid") 
> names(l) <- c("Eurostoxx",unique(g$var2)[!unique(g$var2)%in%"Eurostoxx"]) 
> l 
Eurostoxx Utilities 
"dotted" "solid" 

と、値引数でscale_linetype_manualにベクターlを渡します。

+0

このソリューションのおかげで、私の間違いを説明する時間を取ってくれてありがとう。これは完全に動作し、私にはかなりエレガントなようです。私は優雅さは見る人の目の前にあると思います。再度、感謝します! – Aidan