web-dev-qa-db-ja.com

ggplot2散布図を正方形にする

xlim()およびylim()を使用して、同じxおよびyスケーリングでggplot2散布図を正方形にすることができますが、制限の手動計算が必要です。もっと便利な方法はありますか?

正方形とは、2つの要件を意味します。

  1. X軸とy軸の同じスケール。
  2. X軸とy軸の長さが等しい。
40
Ali

距離スケールポイントを同じにする場合は、 coord_fixed() を使用します。

p <- ggplot(...)
p <- p + coord_fixed() # ratio parameter defaults to 1 i.e. y / x = 1

結果のプロットが正方形であることを確認する場合は、xおよびyの制限を同じ(または少なくとも同じ範囲)に指定する必要があります。 xlimylimは両方ともcoord_fixedの引数です。したがって、これらの引数を使用して手動でこれを行うことができます。または、関数を使用してデータから制限を抽出することもできます。

50
mys

注:square shapeの場合(プロットされるデータに関係なく)、

ggplot() + theme(aspect.ratio=1)

enter image description here

35
baptiste

おそらく今日見かける最もuいコードですが、それでうまくいきます。

X軸とy軸の範囲には、ggplot_build

r<-max(abs(ggplot_build(your_plot)$panel$ranges[[1]]$x.range))
s<-max(abs(ggplot_build(your_plot)$panel$ranges[[1]]$y.range))
t<-round(max(r,s),1)
your_plot<-your_plot+coord_equal(xlim=c(-t,t),ylim=c(-t,t))
6
Ramon

Ramonsの答えに基づいて、この関数は私にとってうまく機能します。関数定義を隠すことができるため、asいものではないと思います...

squarePlot <- function(plt){
    return(plt+coord_equal()+
            expand_limits(x=ggplot_build(plt)$panel$ranges[[1]]$y.range,
                          y=ggplot_build(plt)$panel$ranges[[1]]$x.range))
}

t変数が「間違った」環境で定義されているため、Ramonのコードを関数でラップするだけではうまくいきませんでした。

1
Sven Stodtmann