背靠背直方图 - 如何在 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()
这也会让你得到同样的东西。
如何根据这两个条形图创建背靠背直方图?我想在一个图中按行合并条形图,即右侧的 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()
这也会让你得到同样的东西。