我正在尝试在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我知道图表并不漂亮(重叠的传说等)....
答案 0 :(得分:2)
您可以将add=TRUE
与width
和space
的适当值一起使用。
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")
答案 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'));
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")