修改摩天大楼图

时间:2014-07-26 17:06:45

标签: r graph ggplot2 bar-chart

以下数据:

require(ggplot2)
    ds <- read.table(header = TRUE, text ="
Coefficient model    value
          BIC   m0F 13
          AIC   m0F 12
     deviance   m0F 11
          BIC   m1F 12
          AIC   m1F 11
     deviance   m1F 10
          BIC   m2F 10
          AIC   m2F 9
     deviance   m2F 8                 
                 ")
print(ds)

我想在x轴上生成一个模型图,y轴上的值和按颜色映射的系数。我希望标记是相应颜色的单行,但到目前为止只能使用条形建立它,这是次优的:

colorFit <- c("BIC"="#8da0cb", "AIC"="#fc8d62", "deviance"="#66c2a5") 

g <- ggplot2::ggplot(ds, aes(x= model, y=value, fill= Coefficient, group=model)) +
  geom_bar(stat="identity", position="identity", alpha=1) + #This line draw the distant skyscrapers
  scale_fill_manual(values=colorFit) +
  scale_x_discrete(limits= c("m0F","m1F","m2F")) +
  scale_y_continuous(label=scales::comma) +
  coord_cartesian(ylim=c( min(ds$value), max(ds$value) )) + 
  guides(fill=guide_legend(title=NULL)) + 
  labs(x=NULL, y="Misfit")
g

enter image description here

问题:

如何用对应于每个系数值的线替换条形? (条形图的顶部)。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

这会解决你想要的问题吗?第一部分主要将离散变量转换为数字变量。该因子的ordered部分不是必需的,但我喜欢它如何强化它在轴上线性化。如果字母顺序与您想要的不匹配,调用factor()也是改变排序的好机会。

barWidth <- .9
ds$modelF <- factor(ds$model, ordered=TRUE)
factorLevels <- levels(ds$modelF)
ds$modelID <- match(ds$modelF, factorLevels)
ds$x <- ds$modelID
ds$xstart <- ds$modelID - barWidth/2
ds$xend <- ds$modelID + barWidth/2
ds$label <- scales::comma(ds$value)

绘制图表时,请确保自上面定义factorLevels以来因子变量未发生变化。

ggplot2::ggplot(ds, aes(x=xstart, xend=xend, y=value, yend=value, color=Coefficient, label=label, group=model)) +
  geom_segment(size=2) +
  geom_text(aes(x=x), vjust=-.2, show_guide=FALSE) +
  scale_color_manual(values=colorFit) +
  scale_x_discrete(limits=factorLevels) + #Force to have discrete labels, but make sure the factor hasn't changed since this assignment.
  scale_y_continuous(label=scales::comma) +
  labs(x=NULL, y="Misfit")

enter image description here