使用ggplot进行条件文本格式化

时间:2011-11-15 13:05:00

标签: r ggplot2

我已经很好地浏览了这个网站以及其他人如何根据特定列中的值来设置hjust和vjust。以下显示了数据的结构(但多年来是许多条目的简化子集):

    YearStart <- c(2001,2002,2003,2001,2002,2003)
    Team <- c("MU","MU","MU","MC","MC","MC")
    Attendance <- c(67586,67601,67640,33058,34564,46834)
    Position <- c(3,1,3,1,9,16)
    offset <-c()

    df <- data.frame(YearStart,Team,Attendance,Position)

所以

> head(df)
  YearStart Team Attendance Position
1      2001   MU      67586        3
2      2002   MU      67601        1
3      2003   MU      67640        3
4      2001   MC      33058        1
5      2002   MC      34564        9
6      2003   MC      46834       16

我想要实现的是基于团队的 vjust 值。在下面, MU vjust = 1而 MC vjust = - 1所以我可以控制数据标签位于与之关联的数据组中的位置。

我试图破解使用包含查找表的函数的几个示例(它不是直接的ifelse,因为我有很多 Team 的值)但是我似乎无法通过aes方法将字符串传递给函数:

lut <- list(MU=1,MC=-1)
vj <-function(x){lut[[x]]}
p=ggplot(df, aes(YearStart, Attendance, label=Position, group=Team))+
   geom_point()+
   geom_text(aes(vjust = vj(Team) ) )
print(p)

以下是伪(ish)代码,它在点的上方和下方的每个位置对每组应用标签两次。

p=ggplot(df, aes(YearStart, Attendance, label=Position, group=Team))+
   geom_point()+
   geom_text(aes(Team="MU"), vjust=1)+
   geom_text(aes(Team="MC"), vjust=-1)
print(p)

我已经尝试了其他几种策略,我无法判断我是从错误的方向尝试这个,还是我错过了一个非常简单的ggplot语法。我通过在Excel中手动标记它们来完成了一个临时解决方案,但这是不可持续的: - )

1 个答案:

答案 0 :(得分:5)

要指定审美,审美应该是data.frame中的一列。

(另请注意,您的查找功能应该有单括号,而不是双精度。)

最后一点:vjusthjust严格仅在[0, 1]之间定义左/右和右/顶对齐。然而,在实践中,通常可以扩展它。在大多数情况下,我发现(-0.2, 1.2)的设置效果很好。

lut <- list(MU=-0.2, MC=1.2)
vj <- function(x) lut[x]

df$offset <- vj(df$Team)

library(ggplot2)
ggplot(df, aes(YearStart, Attendance, label=Position, group=Team)) +
    geom_point(aes(colour=Team)) +
    geom_text(aes(vjust = offset))

enter image description here