如何用前n个级别(按某个指标)和[其他]替换因子级别?

时间:2011-07-13 02:55:31

标签: r ggplot2 color-scheme

对于在图表中具有超过合理数量级别的因子,我想用“其他”替换不在“前10名”中的任何级别。

替代问题:如何将我的因子水平降低到rcolorbrewer可以绘制为单独颜色的数字?

例如,如果我想从棒球数据中绘制每十年的本垒打数:

require(ggplot2)
qplot(data=baseball,10*year%/%10,hr,
  stat="identity",geom="bar")

simple graph to set the scene

也许我想看看哪些团队为此做出了贡献:

qplot(data=baseball,10*year%/%10,hr,
  fill=team,
  stat="identity",geom="bar")

too many teams to tell colors apart or plot on page

这会产生太多的色彩等级!颜色是如此相似,你无法区分它们,并且有很多它们不适合屏幕。

我真的很想看到排名靠前的X(7)队(按总计数为主),然后其他所有队员都被归为一个名为'other'的单一类别/颜色。

让我们假设我们有一个名为hotfactor的函数,它知道如何执行此操作:

hotfactor(afactor,orderby,count)={ ??? }

qplot(data=baseball,10*year%/%10,hr,
  fill=hotfactor(factor(team),hr,n=7),
  stat="identity",geom="bar") + 
  scale_fill_brewer("team","Dark2")

sample image for solution

那么我可以将什么用于'hotfactor'?

1 个答案:

答案 0 :(得分:9)

所以经过几次迭代并搜索网页后,我创建了这个很好的短片。

hotfactor= function(fac,by,n=10,o="other") {
   levels(fac)[rank(-xtabs(by~fac))[levels(fac)]>n] <- o
   fac
}

这对于汇总数据非常有用,您可以使用它来访问伟大的rcolorbrewer颜色方案(每个颜色方案都有有限数量的精心挑选的颜色)。


使用说明:

fac应该是一个因素,并且在没有空因子水平的情况下效果最佳。您可能希望先运行droplevels(as.factor(mydata))

它不会排序因子级别。为了获得最佳的条形图结果,您应该在输出因子上运行以下内容。

x <- hotfactor(f,val)
x <- reorder(x,-val,sum)