如何将R几何直方图的y轴对数变换到正确的方向? [英] How to log transform the y-axis of R geom_histogram in the right direction?
本文介绍了如何将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屋!
查看全文