59

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

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

  1. x 軸と y 軸で同じスケール。
  2. x 軸と y 軸の長さが等しい。
4

5 に答える 5

66

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

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

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

于 2012-11-19T01:18:20.623 に答える
64

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

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

ここに画像の説明を入力

于 2016-03-10T09:29:20.887 に答える
7

おそらく、今日目にするコードの中で最も醜いコードですが、うまく機能します。

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))
于 2016-01-28T22:55:38.123 に答える
4

以前の回答で提供されたすべてのソリューションは、私の R バージョン (R バージョン 3.6.1) では機能しません。

ggplot_build(pot)$panel$ranges[[1]]$x.range # return NULL value

リンクされた URLで @Gerhard Burger によって言及されたソリューションは、私の場合に機能します。

r<-max(abs(layer_scales(plt)$x$range$range))
s<-max(abs(layer_scales(plt)$y$range$range))
t<-round(max(r,s),1)
plt<-plt+coord_equal(xlim=c(0,t),ylim=c(0,t))
于 2019-11-07T14:31:21.300 に答える
1

Ramonsの回答に基づいて構築すると、この関数は私にとってうまく機能し、関数定義を非表示にできるため、醜いとは思いません...

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 のコードを関数でラップするだけではうまくいきませんでした。

于 2016-10-26T12:01:08.640 に答える