r - 如何在正确的方向上记录变换 R geom_histogram 的 y 轴?

标签 r ggplot2 histogram

我忘记了一些非常基本的东西,这可以解释为什么我在对 y 轴进行 log10 变换后看到非常膨胀的 y 值。

我有以下堆叠的 ggplot + geom_histogram。

ggTherapy <- ggplot(genderTherapyDF, aes(freq, fill=name)) +
 geom_histogram(data=genderTherapyDF, binwidth = 1, alpha=0.5, color="black") + theme_bw() +
 theme(legend.position="none", axis.title = element_text(size=14), legend.text = element_text(size=14), axis.text.y = element_text(size=12, angle=45), axis.text.x = element_text(size=12), legend.background = element_rect(fill="transparent")) +
 ylab("No. of patients") + xlab("Events") + labs(fill="") +  ggtitle("Therapy")

enter image description here

y 值符合我的预期。然而,它是如此倾斜,以致于肉眼我发现这非常不令人满意。我宁愿看到一个转换的情节。

我尝试变换 x,很快意识到沿分箱轴的变换非常难以解释。所以我变换了 y 轴上的频率:

ggTherapy <- ggplot(genderTherapyDF, aes(freq, fill=name)) +
 geom_histogram(data=genderTherapyDF, binwidth = 1, alpha=0.5, color="black") + theme_bw() +
 theme(legend.position="none", axis.title = element_text(size=14), legend.text = element_text(size=14), axis.text.y = element_text(size=12, angle=45), axis.text.x = element_text(size=12), legend.background = element_rect(fill="transparent")) +
 ylab("No. of patients") + xlab("Events") + labs(fill="") +  ggtitle("Therapy") +
scale_y_log10()

enter image description here

从视觉上看,情节是有道理的。但是,我很难接受 y 轴标签!为什么它们在 log10 转换后如此巨大?

最佳答案

我将反对在对数变换的 y 轴上使用堆叠位置。

考虑以下数据。

df <- data.frame(
  x = c(1, 1),
  y = c(10, 10),
  z = c("A", "B")
)

这只是两组共享 x 位置的两个相等的观察值。如果我们将其绘制在堆叠条形图中,它看起来如下所示:

library(ggplot2)
ggplot(df, aes(x, y, fill = z)) +
  geom_col(position = "stack")

这完全符合您的预期。但是,如果我们现在变换 y 轴,我们会得到以下结果:

ggplot(df, aes(x, y, fill = z)) +
  geom_col(position = "stack") +
  scale_y_continuous(trans = "log10")

在上图中,似乎 B 组的值为 10,这是正确的,而 A 组的值为 90,这是不正确的。发生这种情况的原因是因为位置调整发生在统计变换之后,所以您得到的不是 log10(A + B),而是 log10(A) + log10(B),这与 log10(A * B) 相同,作为顶部高度。

相反,如果您计划变换 y 轴,我建议不要堆叠直方图,而是使用填充的 alpha 将它们分开。示例如下:

df <- data.frame(
  x = c(rnorm(100, 1), rnorm(100, 2)),
  z = rep(c("A", "B"), each = 100)
)

ggplot(df, aes(x, fill = z)) +
  geom_histogram(position = "identity", alpha = 0.5) +
  scale_y_continuous(trans = "log10")
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#> Warning: Transformation introduced infinite values in continuous y-axis

是的,0 将变为 -Inf,但至少 y 轴现在是正确的。

编辑:如果您想过滤掉 -Inf 观察结果,scales v1.1.1 包中的一件好事是使用如下的 oob_censor_any() 函数:

scale_y_continuous(trans = "log10", oob = scales::oob_censor_any)

关于r - 如何在正确的方向上记录变换 R geom_histogram 的 y 轴?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62193814/

相关文章:

python - 如何查找pandas中特定范围内的值的数量?

r - 尝试查找几何分布的 MLE 时出错

r - 如何在 echarts4r 图上显示标签,但每隔 2 或 3 个条显示一次?

r - 在 R 中创建绘图图表以在计数和百分比之间切换

opencv - 优化SIMD直方图计算

python - Matplotlib:如何用等面积的箱子制作直方图?

r - 计算以观察 == 1 为条件按受试者 ID 聚合的游程长度

r - 跨多行包装水平图例

R ggrides 包绘制平均线(非中间)

r - 将x或y轴与刻度标签一起移动到单个ggplot的中间(无构面)