繁体   English   中英

在同一图中交错和堆叠 geom_bar?

[英]Staggered and stacked geom_bar in the same figure?

我有下图,它本质上是两个分布的直方图,它们并排绘制:

my.barplot <- function( df, title="", ... ) {
  df.count <- aggregate( df$outcome, by=list(df$category1,df$outcome), FUN=length )
  colnames( df.count ) <- c("category1","outcome","n")
  df.total <- aggregate( df.count$n, by=list(df.count$category1), FUN=sum )
  colnames( df.total ) <- c("category1","total")
  df.dens <- merge(df.count, df.total)
  df.dens$dens <- with( df.dens, n/total )
  p <- ggplot( df.dens, aes( x=outcome, fill=category1 ), ... )
  p <- p + geom_bar( aes( y=dens ), position="dodge" )
  p <- p + opts( axis.text.x=theme_text(angle=-90,hjust=0), title=title )
  p
}

N <- 50*(2*8*2)
outcome <- sample(ordered(seq(8)),N,replace=TRUE,prob=c(seq(4)/20,rev(seq(4)/20)) )
category2 <- ifelse( outcome==1, sample(c("yes","not"), prob=c(.95,.05)), sample(c("yes","not"), prob=c(.35,.65)) )
dat <- data.frame(
  category1=rep(c("in","out"),each=N/2),
  category2=category2,
  outcome=outcome
  )

my.barplot(dat)

现有条形图

我想在每个条形图中绘制属于某个第二类的比例。 如果不需要按第一类组织它,我只会堆叠条形。 但是,我无法弄清楚如何按第二个类别进行堆叠。 基本上在每个结果类别 1 条中,我希望类别 2 中的比例具有更深的阴影。

这是我正在尝试创建的 GIMP 图像:

具有类别 2 堆叠比例的条形图

基本图形?!? 永不出错

这是我想出的。 我承认我很难理解你所有的聚合和准备,所以我只是聚合到计数并且可能都弄错了 - 但看起来你处于一个位置,从一个功能性的情节开始可能会更容易,并且然后正确输入。 这行得通吗?

# Aggregate
dat.agg <- ddply(dat, .var = c("category1", "outcome"), .fun = summarise,
                 cat1.n = length(outcome),
                 yes = sum(category2 %in% "yes"),
                 not = sum(category2 %in% "not")
)


# Plot - outcome will be x for both layers
ggplot(dat.agg, aes(x = outcome)) +

    # First layer of bars - for category1 totals by outcome
    geom_bar(aes(weight = cat1.n, fill = category1), position = "dodge") +

    # Second layer of bars - number of "yes" by outcome and category1
    geom_bar(aes(weight = yes, fill = category1), position = "dodge") +

    # Transparency to make total lighter than "yes" - I am bad at colors
    scale_fill_manual(value = c(alpha("#1F78B4", 0.5), alpha("#33A02C", 0.5))) +

    # Title
    opts(title = "A pretty plot <3")

绘制同时被躲避、重叠和透明的条形图

我喜欢@MattP 的评论; 我只想补充一点, alpha()的替代方法是直接指定透明度。 例如,#FF0000 是纯色,#FF000033 是浅色/部分透明色。 与往常一样,搜索http://Addedtor.free.fr/graphiques/可能会帮助您找到一些代码来创建您所追求的确切图形样式。

好吧,我试了一下,但除了将适当的密度放在同一个 data.frame 中之外,还没有取得很大进展:

my.barplot <- function( df, title="", legend.title="",... ) {
  df.count12 <- aggregate( df$outcome, by=list(df$category1,df$category2,df$outcome), FUN=length )
  colnames( df.count12 ) <- c("category1","category2","outcome","n")
  df.total <- aggregate( df.count12$n, by=list(df.count12$category1), FUN=sum )
  colnames( df.total ) <- c("category1","total")
  # Densities within a bar - Categories 1 & 2
  df.dens12 <- merge(df.count12, df.total)
  df.dens12$dens12 <- with( df.dens12, n/total )
  # Total bar height - Category 1 density
  df.count1 <- aggregate( df.dens12$n, by=list(df.dens12$category1,df.dens12$outcome), FUN=sum )
  colnames( df.count1 ) <- c("category1","outcome","n")
  df.dens1 <- merge(df.count1,df.total)
  df.dens1$dens1 <- with(df.dens1, n/total)
  # Merge both into the final dataset
  df.dens <- merge(df.dens12,df.dens1,all.x=TRUE,by=c("category1","outcome"))
  df.dens <- subset(df.dens, select=c(-total.x) )
  colnames( df.dens ) <- sub("\\.x","12",colnames(df.dens))
  colnames( df.dens ) <- sub("\\.y","1",colnames(df.dens))
  # Plot 
  ymax <- max(df.dens$dens1)
  # Plot 1: category1
  p <- ggplot( df.dens, aes( x=outcome, fill=category1 ), ... )
  p1 <- p + geom_bar( aes( y=dens1 ), position="dodge" )
  p1 <- p1 + opts( axis.text.x=theme_text(angle=-90,hjust=0), title=title )
  if(legend.title!="") { p1 <- p1 + scale_colour_discrete(name=legend.title) }
  # Plot 2: category2
  p2 <- p1 + geom_bar( aes( y=dens12, fill=category2 ), position="stack", stat="identity" )
  p2
}

N <- 50*(2*8*2)
outcome <- sample(ordered(seq(8)),N,replace=TRUE,prob=c(seq(4)/20,rev(seq(4)/20)) )
category2 <- ifelse( outcome==1, sample(c("yes","not"), prob=c(.95,.05)), sample(c("yes","not"), prob=c(.35,.65)) )
dat <- data.frame(
  category1=rep(c("in","out"),each=N/2),
  category2=category2,
  outcome=outcome
  )

my.barplot(dat, title="Test title", legend.title="Medical system")

将我的尝试与链接进行比较,很明显他将第三个维度 (x=outcome, dodge=category1, stack=category2) 与网格布局并排放置,而我确实需要将第三个维度堆叠在第二个维度内。 我想我可能已经到了 ggplot2 被过度折磨的地步,我应该使用基本图形写出一个函数。 哎呀。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM