在函数中的ggplot中更改图例顺序

时间:2019-08-21 14:31:46

标签: r ggplot2 rlang quasiquotes

我想在函数中绘制数据框。图例应以特定方式排序。为了使示例简单,我只颠倒了顺序。我实际上想选择一个特定的行并将其推到图例的最后一个位置。

以某种方式创建新的R包(如果有任何相关性)。

在函数外部进行绘图

attach(iris)
library(ggplot2)


# This is a normal plot
p <- ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, fill = Species) ) +
  geom_bar( stat = "identity")
p

# This is a plot with reversed legend
iris$Species <- factor(iris$Species, levels = rev(levels(iris$Species)))
p <- ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, fill = Species) ) +
  geom_bar( stat = "identity")
p

在函数内部绘图

最简单的方法就是使用变量,这显然行不通

f1 <- function(myvariable) {
  iris$myvariable <- factor(iris$myvariable, levels = rev(levels(iris$myvariable)))
  p <- ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, fill = Species) ) +
    geom_bar( stat = "identity")
  p
}
f1("Species")

 #> Error in `$<-.data.frame`(`*tmp*`, myvariable, value = integer(0)) : 
  replacement has 0 rows, data has 150 

我尝试使用准引号,但是这种方法只能让我绘制数据框。我还不能撤消订单。

library(rlang)
# Only plotting works
f2 <- function(myvariable) {
  v1 <- ensym(myvariable)
  p <- ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, fill = eval(expr(`$`(iris, !!v1))))) +
    geom_bar( stat = "identity")
  p
}
f2("Species")

# This crashes
f3 <- function(myvariable) {
  v1 <- ensym(myvariable)
  expr(`$`(iris, !!v1)) <- factor(expr(`$`(iris, !!v1)), levels = rev(levels(expr(`$`(iris, !!v1)))))
  p <- ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, fill = eval(expr(`$`(iris, !!v1))))) +
    geom_bar( stat = "identity")
  p
}
f3("Species")

#> Error in `*tmp*`$!!v1 : invalid subscript type 'language'

所以主要的问题是,我无法使用准引号分配某些内容。

1 个答案:

答案 0 :(得分:0)

几件事:

  • 您可以使用[[代替$来以编程方式访问数据框列。
  • 您可以使用ggplot的{​​{1}}在R CMD检查期间最小化注释(因为您提到自己正在打包)。
  • 您可以使用aes_string软件包中的fct_relevel将因子级别“发送”到末尾。

翻译为:

forcats