使用自由 y 轴调整多面点图的 binwidth 大小

Adjust binwidth size for faceted dotplot with free y axis

我想调整多面 geom_dotplotbinwidth,同时保持点大小不变。

使用默认值 binwidth(数据范围的 1/30),我得到以下图:

library(ggplot2)

df = data.frame(
  t = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2),
  x = 1, 
  y = c(1, 2, 3, 4, 5, 100, 200, 300, 400, 500)
)

ggplot(df, aes(x=x, y=y)) +
  geom_dotplot(binaxis="y", stackdir="center") +
  facet_wrap(~t, scales="free_y")

但是,如果我更改 binwidth 值,新值将作为绝对值(而不是数据范围的比率),因此两个面得到不同大小的点:

  geom_dotplot(binaxis="y", stackdir="center", binwidth=2) +

有没有办法调整 binwidth 使其相对于其方面的数据范围?

实现所需结果的一个选项是通过多个 geom_dotplots,它允许分别为每个面设置 binwidth。然而,这需要一些手动工作来计算 binwidths,以便每个面的点大小相同:

library(ggplot2)

y_ranges <- tapply(df$y, factor(df$t), function(x) diff(range(x)))
binwidth1 <- 2

scale2 <- binwidth1 / (y_ranges[[1]] / 30)
binwidth2 <-  scale2 * y_ranges[[2]] / 30

ggplot(df, aes(x=x, y=y)) +
  geom_dotplot(data = ~subset(.x, t == 1), binaxis="y", stackdir="center", binwidth = binwidth1) +
  geom_dotplot(data = ~subset(.x, t == 2), binaxis="y", stackdir="center", binwidth = binwidth2) +
  facet_wrap(~t, scales="free_y")