y轴上的对数刻度,但数据为负值

我试图创建一个具有对数y轴的箱线图,因为我有一些非常小的值,然后有一些更高的值,这些值在具有连续y轴的箱线图中不能很好地工作。但是,我有负值,显然不适用于对数刻度。我想知道是否有办法解决这个问题,以便可以将数据显示在箱形图中,该图仍然易于解释,但在y轴上具有更合适的比例。

    p <- ggplot(data = Elstow.monthly.fluxes,aes(x = Month1,y = CH4.Flux)) + stat_boxplot(geom = "errorbar",linetype = 1,width = 0.5) + geom_boxplot() +
xlab(expression("Month")) + ylab(expression(~CH[4]~Flux~(µg~CH[4]~m^{-2}~d^{-1}))) +
scale_y_continuous(breaks = seq(-5000,40000,5000),limits = c(-5000,40000))+
theme(axis.text.x = element_text(colour = "black")) + theme(axis.text.y = element_text(colour = 
"black")) +
theme(panel.background = element_rect("white","black")) +
theme(panel.border = element_rect(colour = "black",fill=NA,size=0.5)) +
theme(axis.text = element_text(size = 12))+ theme(axis.title = element_text(size = 14))+ 
theme(axis.title.y = element_text(margin = margin(t = 0,r = 15,b = 0,l = 0))) + 
theme(axis.title.x = element_text(margin = margin(t = 15,r = 0,l = 0))) +
geom_hline(yintercept = 0,linetype ="dashed",colour = "black") 

y轴上的对数刻度,但数据为负值

nieodie 回答:y轴上的对数刻度,但数据为负值

我有一个愚蠢的解决方案:欺骗辅助轴以重新缩放y轴。我没有您的数据,只是为了说明起见而编了一些数字。

首先将y的值转换为logy = log(y + 5000)。生成图形时,将值转换回原始比例。我借用第二个轴来显示值。我很确定其他人可能会有更优雅的方法来做到这一点。

我懒于没有尝试找到删除主要y的主要breaks = c(0)轴刻度标签的正确方法。

df<-data.frame(y = runif(33,min=-5000,max=40000),x = rep(c("Aug","Sep","Oct"),33)) 
library(tidyverse)
df$logy = log(df$y+5000)

p <- ggplot(data = df,aes(x = x,y = logy)) + 
  stat_boxplot(geom = "errorbar",linetype = 1,width = 0.5) + 
  geom_boxplot() +
  xlab(expression("Month")) + 
  ylab(expression(~CH[4]~Flux~(µg~CH[4]~m^{-2}~d^{-1}))) +
  scale_y_continuous(sec.axis = sec_axis(~(exp(.) -5000),breaks = c(-4000,5000,10000,20000,40000)),breaks = c(0))+ 
  theme(axis.text.x = element_text(colour = "black")) + 
  theme(axis.text.y = element_text(colour = "black")) +
  theme(panel.background = element_rect("white","black")) +
  theme(panel.border = element_rect(colour = "black",fill=NA,size=0.5)) +
  theme(axis.text = element_text(size = 12))+ 
  theme(axis.title = element_text(size = 14))+ 
  theme(axis.title.y = element_text(margin = margin(t = 0,r = 15,b = 0,l = 0))) + 
  theme(axis.title.x = element_text(margin = margin(t = 15,r = 0,l = 0))) +
  geom_hline(yintercept = log(5000),linetype ="dashed",colour = "black") 
p

enter image description here

,

尽管您确实可以像Zhiqiang所建议的那样使用辅助轴来获取所需的标签,但也可以使用适合您需要的变换。

请考虑以下倾斜的箱线图:

df <- data.frame(
  x = rep(letters[1:2],each = 500),y = rlnorm(1000) - 2
)

ggplot(df,aes(x,y)) +
  geom_boxplot()

enter image description here

相反,您可以使用伪对数转换来可视化数据:

ggplot(df,y)) +
  geom_boxplot() +
  scale_y_continuous(trans = scales::pseudo_log_trans())

enter image description here

或者,您可以进行所需的任何转换。我个人喜欢逆双曲正弦变换,这非常类似于伪对数:

asinh_trans <- scales::trans_new(
  "inverse_hyperbolic_sine",transform = function(x) {asinh(x)},inverse = function(x) {sinh(x)}
  )

ggplot(df,y)) +
  geom_boxplot() +
  scale_y_continuous(trans = asinh_trans)

enter image description here

本文链接:https://www.f2er.com/3066306.html

大家都在问