2017-02-08 30 views
5

ggplot2では、coord_fixed()の座標系により、データのアスペクト比が所定の値に維持されます。したがって、パネルの形状が変化してデータの形状が維持されます。一方、coord_flip()は、プロットの軸を入れ替えます。しかし、ggplot2のプロットは正確に1つの座標系を持たなければならないので、これらの関数を組み合わせることはできません。ggplot2:軸を反転してデータの縦横比を維持する

私の質問は:

は、x軸とy軸交換とデータの一定のアスペクト比と座標系で得られた、coord_fixed()coord_flip()の行動を結合する方法が存在していますか?

これは人気の質問、しかし、一般的な答えが間違っています:一般的に提案答えはtheme(aspect.ratio = 1)の代わりcoord_fixed()と一緒coord_flip()を使用することです

。しかし、ggplot2のドキュメントに従って、この設定は「パネルの縦横比」を参照します。したがって、データは形状を変えてパネルの形状を維持する。

これはggplot2には現在存在しない機能と思われます。しかし、もっと重要なのは、この問題に対する正しい解答または少なくとも回答が文書化されるべきだと思います。

問題のクイック最小限例:

library(ggplot2) 
x <- 1:100; data <- data.frame(x = x, y = x * 2) 
p <- ggplot(data, aes(x, y)) + geom_point() 

p # by default panel and data both fit to device window 
p + coord_fixed() # panel changes shape to maintain shape of data 
p + theme(aspect.ratio = 1) # data changes shape to maintain shape of panel 
p + coord_fixed() + coord_flip() # coord_flip() overwrites coord_fixed() 

# popular suggested answer does not maintain aspect ratio of data: 
p + coord_flip() + theme(aspect.ratio = 1) 

答えて

3

私はtheme解決策が本当に適切なものではないことに同意するものとします。ここでは、プロットオブジェクトに格納されている実際の軸の範囲から側面を算出することで、プログラムで動作しない解決策があるが、それは数行のコード取る:私はおそらく使用するソリューション

ranges <- ggplot_build(p)$layout$panel_ranges[[1]][c('x.range', 'y.range')] 
sizes <- sapply(ranges, diff) 
aspect <- sizes[1]/sizes[2] 

p + coord_flip() + theme(aspect.ratio = aspect) 

enter image description here

を実際には、ggstanceパッケージの水平幾何学を使用することです(これは必ずしも実現可能ではないかもしれませんが)。

注:これは、等しい倍率(等倍)のextend引数(つまり、デフォルト)の正確な正解のみを返します。

+0

乾杯、私は解決策が現在存在する最高だと思う。 (しかし、最初の文章では、 'テーマ'解決策は間違っていて、必要な資格はありません。私は空間データを見ていて、データが真の形で表示されているかどうかを知ることが重要です。 – mb7744

+0

@ mb7744私は、何人かの人(確かにすべてではないが)にとって、元の解決策は大丈夫であるという事実を単に言及していました。私はあなたに同意していません(これが私が質問に答えた理由です)。 – Axeman

+0

確かに---しかし、私が得ているのは、その違いに気付かず、プロットを誤解している人にとってはうまくいくかもしれないということです。私は、これがSOのこれに関する最後の2つの質問に誤った受け入れられた答えを持っている理由だと思います。しかし、これはちょうど私がニックピッキングしている。私はあなたのソリューションに感謝します! – mb7744

関連する問題