ggplot折线图中的可变标签位置

时间:2015-01-31 16:00:41

标签: r ggplot2

我使用dplyr

创建了以下数据框摘要
structure(list(maxrep = c(7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L, 11L, 
11L, 12L, 12L, 13L, 13L, 14L, 14L, 15L, 15L, 16L, 16L, 17L, 17L, 
18L, 18L, 19L, 19L, 20L, 20L, 21L, 21L, 22L, 22L, 23L, 23L, 24L, 
24L, 26L, 26L), div = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("Premier Division", 
"Second Division"), class = "factor"), freq = c(1L, 10L, 4L, 
39L, 26L, 89L, 73L, 146L, 107L, 162L, 117L, 133L, 121L, 125L, 
116L, 91L, 110L, 65L, 95L, 43L, 75L, 38L, 43L, 24L, 38L, 16L, 
36L, 5L, 15L, 2L, 9L, 7L, 9L, 1L, 3L, 3L, 2L, 1L)), .Names = c("maxrep", 
"div", "freq"), class = c("grouped_df", "tbl_df", "tbl", "data.frame"
), row.names = c(NA, -38L))

我的目的是使用ggplot2绘制两条不同颜色的线条的线图,并为每个值绘制文字标签。

我做的是

ggplot(df, aes(x=maxrep, y=freq, colour=div)) +
geom_line() +
geom_text(aes(label=freq), vjust=-.5)

结果是

enter image description here

现在我的问题:图表中的所有标签都高于相应行中的点数。我想让不同颜色的标签处于不同的相对位置,例如线条上方青色的标签,以及线条下方红色的标签(即变量vjust)。有没有办法做到这一点?

另外,有没有办法在右边的颜色图例中读取字母a

2 个答案:

答案 0 :(得分:4)

如何分别绘制具有不同vjust值的线条?您可以在图例设置a中删除show_guide = FALSE

ggplot(df, aes(x=maxrep, y=freq, colour=div, label = freq)) +
    geom_line() +
    geom_text(data = df[df$div == "Second Division",], vjust=2, show_guide = FALSE) + geom_text(data = df[df$div == "Premier Division",], vjust=-2, show_guide = FALSE)

返回:

enter image description here

答案 1 :(得分:4)

在data.frame中创建一个包含vjust调整参数的新变量:

df$pos <- c(2, -2)[(df$div == "Premier Division")+1] 

您可以使用新的vjust向量在aes内拨打pos

ggplot(df, aes(x=maxrep, y=freq, colour=div)) +
    geom_line() +
    geom_text(aes(label=freq, vjust=pos))

pic