Luc*_*Pal 6 r facet ggplot2 facet-wrap
我有一个用facet_wrap 创建的图形,可视化许多组的估计密度。有些组的方差比其他组小得多。这会导致某些面板的 x 轴无法读取。最小可重现示例:
library(tidyverse)
x1 <- rnorm(1e4)
x2 <- rnorm(1e4,mean=2,sd=0.00001)
data.frame(x=c(x1,x2),group=c(rep("1",length(x1)),rep("2",length(x2)))) %>%
ggplot(.) + geom_density(aes(x=x)) + facet_wrap(~group,scales="free")
Run Code Online (Sandbox Code Playgroud)
解决这个问题的明显方法是增加图形大小,以便一切都变得可读。然而,面板太多,无法使其成为有用的解决方案。我最喜欢的解决方案是控制轴刻度数,例如在所有 x 轴上仅允许两个刻度。有办法做到这一点吗?
根据建议进行编辑:
添加+ scale_x_continuous(n.breaks = 2)看起来应该完全符合我的要求,但实际上并没有:
按照建议问题Change number of Breaks using facet_grid in ggplot2中的答案,我最终得到两个轴刻度,但不希望有很多小数点:
equal_breaks <- function(n = 3, s = 0.5, ...){
function(x){
# rescaling
d <- s * diff(range(x)) / (1+2*s)
seq(min(x)+d, max(x)-d, length=n)
}
}
data.frame(x=c(x1,x2),group=c(rep("1",length(x1)),rep("2",length(x2)))) %>%
ggplot(.) + geom_density(aes(x=x)) + facet_wrap(~group,scales="free") + scale_x_continuous(breaks=equal_breaks(n=3, s=0.05), expand = c(0.05, 0))
Run Code Online (Sandbox Code Playgroud)
您可以添加到此处开发的if(seq[2]-seq[1] < 10^(-r)) seq else round(seq, r)功能。equal_breaks
通过这样做,仅当标签之间的差异高于阈值时,您才会在 x 轴上舍入标签10^(-r)。
equal_breaks <- function(n = 3, s = 0.05, r = 0,...){
function(x){
d <- s * diff(range(x)) / (1+2*s)
seq = seq(min(x)+d, max(x)-d, length=n)
if(seq[2]-seq[1] < 10^(-r)) seq else round(seq, r)
}
}
data.frame(x=c(x1,x2),group=c(rep("1",length(x1)),rep("2",length(x2)))) %>%
ggplot(.) + geom_density(aes(x=x)) + facet_wrap(~group, scales="free") +
scale_x_continuous(breaks=equal_breaks(n=3, s=0.05, r=0))
Run Code Online (Sandbox Code Playgroud)
正如您正确指出的那样,这个答案仅给出了位数的两种选择;所以另一种可能性是 return round(seq, -floor(log10(abs(seq[2]-seq[1])))),它获取每个方面的“最佳”位数。
equal_breaks <- function(n = 3, s = 0.1,...){
function(x){
d <- s * diff(range(x)) / (1+2*s)
seq = seq(min(x)+d, max(x)-d, length=n)
round(seq, -floor(log10(abs(seq[2]-seq[1]))))
}
}
data.frame(x=c(x1,x2,x3),group=c(rep("1",length(x1)),rep("2",length(x2)),rep("3",length(x3)))) %>%
ggplot(.) + geom_density(aes(x=x)) + facet_wrap(~group, scales="free") +
scale_x_continuous(breaks=equal_breaks(n=3, s=0.1))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2476 次 |
| 最近记录: |