背靠背直方图 - 如何在 R 中使用 qplot 'merge' 两个不同的条形图...?

Back-to-back histogram - how to 'merge' two different bar plots with qplot in R...?

如何根据这两个条形图创建背靠背直方图?我想在一个图中按行合并条形图,即右侧的 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")

您想将所有数据集中在一个 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")

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

    barplot() 

基础如下。

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

geom='bar' 确实适用于 "binning" 您的数据。如果您还没有每行的值,ggplot 可以为您计算值。但在你的情况下,你已经知道条形的长度,所以你最好使用 geom_rect,它可以绘制矩形。 ggplot 旨在以长格式工作,因此请使用 reshape 包中的 melt 来转换您的数据:

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()

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

您可以使条形长度沿 x 轴刻度,这样您就不必使用 coord_flip,但我发现始终将条形长度编码为 [=22= 不会造成混淆].但这会让你得到同样的东西:

ggplot(melted.data, aes(ymax=rows+0.5, ymin=rows-0.5, xmax=value)) + 
  geom_rect(xmin=0, color="black")

你可以强制geom_bar做你想做的事,方法是将分箱统计固定到恒等函数(别用分箱的奇特方式),并将位置固定到恒等函数,所以它不会'不要尝试堆叠酒吧。

ggplot(melted.data, aes(x=rows, y=value)) + 
  geom_bar(position='identity', stat='identity', color="black") + coord_flip()

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