R中的2层条形图

时间:2015-02-25 16:31:19

标签: r bar-chart

我正在尝试在R中构建一个(某种程度上)复杂的条形图。想法是覆盖两个图表,其中一个中的条形图比另一个条形图宽,这样两个条形图始终可见。

这就是我现在所拥有的:

# GENERATE THE DATA  
Age = c(50, 55, 60, 65, 70)                                     # Age groups  
Male = c(15.4, 24.3, 37.0, 54.6, 71.1)                          # Death rates for males  
Female = c(8.4, 13.6, 19.3, 35.1, 50.0)                         # Death rates for females  
Deathrate = matrix(c(Male,Female), nrow=length(Age), ncol=2, dimnames=list(Age, c("Male","Female")))         

# GENERATE THE DATA  
barplot(Deathrate[,1], col="red")
par(new=TRUE)
barplot(Deathrate[,2], space=1, col="blue")

现在,正如您所看到的,显示了两个图,但是当两个中间条很好地重叠并居中时,所有其他条都不居中。例如,最右边的蓝色条显示在最右边的红色条的边缘。

有没有人有一个简单的解决方案来集中所有吧?

谢谢,菲利普

PS我知道图表并不漂亮(重叠的传说等)....

4 个答案:

答案 0 :(得分:2)

您可以将add=TRUEwidthspace的适当值一起使用。

barplot(Deathrate[,1], col="red")
barplot(Deathrate[,2], width=0.5, space=c(0.9, 1.4, 1.4, 1.4, 1.4), col="blue", add=TRUE)

答案 1 :(得分:2)

以下是使用ggplot2

的解决方案
Death.df <- as.data.frame(Deathrate) # ggplot2 requires a data frame
Death.df$ages <- rownames(Death.df) # add a column with rownames
Death.m <- melt(Death.df, id.vars = "ages") # melt the dataframe to long form

ggplot(Death.m) +
  geom_histogram(aes(x = ages, y = value), stat = "identity", fill = "red", width = 0.4) +
  geom_histogram(aes(x = ages, y = value), stat = "identity", fill = "blue", width = 0.5, position = "dodge") +
  ggtitle("Death Rates of Males and Females\nMales in Red and Females in Blue")

enter image description here

答案 2 :(得分:1)

 barplot(as.vector(rbind(Male, Female)),col=c('red','blue'), space=rep_len(1:0,length(Male)*2), beside=T, legend.text=c('Male', 'Female'));

enter image description here

P.S。酒吧没有居中,但我认为它们更漂亮。

答案 3 :(得分:0)

barplot当然没有针对这种情况进行优化。如果你想要更多的控制,那么为这种类型的情节滚动自己的绘图功能并不太难。

cbarplot <- function(x, ..., bcols=c("red","blue"), bwidth=c(.4,.3)) {
    plot(1, type="n", xlim=c(.5,(nrow(x)+.5)), ylim=c(0,max(x)), xaxt="n", ...)
    for(i in 1:ncol(x)) {
        w <- bwidth[i]
        rect(seq_len(nrow(x))-w, 0, seq_len(nrow(x))+w, x[,i], col=bcols[i])
    }
    axis(1, at=1:nrow(x), rownames(x))
}

cbarplot(Deathrate, ylab="Count", xlab="Age")

enter image description here