1. ホーム
  2. r

[解決済み] coord_cartesianを使用して1軸のみをクリップする。

2022-02-16 14:39:55

質問

X軸の値がクリップされ、Y軸の値がクリップされないプロットを作成しようとしています。

質問です。

  1. ggplotを使用して可能ですか?
  2. どのようにコーディングするのですか?

コードです。

Z <- data.frame(X = c(1,2,3,4,5,6,7,8), 
                Y = c(0,3,2,5,5.2,2,4,3))

# plotting with not filter (just toggle clip = on/off)
ggplot(Z, aes(x=X, y=Y)) + 
   geom_line() + 
   coord_cartesian(xlim = c(0, 7), 
                   ylim = c(0, 5), 
                   clip = 'off') + 
   theme_bw() +
   scale_y_continuous(expand = c(0,0)) +
   theme(plot.margin = unit(c(0.5, 0.5, 0.5, 0.5), 'cm'))

# plotting filter
ggplot(Z[Z$X < 7, ], aes(x=X, y=Y)) + 
   geom_line() + 
   coord_cartesian(xlim = c(0, 7), ylim = c(0, 5), clip = 'off') + 
   theme_bw() +
   scale_y_continuous(expand = c(0,0)) +
   theme(plot.margin = unit(c(0.5, 0.5, 0.5, 0.5), 'cm'))

出力(X値のクリップオフ/オン/フィルタリング)。

X軸はx=6で止めたいが、Y値はプロットの枠の外まで出せるようにしたい。

フィルターをかけると、高いX値が存在するにもかかわらず、X軸が十分に伸びないのです。これは、私が coord_cartesian として、そもそも scale_x_continuousxlim は、プロット時に将来のX軸の時間をすべて無視するため、次のように、本来よりも早く行を停止します。 ここで

試行する。

Y軸の上限を少し上げると(この例では5.2)、欲しい効果が得られるのですが、実際のデータを使ってプロットすると上限が越えてしまい、変な感じになってしまいます。

y-limitを増やしたデータの実際のプロットの出力。

実際のデータをプロットするとき、この100のマークの上の余分な線は意味をなさない、なぜなら100%を超えることはないはずだからだ、それがこの回避策を避けたい理由だ。(セキュリティ上の理由から、このプロットにはデータ/プロットコードは追加されていません)

解決方法は?

このような場合、異なる動作をする coord_cartesian(xlim = ...)scale_x_continuous(limits = ...) . coords関数はソフトクリッピング、つまりデータを描画してから切り取る。一方、scales 関数はハードクリップを行い、境界からはみ出した値を削除してから描画します。スケール関数のクリッピング動作をもう少し正確に行うには、境界外 ( oob ) の引数をそのスケールに与えます。デフォルトでは、データを削除します。 squish() 関数を使用すると、最も極端な値の点だけをレンダリングすることができます。

ggplot(Z, aes(x=X, y=Y)) + 
  geom_line() + 
  coord_cartesian(ylim = c(0, 5), 
                  clip = 'off') + 
  theme_bw() +
  scale_y_continuous(expand = c(0,0)) +
  scale_x_continuous(limits = c(0, 7), expand = c(0,0), oob = scales::squish) +
  theme(plot.margin = unit(c(0.5, 0.5, 0.5, 0.5), 'cm'))