以下数据:
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
如何用对应于每个系数值的线替换条形? (条形图的顶部)。有什么建议吗?
答案 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")