如何制作重叠的条形图?

8
用“标准”方式制作柱状图
dat <- read.table(text = "A   B 
+ 1 1 4
+ 2 2 3
+ 3 3 2
+ 4 4 1", header = TRUE)
barplot(as.matrix(dat))

创建一个像这样的条形图:

enter image description here

相反,我想让不同的部分重叠在一起,如下所示:

enter image description here

如何在R中制作这样的图表?


我不确定我理解你想要的行为。你是想要类似于 barplot(as.matrix(dat), beside=TRUE) 这样的东西吗? - tkerwin
2个回答

20

我使用过两种方法:

library('ggplot2')
counts <- with(diamonds, table(cut, clarity))
#            clarity
# cut           I1  SI2  SI1  VS2  VS1 VVS2 VVS1   IF
# Fair         210  466  408  261  170   69   17    9
# Good          96 1081 1560  978  648  286  186   71
# Very Good     84 2100 3240 2591 1775 1235  789  268
# Premium      205 2949 3575 3357 1989  870  616  230
# Ideal        146 2598 4282 5071 3589 2606 2047 1212

在 ggplot 中,这非常容易

ggplot(diamonds, aes(clarity, fill = cut)) + 
  geom_bar(position = 'identity', alpha = 0.3)

在这里输入图像描述

使用基本R语言实现

cols <- ggcols(nrow(counts))

for (ii in 1:nrow(counts))
  barplot(counts[ii, ], add = ii != 1, ylim = c(0, 5000),
          col = adjustcolor(cols[ii], 0.3),
          axes = FALSE, axisnames = FALSE, border = NA)

axis(1, barplot(counts, plot = FALSE), colnames(counts))
axis(2, las = 1)
title(main = 'identity')
box(bty = 'l')

legend('topright', bty = 'n', title = 'cut',
       legend = rownames(counts), fill = adjustcolor(cols, 0.5))

enter image description here

同时匹配ggplot颜色:

ggcols <- function (n, l = 65, c = 100) {
  hues <- seq(15, 375, length = n + 1)
  hcl(h = hues, l = l, c = c)[1:n]
}

我会在基本的 barplot 函数中添加一个 border=NA 参数。这将产生更具吸引力的输出。 - Thomas
同意。好的决定,还修复了编辑中的图例和边距问题。这些问题一直困扰着我。 - rawr

3
在普通的R中,可以通过以下方式实现重叠柱状图:
1.使用rgb函数调用的alpha值使条形图透明(例如,rgb(redValue, greenValue, blueValue, alphaLevel),其中rgb(1, 0, 0, .5)对应于带有alpha级别为.5的红色)
2.在barplot调用中使用选项add=TRUE将不同的条形图叠加在一起
或者在代码中:
dat <- read.table(text = "A   B
  1 4
  2 3
  3 2
  4 1", header = TRUE)

barplot(dat$A, col=rgb(1, 0, 0, .5)) 
barplot(dat$B, col=rgb(0, 1, 0, .5), add=TRUE) 

# adding a legend
legend('top', bty = 'n', title = 'Legend',
  legend = c('A', 'B'), fill = c('red', 'green'))

可以进一步美化这个图形,但我相信这段代码提供了一个非常简单的替代方案来达到效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接