2016-08-18 5 views
1

のグリッドに共通のxとyのラベルを追加する方法を、私はcutの4つのレベル(FairGoodVery GoodPremimum)のためcaratpriceをプロットしたいです。ggplotは:<code>diamonds</code>を使用してプロット

facet_wrap()が軸のブレークを制御する代わりに、軸のブレークを制御するために4つのプロットを作成しました。

library(ggplot2) 
library(egg) 
library(grid) 
f1 <- 
ggplot(diamonds[diamonds$cut=="Fair",], aes(carat, price))+ 
    geom_point()+ 
    facet_wrap(~cut, ncol =2)+ 
    scale_x_continuous(limits = c(0,4), breaks=c(0, 1, 2, 3, 4))+ 
    scale_y_continuous(limits = c(0,10000), breaks=c(0, 2500, 5000, 7500, 10000))+ 
    labs(x=expression(" "), 
     y=expression(" ")) 


f2 <- 
ggplot(diamonds[diamonds$cut=="Good",], aes(carat, price))+ 
    geom_point()+ 
    facet_wrap(~cut, ncol =2)+ 
    scale_y_continuous(limits = c(0,5000), breaks=c(0, 1000, 2000, 3000, 4000, 5000))+ 
    labs(x=expression(" "), 
     y=expression(" ")) 


f3 <- 
    ggplot(diamonds[diamonds$cut=="Very Good",], aes(carat, price))+ 
    geom_point()+ 
    facet_wrap(~cut, ncol =2)+ 
    scale_x_continuous(limits = c(0,1), breaks=c(0, 0.2, 0.4, 0.6, 0.8, 1))+ 
    scale_y_continuous(limits = c(0,1000), breaks=c(0, 200, 400, 600, 800, 1000))+ 
    labs(x=expression(" "), 
     y=expression(" ")) 

f4 <- 
    ggplot(diamonds[diamonds$cut=="Premium",], aes(carat, price))+ 
    geom_point()+ 
    facet_wrap(~cut, ncol =2)+ 
    scale_x_continuous(limits = c(0,1.5), breaks=c(0, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4))+ 
    scale_y_continuous(limits = c(0, 3000), breaks=c(0, 500, 1000, 1500, 2000, 2500, 3000))+ 
    labs(x=expression(" "), 
     y=expression(" ")) 

fin_fig <- ggarrange(f1, f2, f3, f4, ncol =2) 
fin_fig 

RESULT

各プロットはすべての面、x軸とy軸で

enter image description here

QUESTION

異なるyの値の範囲を有します 同じだ。唯一の違いは、最小、最大、およびブレークです。この図にxとyのラベルを追加したいと思います。私はどのような単語の文書や画像エディタでもこれを手動で行うことができます。とにかくRでそれを直接行うことはありますか?

+1

グリッド 'で:: textGrob'と' ggplot2顔をしている:: annotation_custom' – shayaa

+1

あなたは 'left'と' bottom'引数を持ち 'gridExtra'を、使用することができます。 : 'p < - ggplot(); G < - gridExtra :: arrangeGrob(P、P、P、P、のNcoI = 2、ボトム=グリッド:: textGrob( "底ラボ")、=左グリッド:: textGrob( "左ラボ"、腐敗= 90)) ;グリッド:: grid.newpage(); grid :: grid.draw(g) ' – user20650

答えて

4

(@ user20650により示唆されるように)gridExtraパッケージから機能を使用するだけで、あなたもcutのレベルによってdiamondsデータフレームを分割し、mapplyを使用して以下のコードを使用してプロットを作成することができます。

以下の回答には、コメントのフォローアップの質問に対する解決方法も含まれています。 4つのプロットをレイアウトし、すべてのプロットに適用される単一のxとyラベル(太字と色とサイズを制御することを含む)を追加し、プロットごとに個別の凡例ではなく単一の凡例を取得する方法を示します。 cut"Ideal"ある

library(ggplot2) 
library(gridExtra) 
library(grid) 
library(scales) 

行を削除:

dat = diamonds[diamonds$cut != "Ideal",] 
dat$cut = droplevels(dat$cut) 

は、4つのプロット、リスト内の残りの各cutのレベルおよびストアのいずれかを作成します。我々はcutの各レベルの個別のデータフレームとカスタムymax値のベクトルの両方を提供することができるように、(lapplyの代わりに)を使用して、プロットごとにy軸上で最高の値を設定します。我々はまた、色の凡例を作成するためにcolor=clarityを追加します。

pl = mapply(FUN = function(df, ymax) { 
    ggplot(df, aes(carat, price, color=clarity))+ 
    geom_point()+ 
    facet_wrap(~cut, ncol=2)+ 
    scale_x_continuous(limits = c(0,4), breaks=0:4)+ 
    scale_y_continuous(limits = c(0, ymax), labels=dollar_format()) + 
    labs(x=expression(" "), 
     y=expression(" ")) 
}, df=split(dat, dat$cut), ymax=c(1e4,5e3,1e3,3e3), SIMPLIFY=FALSE) 

さて、私たちは4つのプロットを持っているが、それぞれが独自の伝説を持っています。だから今私たちは全体の凡例を1つしか持たないようにしたいと思っています。これを行うには、伝説の1つを別のgrob(gr aphical object)に抽出し、4つのプロットから凡例を削除します。

は小さなヘルパー関数を使用して別のグロブとして伝説を抽出します。

# Function to extract legend 
# https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs 
g_legend<-function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    return(legend) } 

# Extract legend as a grob 
leg = g_legend(pl[[1]]) 

を今、私たちは、2x2のグリッドの4つのプロットを手配し、このグリッドの右に凡例を配置する必要があります。 arrangeGrobを使用してプロットをレイアウトします(レンダリングする前に各プロットから凡例を削除するにはlapplyをどのように使用するか注意してください)。これは本質的にそのarrangeGrobがそれを描画せずに2x2のプロットグリッドオブジェクトを作成除き、我々は、この答えの以前のバージョンでgrid.arrangeでやったことと同じです。次に、2x2プロットグリッドの横にある伝説を、grid.arrangeの中にすべて包み込むことでレイアウトします。 widths=c(9,1)は、プロットの2x2グリッドに水平スペースの90%を割り当て、凡例に10%を割り当てます。すごい!

grid.arrange(
    arrangeGrob(grobs=lapply(pl, function(p) p + guides(colour=FALSE)), ncol=2, 
       bottom=textGrob("Carat", gp=gpar(fontface="bold", col="red", fontsize=15)), 
       left=textGrob("Price", gp=gpar(fontface="bold", col="blue", fontsize=15), rot=90)), 
    leg, 
    widths=c(9,1) 
) 

enter image description here

+0

あなたの時間と助けてくれてありがとう。私が "less code"を使うことができなかった理由を見るために、アップデートをチェックしてください。すべて4つの異なるプロットを作っていました。なぜなら、すべてがyとxの値の範囲が異なるからです。しかし、それらは同じ単位を持っています。 – aelwan

+1

更新を参照してください。私は 'mapply'に変更したので、各プロットごとにy軸の上端を設定する引数を含めることができます。 – eipi10

+0

あなたの時間と助けてくれてありがとう。 ラベルのサイズと顔(太字)を変更するにはどうすればよいですか? – aelwan

関連する問題