2017-04-18 11 views
3

凡例ラベルのテキスト色を、関連する塗りつぶし/線の色に合わせて取得しようとしています。理想的には、私はラベルの色を美的にマッピングしたいと思いますが、この時点では手動で色を指定するのも喜ばしいことです。ここでは、手動でラベルの色を指定するための私の試みを含んPlantGrowth内蔵のデータセットを使用して、いくつかのテストコードは次のとおりです。私はこのコードを実行するとggplot2各凡例ラベルの異なるテキストの色

ggplot(data=PlantGrowth, aes(x=group, y=weight, fill=group)) + 
    geom_boxplot() + 
    scale_fill_discrete(guide=guide_legend(label.theme=element_text(angle=0, 
                    size=9, 
                    color=c("red", 
                      "green", 
                      "blue")))) 

は伝説は、すべて私が指定した最初の色(赤)を使用してラベルを付けます。代わりに、それぞれの凡例のラベルに別の色を使用する必要があります。このタイプの操作は現在ggplot2で可能ですか?

答えて

3

最初に、現在の試行のさまざまなバージョンとを使用して試してみましたが、上のいずれも役に立たなかったため、gtableに行ってしまいました。

あなたが望むのは可能ですが、gtablegtableパッケージに精通している必要があります。ネストされたリストがたくさんあり、私たちが最終的に修正したいオブジェクトが1つの最下部にあるので、これは非常に乱雑に見えます。

library(ggplot2) 
library(gtable) 
library(grid) 
pGrob <- ggplotGrob(ggplot(data=PlantGrowth, aes(x=group, y=weight, fill=group)) + 
    geom_boxplot() + 
    scale_fill_discrete(guide=guide_legend(label.theme=element_text(angle=0, 
                    size=9)))) 



gb <- which(grepl("guide-box", pGrob$layout$name)) 
gb2 <- which(grepl("guides", pGrob$grobs[[gb]]$layout$name)) 
label_text <- which(grepl("label",pGrob$grobs[[gb]]$grobs[[gb2]]$layout$name)) 
pGrob$grobs[[gb]]$grobs[[gb2]]$grobs[label_text] <- mapply(FUN = function(x, y) {x$gp$col <- y; return(x)}, 
                  x = pGrob$grobs[[gb]]$grobs[[gb2]]$grobs[label_text], 
                  y = c("red", "green", "blue"), SIMPLIFY = FALSE) 

grid.draw(pGrob) 

enter image description here

gbgb2を作成するには、最初の3行を、そしてlabel_textはすべて動的に我々が変更すること下のレベルに到達するために設計されています:ちょうど私と一緒にクマ。オブジェクトを取得するパスを取得したら、mapplyを使用してそれらを変更し、colを目的のベクトルに変更します。

+1

偉大な答え!ありがとう。私はあなたが複数の伝説を持っていて、この変更をそのうちの1つに適用したいのであれば、gb2にどのように値を割り当てるか少し注意する必要があると思います。すべての凡例には「ガイド」の名前が付いているので、編集したいものを確認し、それに応じてgb2を設定する必要があります。それはあまり自動化されておらず、実践的な作業が必要です。 –

関連する問題