具有负值和正值的条形图以非零值为中心

时间:2014-07-24 11:41:24

标签: r ggplot2 bar-chart

我正在尝试创建比值比的条形图。解释性地,它们以1为中心而不是0.因此,我想要一个条形图,其中低于1的值是"否定"并且高于1的值是"肯定的" (即距离1的距离图)。

实际上,图表应如下图所示,但y轴上的标签应以1为中心,而不是0。

the plot

我想创建这个图不是y轴的重新标记,而是实际上以1为中心。这是可能的吗?如果是的话,怎么样?

创建示例图的代码:

data <- matrix(c(rnorm(5, 1, .5)), 5, 1)
data <- as.data.frame(data)
data[,2] <- data[,1] - .1
data[,3] <- data[,1] + .1
data <- cbind(c(letters[1:5]), data)
names(data) <- c("Category", "OR", "Lower", "Upper")

data.zero <- cbind("Category"=data[,1], data[,2:4] - 1)

require(ggplot2)
ggplot() + 
  geom_bar(data = data.zero, aes(x=Category, y=OR, fill=Category), stat = "identity") +
  scale_fill_brewer(type = "seq", palette = 1) +  
  geom_errorbar(aes(x=Category, y=OR, ymin=Lower, ymax=Upper), 
            width=.1, position=position_dodge(), data=data.zero)

2 个答案:

答案 0 :(得分:1)

定义一个简单的函数来添加1,如下所示:

plus1_formatter <- function(x) {x +1}

然后添加字符串

+ scale_y_continuous(labels=plus1_formatter)

上面的ggplot命令。

使其可重现集seed(123)

之前: before changing the labels

后: enter image description here

答案 1 :(得分:0)

如果我正确理解了你的问题,你不想重新标记y轴,你希望它以1为中心。

## Find the minimum and maximum y
mi <- min(data.zero$Lower)
ma <- max(data.zero$Upper)

现在我检查哪个距离更大,从1到mi或从1到ma。我通过增加距离1的较小距离来设置ylim。

if(1 - mi > ma - 1) { 
    newylim <- c(mi  , 2 - mi)  ## Lower limit remains same, Upper limit is increased
} else { 
    newylim <- c(2 - ma, ma)    ## Upper limit remains same, Lower limit is decreased
}

然后你可以添加:

+ ylim(newylim)

您的代码的图表位于左侧,并在右侧添加了ylim

enter image description here

希望它有所帮助,

亚历