web-dev-qa-db-ja.com

geom_lineとgeom_pointの両方を同じ大きさでジッタリングする方法は?

_ggplot2_の折れ線グラフがあり、2本の線がかなり重なっています。 position_jitterdodge()を使用して見やすくしようとしていますが、同じ方法で両方のジッターを指す線と点を取得できません。ポイントとラインを水平方向にのみジッターしようとしています(y軸の変更を提案したくないため)。これがMWEです。

_## Create data frames
dimension <- factor(c("A", "B", "C", "D"))
df <- data.frame("dimension" = rep(dimension, 2),
                 "value" = c(20, 21, 34, 32,
                             20, 21, 36, 29),
                 "Time" = c(rep("First", 4), rep("Second", 4)))
## Plot it
ggplot(data = df, aes(x = dimension, y = value,
                      shape = Time, linetype = Time, group = Time)) +
    geom_line(position = position_jitterdodge(dodge.width = 0.45)) +
    geom_point(position = position_jitterdodge(dodge.width = 0.45)) +
    xlab("Dimension") + ylab("Value")
_

醜いものを生み出す:

Line/point mismatch

私は明らかにここで根本的に何かが間違っています:_geom_point_ジッターを_geom_line_ジッターに従わせるにはどうすればよいですか?

12
drgibbon

水平のみの別のオプションは、position_dodgeを指定し、これを各geomのposition引数に渡すことです。

pd <- position_dodge(0.4)

ggplot(data = df, aes(x = dimension, y = value,
                      shape = Time, linetype = Time, group = Time)) +
  geom_line(position = pd) +
  geom_point(position = pd) +
  xlab("Dimension") + ylab("Value")

enter image description here

14
JohnSG

1つの解決策は、ポイントを手動でジッターすることです。

df$value_j <- jitter(df$value)

ggplot(df, aes(dimension, value_j, shape=Time, linetype=Time, group=Time)) +
  geom_line() +
  geom_point() +
  labs(x="Dimension", y="Value")

enter image description here

離散X軸の水平解はそれほどきれいではありません(それはきれいです カバーの下で ggplot2がそれを行うとき、それはあなたのために軸と点の変換を非常にうまく処理するので)、それは実行可能です:

df$dim_j <- jitter(as.numeric(factor(df$dimension)))

ggplot(df, aes(dim_j, value, shape=Time, linetype=Time, group=Time)) +
  geom_line() +
  geom_point() +
  scale_x_continuous(labels=dimension) +
  labs(x="Dimension", y="Value")

enter image description here

12
hrbrmstr

2017年7月、ggplot2の開発者は、position_jitter関数にseed引数を追加しました( https://github.com/tidyverse/ggplot2/pull/1996 )。

したがって、(ここでは:ggplot2 3.2.1)引数seedposition_jitterに渡して、geom_pointgeom_lineで同じjitter効果を得ることができます(公式ドキュメントを参照してください: https: //ggplot2.tidyverse.org/reference/position_jitter.html

このseed引数は(まだ)geom_jitterには存在しないことに注意してください。

ggplot(data = df, aes(x = dimension, y = value,
                      shape = Time, linetype = Time, group = Time)) +
  geom_line(position = position_jitter(width = 0.25, seed = 123)) +
  geom_point(position = position_jitter(width = 0.25, seed = 123)) +
  xlab("Dimension") + ylab("Value")

enter image description here

1
dc37