如何从这两个条形图创建背对背直方图?我想在一个图中逐行合并,即右侧的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")
答案 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()
您还必须避免使用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)