ggplotでアスペクト比を修正するにはどうすればよいですか?


88

ドキュメントに合わせてプロットのサイズを変更しようとしていますが、プロットされた図を正方形にするのに問題があります。

例:

pdf(file = "./out.pdf", width = 5, height = 5)
p <- ggplot(mydata, aes(x = col1, y = col2))
print(p)
aux <- dev.off()

xとyの制限は同じですが、結果のプロットは正方形ではありません。Rは囲んでいるパネルを5x5 "にしていると思いますが、実際の図のサイズは気にしません。

ダイアグラムを押しつぶすにはどうすればよいですか?

回答:


113

ではggplot、あなたのプロットの縦横比を維持するための機構を追加することであるcoord_fixed()プロットにレイヤーを。これにより、実際の境界ボックスの形状に関係なく、プロット自体のアスペクト比が保持されます。

(またggsavepdf(); print(p); dev.off()シーケンスではなく、結果のプロットをpdf / png / etcに保存するために使用することをお勧めします。)

library(ggplot2)
df <- data.frame(
    x = runif(100, 0, 5),
    y = runif(100, 0, 5))

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

ここに画像の説明を入力してください


3
ggplotがy軸ラベルを左に配置することを主張する理由を知っていますか?私は...それを防ぐために方法を知ってみたい
チェイス

@chase厄介な回避策はhjust、タイトルの位置を変更することです-試してみてくださいopts(axis.title.y=theme_text(hjust=10))。しかし、悲しいことに、そうではないようです。ggplotメーリングリストのディスカッションと@Baptisteの回答については、groups.google.com / group / ggplot2 / browser_thread / thread /…を参照してください。
アンドリー2011

3
この動作は開発バージョンで修正されています。
ハドリー2011

5
質問のより一般的なタイトルで、両方の軸で同じ制限を使用していない場合に、比率(coord_fixedの引数)を計算する方法に関する情報を追加することもできますか?
htorque 2011

1
@htorqueのコメントに加えて; yが代わりにとして定義されているy=runif(100, 0, 50)場合、プロットのアスペクトはもはや正方形ではありません。coord_fixed()各軸のスケールが等しくなるのは、見た目だけですか?
別のベン

79

正方形などの特定のアスペクト比を確保するには、を使用しますtheme(aspect.ratio=1)

アンドリーの答えは全体像を示していません。この例では、xの範囲がyの範囲に等しい不自然なデータが提供されている可能性があります。ただし、データが次の場合:

df <- data.frame(
  x = runif(100, 0, 50),
  y = runif(100, 0, 5))
ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

その場合、プロットは次のようになります。

ここに画像の説明を入力してください

coord_fixed()関数には、軸の比率を調整するための引数もあります。

ratio y / xで表されるアスペクト比

プロットを次のように正方形にすることができます。

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed(ratio=10)

ここに画像の説明を入力してください

ただし、変数またはプロット領域の制限でこれを調整する必要があります(これらの例のように、すべての制限が整数でうまく分割できるわけではありません)。


11

完全を期すために:非常に異なる軸制限を考慮に入れたい場合:

df <- data.frame(
  x = runif(100, 0, 5000),
  y = runif(100, 0, 5))
ratio.display <- 4/3
ratio.values <- (max(df$x)-min(df$x))/(max(df$y)-min(df$y))
plot <- ggplot(df, aes(x=x, y=y)) + geom_point()
plot + coord_fixed(ratio.values / ratio.display)

その結果:


14
それはどのように優れていplot + theme(aspect.ratio=4/3)ますか?ggplotには複数のレイヤーがあり、複数のデータセットがあり、軸には任意の拡張係数がある場合があるため、1つのデータソースからy / xの比率を計算するのは非常に脆弱に思えます。
バティスト

2
これは明らかに簡単に発見できないためです。これは、ここに3つの答えがあるという事実によって証明されていますが、誰もそれについて言及していません。あなたはそれを答えに入れるべきです、それは間違いなくより良い解決策です。
Graipher 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.