如何将R几何直方图的y轴对数变换到正确的方向? [英] How to log transform the y-axis of R geom_histogram in the right direction?

查看:19
本文介绍了如何将R几何直方图的y轴对数变换到正确的方向?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我有以下堆叠的gglot+geom_column图。

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")

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()

从视觉上看,这个情节是有意义的。然而,我正在努力与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观察结果,Scale v1.1.1包中有一个很好的功能,它使用了oob_censor_any()函数:

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

这篇关于如何将R几何直方图的y轴对数变换到正确的方向?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆