R 同一图形中的交错和堆叠几何钢筋?

R 同一图形中的交错和堆叠几何钢筋?,r,ggplot2,R,Ggplot2,我有下面的图表,它基本上是两个分布的直方图,并排绘制: 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(

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

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)

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

好吧,我尝试了一下,但除了在同一数据框中放置适当的密度外,还没有取得太大的进展。框架:

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")

my.barplot基本图形?!?内维尔

这是我想到的。我承认我很难理解你所有的聚合和准备,所以我只是聚合到了计数,可能弄错了——但看起来你处在一个位置,从功能图开始,然后获得正确的输入可能更容易。这能奏效吗

# 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")
#聚合

dat.agg我从邮件列表中找到了相当旧的线程。我不确定这个功能是否被应用到了更高的版本中。很抱歉,我现在没有更多的时间,但我想我会删除这个链接,希望它能给你一些想法:总之:绘制两个独立的条形图层。然后,您可以对这些条使用不同的配色方案,或者使用相同的配色方案并使用
alpha()
使其半透明-未堆叠是较浅的色调,堆叠是全色。谢谢joran和Matt。我将尝试一下图层和alpha技巧,希望在今天晚些时候。有趣的是,你如何评估你的透明度水平?只是玩弄一下,似乎“#1F78B499”大约相当于
alpha(#1F78B4,0.5)
-你会怎么做,比如说,75%不透明?@Matt:最后两位数字,就像两位颜色值本身一样,从00到FF。你算一下:-)我有没有关于如何为category2添加图例的提示,因为category1是这两个的填充?ggplot2书中的6.4.5部分暗示了身份等级可以做到这一点,但进一步阅读,它似乎让事情没有了一个图例,所以我不知道。@gsk3是的,这是这种方法的一个主要缺陷-根本没有办法得到一个图例,因为就ggplot而言,这里只有两种颜色。我认为你必须以一种非常基本的方式重新构造数据,而我现在无法提出它。我注意到你对GIMP很熟悉,但是……事实上,经过思考,我会这么做的。如上所述进行绘图,复制/粘贴类别1图例,然后使用滴管+填充设置条本身的颜色。只要你不是在做一百万个这样的情节,那是一个相当容易处理的乱七八糟的事情。