【问题标题】:R lattice barchart: How to write the total sum on each bar in multiple panels?R lattice barchart:如何在多个面板中的每个条上写出总和?
【发布时间】:2014-07-06 16:17:48
【问题描述】:

我有一个带有多个面板的格子条形图,我想在条形顶部添加每个条形的总和(例如,(70) 在左上角第一个条形的顶部,(20) 在第二个一个,(150) 第三个等等)。

这里有一个类似的question,但我找不到一种方法来调整该代码以适应我的情节。与该示例不同,我想做的是在每个条形垂直条的顶部添加男性和女性的“总和”。我也无法使用ltext 分别标记它们,如here 所示。任何建议,使用ltext 或任何其他方式,都会非常有帮助。

civ1<-c("Single","Single","Marr","Marr","Single","Single","Marr","Marr","Single","Single","Marr","Marr","Single","Single","Marr","Marr")
Sex<-rep(c("women","men"),8)
Year<-rep(c(rep(1990,4),rep(2000,4)),2)
Type1<-c(rep("Traditional",8),rep("Dual-earner",8))
Earn1<-c(seq(10, 160, by = 10))
df<-as.data.frame(cbind(civ1,Sex,Year,Type1,Earn1))
df$Earn1<-as.numeric(levels(df$Earn1))[df$Earn1]

my.key<-list(space="bottom",text=list(c("Women","Men"),col=c("black","black")), columns=2,points=T,pch=15,col=c("darkgray","lightgray"),cex=0.8)
labels=c("70","20","150","110")


print(figure1<-barchart(Earn1~civ1|Year+Type1,df,groups=Sex, ylim=c(0,350),horizontal=F,col=c("darkgray","lightgray"),cex=0.8,ylab="Earnings",stack=T,layout=c(2,2),key=my.key,
par.settings = list(strip.background=list(col=c("white","lightyellow")),
panel=function(x,y,subscripts...){
    panel.grid(h=-1,v=0) 
    panel.barchart(...)
    ltext(1,200, labels[subscripts]) #not working!
    })))

【问题讨论】:

    标签: r label bar-chart lattice


    【解决方案1】:

    我看到了几个问题。首先,您的 panel= 参数在您的 par.settings 参数中,这是不正确的。它应该直接传递给barchart。然后你有一些缺少逗号的语法问题,我不确定你的标签是如何只使用 4 个值的。无论如何,下面的代码应该可以工作。

    barchart(
        Earn1~civ1|Year+Type1,df,
        groups=Sex,
        ylim=c(0,350), cex=0.8, ylab="Earnings",
        horizontal=F, stack=T, layout=c(2,2),
        col=c("darkgray","lightgray"),
        key=my.key,
        par.settings = list(strip.background=list(col=c("white","lightyellow"))),
        panel=function(x,y,subscripts,...){
            panel.grid(h=-1,v=0) 
            panel.barchart(x,y,subscripts=subscripts,...)
            t <- aggregate(y~x, data.frame(x,y), FUN=sum)
            panel.text(t$x,t$y, labels=t$y, pos=3)
        }
    )
    

    除了解决上述问题之外,我还使用aggregate() 计算每列的总数,并使用这些值在适当的位置绘制文本标签。结果图如下

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 2014-12-06
      • 2014-06-28
      • 1970-01-01
      • 2016-06-08
      相关资源
      最近更新 更多