ggplot中的轴/变量标签的键-值映射

时间:2018-07-09 03:58:29

标签: r ggplot2

我经常使用具有“ R友好” /“程序员友好”列名的数据框,通常没有空格和/或缩写(在分析时不愿输入全名)。例如:

ir <- data.frame(
   sp=iris$Species,
   sep.len=iris$Sepal.Length,
   sep.wid=iris$Sepal.Width,
   pet.len=iris$Petal.Length,
   pet.wid=iris$Petal.Width
)

当我用ggplot绘制这些标签时,我经常想用“用户友好”列名称替换标签,例如

p <- ggplot(ir, aes(x=sep.len, y=sep.wid, col=sp)) + geom_point() +
  xlab("sepal length") + ylab("sepal width") + 
  scale_color_discrete("species")

问题:是否有一些方法可以指定要传递给ggplot的标签映射?

lazy.labels <- c(
  sp     ='species',
  sep.len='sepal length',
  sep.wid='sepal width',
  pet.len='petal length',
  pet.wid='petal width'
)

做类似的事情

p + labs(lazy.labels)

甚至

p + xlab(lazy.labels[..x..]) + ylab(lazy.labels[..y..])

其中..x....y..是一些自动ggplot变量,其中包含当前X / Y变量的名称? (然后,我可以将这些注释放入便捷函数中,而不必为每个图形进行更改)

当我在报告中绘制多个图时,这特别有用。我总是可以使用“用户友好”列重命名ir,但随后我不得不做很多

ggplot(ir, aes(x=`sepal length`, y=`sepal width`, ...

由于所有空格,这有点麻烦。

2 个答案:

答案 0 :(得分:4)

我深入研究了ggplot对象,并提出了这一点:好处是您不需要预先知道映射

library(ggplot2)

ir <- data.frame(
  sp = iris$Species,
  sep.len = iris$Sepal.Length,
  sep.wid = iris$Sepal.Width,
  pet.len = iris$Petal.Length,
  pet.wid = iris$Petal.Width
)

p <- ggplot(ir, aes(x=sep.len, y=sep.wid, col=sp)) +
     geom_point() +
     scale_color_discrete("species")


## for lazy labels

lazy.labels <- c(
  sp     ='species',
  sep.len='sepal length',
  sep.wid='sepal width',
  pet.len='petal length',
  pet.wid='petal width'
)

p$labels <-lapply(p$labels,function(x){as.character(lazy.labels[x])})

或者,使用函数:

plot_with_labels <- function(p, l) {
  p$labels <- lapply(p$labels, function(x) { as.character(l[x]) } )
  return(p)
}

plot_with_labels(p, lazy.labels)

答案 1 :(得分:1)

如果您的图形始终不变,一种解决方案是使用列表将美学效果映射到新名称以预先替换默认名称,从而提前创建标签 。那么你就可以 使用ratechange

labs(lazy.labels)

reprex package(v0.2.0)于2018-07-09创建。