背靠背直方图 - 如何在R ...中将两个不同的条形图与qplot“合并”?

时间:2015-02-27 11:54:09

标签: r ggplot2

如何从这两个条形图创建背对背直方图?我想在一个图中逐行合并,即右侧的p1和零轴左侧的p2。这是一个例子:

library(ggplot2)
x1 <- seq(0,100,10)
x2 <- seq(-100,0,10)
rows <- c(1:11)
data <- data.frame(rows,x1,x2)
z <- c(-100,100)
p1 <- qplot(rows, data=data, weight=x1, geom="bar", binwidth=1, color="black",
            xlab="", ylab="", position = "identity", ylim=z)
p2 <- qplot(rows, data=data, weight=x2, geom="bar", binwidth=1, color="black",
            xlab="", ylab="", position = "identity", ylim=z)
p1 + coord_flip() + theme(legend.position="none")
p2 + coord_flip() + theme(legend.position="none")

3 个答案:

答案 0 :(得分:2)

geom='bar'真正意味着&#34; binning&#34;你的数据。如果您还没有为每个行设置值,ggplot可以为您计算值。但在你的情况下,你已经知道了条的长度,所以你最好使用geom_rect,它可以绘制矩形。 ggplot旨在以较长的形式工作,因此请使用melt包中的reshape转换您的数据:

library(reshape)
# Put the data into long form - preferred for ggplot
melted.data <- melt(data, id.vars='rows')
# Use geom_rect to plot data that was already been "binned".
ggplot(melted.data, aes(xmax=rows+0.5, xmin=rows-0.5, ymax=value)) + 
  geom_rect(ymin=0, color="black") + coord_flip()

enter image description here

您还必须避免使用z,因为ggplot会处理最小和最大y值。

您可以沿x轴刻度制作条形长度,然后您不必使用coord_flip,但我发现始终将条形长度编码为{{1}时不那么令人困惑}。但这会让你得到同样的东西:

y

你可以强制ggplot(melted.data, aes(ymax=rows+0.5, ymin=rows-0.5, xmax=value)) + geom_rect(xmin=0, color="black") 通过将binning统计数据固定到身份功能(说“不要bin”的奇特方式)和身份识别位置来做你想要的事情,所以它没有&# 39;尝试堆叠吧。

geom_bar

这也会让你得到同样的东西。

答案 1 :(得分:1)

您希望将所有数据放在一个data.frame中,并在下面的代码中创建一个因子类型组级别($group)。然后,逐组着色以强制分别为每个组评估权重。我并不过分熟悉qplot,但我想你可以,如果你真的想,可以在以后添加一些代码来强制两个组具有相同的颜色。

library(ggplot2)
x1 <- seq(0,100,10)
x2 <- seq(-100,0,10)
rows <- c(1:11)
data <- rbind(data.frame(rows,x=x1,group=1),data.frame(rows,x=x2,group=2))
data$group = as.factor(data$group)
z <- c(-100,100)
p1 <- qplot(rows, data=data, weight=x, geom="bar", binwidth=1, color=group,
            xlab="", ylab="", position = "identity", ylim=z)
p1 + coord_flip() + theme(legend.position="none")

答案 2 :(得分:1)

抱歉,我不太了解ggplot2,这可能不是你想要的,但是你可以用

做到这一点
    barplot() 

在基地如下。

    barplot(x1, 1, horiz = T, xlim = range(c(x1, x2)))
    barplot(x2, 1, horiz = T, add = T)