如何制作重叠的条形图?

时间:2014-04-22 19:03:38

标签: r bar-chart overlap

使条形图成为“标准”方式

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?中创建这样的情节?

2 个答案:

答案 0 :(得分:15)

我使用了两种方法:

(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

中很容易
library(ggplot2)
ggplot(diamonds, aes(clarity, fill = cut)) + 
  geom_bar(position = 'identity', alpha = .3)

enter image description here

在基地R

par(xpd = TRUE, mar = c(4,4,2,2))
invisible(sapply(1:nrow(counts), function(x)
  barplot(counts[x, ], axes = FALSE, axisnames = FALSE,
          main = 'identity', border = NA,
          col = tcol(ggcols(5)[x], 50), 
          axis.lty = 1, ylim = c(0, 5000), 
          add  = ifelse(x == 1, FALSE, TRUE))))
axis(1, at = barplot(counts, plot = FALSE), labels = colnames(counts))
axis(2, at = seq(0, 5000, 1000), labels = seq(0, 5000, 1000))
legend('topright', bty = 'n', title = 'cut',
       legend = rownames(counts), fill = tcol(ggcols(5), 100))

enter image description here

我在个人包装中使用了这种透明色彩功能:

#' Transparent colors
#' 
#' Add transparency to colors
#' 
#' @usage tcol(color, trans = 255)
#' 
#' @param color single or string of color names (or hexadecimal format) 
#' @param trans transparency defined as an integer in the range 
#' \code{[0, 255]} where \code{0} is fully transparent and \code{255} is fully
#' visible; see details
#' 
#' @details This is a vectorized function to add transparency to colors. 
#' \code{color} and \code{trans} must either be the same length or one of the 
#' two must have length one. 
#' 
#' The function adds integers (in hex) between 0 (fully transparent) and 255
#' (fully visible) to the color(s) given. \code{color} values are converted to
#' RGB with transparency.
#' 
#' @seealso \code{\link{num2hex}}, \code{\link{col2rgb}}
#' 
#' @examples
#' cols <- c('red','green','pink')
#' 
#' # a normal plot
#' plot(rnorm(100), col = tcol(cols), pch = 16, cex = 4)
#' 
#' # more transparent
#' plot(rnorm(100), col = tcol(cols, 100), pch = 16, cex = 4)
#' 
#' # hexadecimal colors also work
#' cols <- c('#FF0000','#00FF00','#FFC0CB')
#' plot(rnorm(100), col = tcol(cols, 200), pch= 16, cex = 4)
#' @export

tcol <- function(color, trans = 255) {

  if (length(color) != length(trans) & 
        !any(c(length(color), length(trans)) == 1)) 
    stop('Vector lengths not correct')
  if (length(color) == 1 & length(trans) > 1) 
    color <- rep(color, length(trans))
  if (length(trans) == 1 & length(color) > 1) 
    trans <- rep(trans, length(color))

  res <- paste0('#', apply(apply(rbind(col2rgb(color)), 2, function(x) 
    format(as.hexmode(x), 2)), 2, paste, collapse = ''))
  res <- unlist(unname(Map(paste0, res, as.character(as.hexmode(trans)))))
  res[is.na(color)] <- NA
  return(res)
}

并匹配ggplot颜色:

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

答案 1 :(得分:2)

在普通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'))

情节可以进一步美化,但我相信这段代码提供了一个非常简单的替代方案,可以解决问题。