R 伪日志转换仍然会从绘图中删除0,如何避免?

R 伪日志转换仍然会从绘图中删除0,如何避免?,r,ggplot2,R,Ggplot2,我有一个数据集,其中包含0,范围最大为1 set.seed(190) b<-runif(10000,min=1e-15,1) #Create 0s b[sample(NROW(b),200)]<-0 但这将生成以下方框图,并警告删除的非有限行。如何避免删除日志10(0) NB: 我把下面的堆栈问题作为灵感 由于箱线图是基于百分位数的,因此可以将等于0的值设置为接近零值,这样百分位数就可以很好地计算出来。另一件事是,你使用一个“缩放y”函数,R中的这个函数不是“放大”,而是将数

我有一个数据集,其中包含0,范围最大为1

set.seed(190)

b<-runif(10000,min=1e-15,1)

#Create 0s
b[sample(NROW(b),200)]<-0
但这将生成以下方框图,并警告删除的非有限行。如何避免删除日志10(0)

NB: 我把下面的堆栈问题作为灵感


由于箱线图是基于百分位数的,因此可以将等于0的值设置为接近零值,这样百分位数就可以很好地计算出来。另一件事是,你使用一个“缩放y”函数,R中的这个函数不是“放大”,而是将数据放大,所以你应该使用一个“坐标”函数来“放大”。应在绘图外计算平均值,然后将其相加。这将实现以下目的:

set.seed(190)

b<-runif(10000,min=1e-15,1)

#Create 0s
b[sample(NROW(b),200)]<-0

val <- min(b[b != 0])

mn_val <- mean(b)

b_aux <- b
b_aux[b_aux == 0] <- val / 10

tibble(value=b_aux, name=rep(1,1e4)) %>%
  ggplot(aes(x=name,y=value))+
  coord_trans(y = 'log10', ylim = c(10^-12, 10^0)) +
  scale_y_continuous(breaks=10^seq(-12,0,2)) +
  geom_boxplot() +
  geom_point(y = mn_val,x = 1, shape=4, size=3, color="black")
set.seed(190)

b您可以设置要显示的中断,并将
pseudo\u log\u trans
sigma
参数调整为中断数

您需要手动执行此操作,因为似乎有on
pseudo\u log\u trans
中断

nbreaks <- 7
breaks <- 10^-(nbreaks:1)
breaks <- c(0,breaks)

tibble(name=rep(1,1e4),value=b) %>%
  ggplot(aes(x=name,y=b))+
  geom_boxplot()+
  scale_y_continuous(trans = pseudo_log_trans(sigma = 10^(-nbreaks), base = 10), breaks=breaks)+ 
  geom_point(aes(x=name,y=mean(b)), color = 'black', shape = 4, size=3)

您的y轴限制不包括零:
c(10^-12,10^0)
不包含0。由于超出边界,ggplot2默认情况下会删除它,因为position scales中的
oob
参数默认为
scales::oob\u censor
/
scales::censor
。确实,更改限制后,我仍然会得到一个奇怪的y轴标签。我怎样才能使断点的宽度与粉红色图表中的宽度相同?非常感谢圣地亚哥,这确实非常有用!感谢您的输入,这对于伪日志传输问题是有意义的。我发现我的数据中的胡须不正确,但IQR是正确的。统计摘要找不到正确的平均值。嗯。你发现你的平均值正确吗?抱歉,我已从箱线图管道断开了
stats\u summary
。请参阅我的编辑<代码>平均值
看起来没问题。我不能完全弄清楚我的数据和示例之间有什么不同,但平均值计算不正确。它太低了…你是对的,平均值应该更接近中间值。。。一种选择是用
geom_点(aes(x=1,y=mean(b)))替换统计汇总。
解释了错误统计汇总的原因。上面我的评论中的
geom_点
建议很有意义,请参见我的编辑
nbreaks <- 7
breaks <- 10^-(nbreaks:1)
breaks <- c(0,breaks)

tibble(name=rep(1,1e4),value=b) %>%
  ggplot(aes(x=name,y=b))+
  geom_boxplot()+
  scale_y_continuous(trans = pseudo_log_trans(sigma = 10^(-nbreaks), base = 10), breaks=breaks)+ 
  geom_point(aes(x=name,y=mean(b)), color = 'black', shape = 4, size=3)
# Function to use boxplot.stats to set the box-and-whisker locations
# see https://stackoverflow.com/a/38757310/13513328   
mybxp = function(x) {
  bxp = log10(boxplot.stats(10^x)[["stats"]])
  names(bxp) = c("ymin","lower", "middle","upper","ymax")
  return(bxp)
}  

tibble(name=rep(1,1e4),value=b) %>%
  ggplot(aes(x=name,y=b))+
  stat_summary(fun.data=mybxp, geom="boxplot") +
  scale_y_continuous(trans = pseudo_log_trans(sigma = 10^(-nbreaks), base = 10), breaks=breaks)+ 
  geom_point(aes(x=name,y=mean(b)), color = 'black', shape = 4, size=3)