R - 由另一个重新排序一个因子(用于ggplot中的标记)

时间:2012-03-06 19:27:40

标签: r ggplot2

如何根据另一个因子的水平重合顺序在一个data.frame列中排序因子的级别?

例如,在代码中:

require(RJSONIO)
require(ggplot2)

race.data.json=fromJSON('http://ergast.com/api/f1/2011/constructors/mclaren/results.json?limit=50')

pd=function(rd,df=NULL) {
  for (el in rd$MRData$RaceTable$Races)
    for (el2 in el$Results){ 
      tmp=data.frame(row.names=NULL,round=as.numeric(el$round),race=el$raceName,num=el2$number,pos=el2$position,driver=el2$Driver['familyName'])
      df=rbind(df,tmp)
    }
  df
}
df=pd(race.data.json)

df$pos=factor(df$pos,levels=c('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','DNF') )

ggplot(df)+geom_point(aes(x=round,y=pos,col=driver))+scale_colour_discrete(name="Driver")

如何使用根据df $ round order(数字顺序)排序的df $ race因子生成一组x轴标签?也就是说,如果我将+scale_x_discrete(labels=df$race)添加到ggplot命令,我如何确保x轴标签遵循原始x轴df $ round值的顺序?

1 个答案:

答案 0 :(得分:1)

如果您的数据框已经排序,并且种族是一个角色,您可以作弊并执行此操作:

ggplot(df)+geom_point(aes(x=factor(round),y=pos,col=driver)) + 
    scale_colour_discrete(name="Driver") + 
    opts(axis.text.x = theme_text(angle = 90)) + 
    scale_x_discrete(labels = unique(df$race))

否则,relevelreorder是可行的方法,正如Chase所说。