ggplot2 で、軸ラベルの重なりを防ぐ方法
自分が忘れてたので、使い方と感動を忘れないために。
たまたまggplot2 のバージョンが更新されたのを見て、何が変わったのか見てみたら、すごく感動する仕様になっていた。
その一つが、軸ラベルの重なりを防ぐ方法である。
Test data を作成し、ggplotでプロットしてみる
test <- data.frame(x=c(rep('whole genome seq', 4), rep('whole metagenome seq', 4), rep('whole genome shotgun seq', 4), rep('whole metagenome shotgun seq', 4) ), value=rnorm(4*4)) gg <- ggplot(test)+ geom_jitter(aes(x=x, y=value), width=0.2) + geom_boxplot(aes(x=x, y=value), width=0.5) plot(gg)
見てわかる通り、x軸の名前がわからない。
これを防ぐために、scale_x_discrete(guide = guide_axis(n.dodge = 2)) を追加する。
test <- data.frame(x=c(rep('whole genome seq', 4), rep('whole metagenome seq', 4), rep('whole genome shotgun seq', 4), rep('whole metagenome shotgun seq', 4) ), value=rnorm(4*4)) gg <- ggplot(test)+ geom_jitter(aes(x=x, y=value), width=0.2) + geom_boxplot(aes(x=x, y=value), width=0.5)+ scale_x_discrete(guide = guide_axis(n.dodge = 2)) plot(gg)
scale_x_discrete(guide = guide_axis(n.dodge = 2)) を追加することで、重なったラベルを縦にずらすことが可能となった。
また、よく使われる方法としては、軸の角度を変えたり、そもそも字の大きさを小さくする方法がある。
・軸ラベルの角度を変える
gg <- ggplot(test)+ geom_jitter(aes(x=x, y=value), width=0.2) + geom_boxplot(aes(x=x, y=value), width=0.5)+ theme(axis.text.x = element_text(angle=60, vjust=1, hjust=1)) plot(gg)
さらに思いつくのは、少々めんどくさいが、ラベルを改行する方法である。
やり方は、正規表現の改行を意味する \n を、名前にはさんでやる。
・軸ラベルを改行する
test <- data.frame(x=c(rep('whole\ngenome\nseq', 4), rep('whole\nmetagenome\nseq', 4), rep('whole\ngenome\nshotgun\nseq', 4), rep('whole metagenome\nshotgun\nseq', 4) ), value=rnorm(4*4)) # または、gsub 関数で列単位で処理。今回は、スペースを \n に置き換えた。 #test <- data.frame(x=c(rep('whole genome seq', 4), rep('whole metagenome seq', 4), rep('whole genome #shotgun seq', 4), rep('whole metagenome shotgun seq', 4) ), # value=rnorm(4*4)) # # test[,'x'] <- gsub(' ', '\n', test[,'x']) gg <- ggplot(test)+ geom_jitter(aes(x=x, y=value), width=0.2) + geom_boxplot(aes(x=x, y=value), width=0.5) plot(gg)
以上、軸ラベルの重なりを防ぐ方法を紹介した。
軸ラベルを斜めにすると場所を取るので、ずらして表示することができるようになって、すごく感動した。
ただし、今日のように、軸ラベルが長すぎるとプロット枠の外に出てしまうので、余白を設定する必要があるのかもしれない。
そういう点では、どれか一つの方法にこだわらずに、いくつかをラベルずらしと改行を組み合わせてやるなどをしてもいいのかもしれない。