使用自由 y 轴调整多面点图的 binwidth 大小
Adjust binwidth size for faceted dotplot with free y axis
我想调整多面 geom_dotplot
的 binwidth
,同时保持点大小不变。
使用默认值 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_dotplot
s,它允许分别为每个面设置 binwidth。然而,这需要一些手动工作来计算 binwidth
s,以便每个面的点大小相同:
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")
我想调整多面 geom_dotplot
的 binwidth
,同时保持点大小不变。
使用默认值 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_dotplot
s,它允许分别为每个面设置 binwidth。然而,这需要一些手动工作来计算 binwidth
s,以便每个面的点大小相同:
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")