【问题标题】:Problems passing arguments to ggplot in R script在 R 脚本中将参数传递给 ggplot 的问题
【发布时间】:2017-01-25 20:07:54
【问题描述】:

我试图弄清楚我在将参数传递给 ggplot 时做错了什么。我在现有帖子上已经走了很长一段路,但在这里碰壁了。可能有些愚蠢,但这里有(我省略了一些情节格式,因为这不是问题所在):

融化的数据集“lagres”在两种情况下都是相同的。

> str(lagres)
 'data.frame':  30 obs. of  4 variables:
  $ ST      : Factor w/ 3 levels 
  $ year    : Factor w/ 6 levels 
  $ variable: Factor w/ 2 levels 
  $ value   : num  

第一次绘图调用效果很好:

ggplot(lagres, aes(quarter, value, group = interaction(ERTp, variable), linetype = variable, color = ERTp, shape = variable ))

尝试将其转换为接受参数并在 for 循环脚本中重复使用是行不通的,即使结构实际上是相同的:

timevar <- "quarter"
grpvar  <- "ERTp"
fplot       <- function(lagres, timevar, grpvar, ylb, tlb){
plot <- ggplot(lagres, aes_string(x=timevar, y="value", group = interaction("variable", grpvar), linetype = "variable", color = grpvar, shape = "variable")) +
  geom_line(size = 0.5) + geom_point(size = 3) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + labs(y = ylb) +
  ggtitle(paste(tlb, grpvar, today, sep = ", ")) +
  theme(plot.title = element_text(lineheight = .8, face = "bold", hjust = 0.5))

fplot(lagres, timevar, grpvar)

错误:geom_path:如果您使用的是虚线或虚线,颜色, 大小和线型必须在整个线上保持不变

问题似乎出在“线型”参数上,因为删除它会在值/颜色方面产生适当的图形,但线连接错误,显然每个变量/grp 没有单独的线。

试图通过查看参数的结构来进一步分析问题,看起来 aes() 和 aes_string() 以不同的方式解析组交互。也许这就是问题所在。用原始变量解析“aes()”公式,我得到:

> str(aes(quarter, value, group = interaction(ERTp, variable),  linetype = variable, color = ERTp, shape = variable ))
List of 6
 $ x       : symbol quarter
 $ y       : symbol value
 $ group   : language interaction(ERTp, variable)
 $ linetype: symbol variable
 $ colour  : symbol ERTp
 $ shape   : symbol variable

然后,带有引用参数的“aes_string()”方法:

> str(aes_string(timevar, "value", group = interaction(grpvar,  "variable"), linetype = "variable", color = grpvar, shape = "variable" ))
List of 6
 $ group   : Factor w/ 1 level "ST.variable": 1
 $ linetype: symbol variable
 $ colour  : symbol ST
 $ shape   : symbol variable
 $ x       : symbol quarter
 $ y       : symbol value

那么,让小组成为“语言交互”还是 1 级因素,会有所不同吗?无法弄清楚如何处理该解析问题,以便正确进行组交互。在某处看到可以使用“paste()”,但是,不,这不起作用。传递所有参数(因此,在 aes_string() 公式中没有引用文本)也无济于事。

> dput(lagres)
structure(list(ST = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 3L, 1L, 2L, 
3L, 2L, 3L, 1L, 3L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label =   c("GeraghtyM", 
"Other", "WeenJ"), class = "factor"), quarter = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 
6L, 7L, 7L, 7L, 1L, 2L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L, 
6L, 7L, 7L, 7L), .Label = c("2015-Q2", "2015-Q3", "2015-Q4", 
"2016-Q1", "2016-Q2", "2016-Q3", "2016-Q4"), class = "factor"), 
variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label =         c("ScanLag", 
"TPADoorToLag"), class = "factor"), value = c(45.3333333333333, 
60.2857142857143, 37.6, 0, 51.375, 95.4166666666667, 26.8, 
42.75, 200, 28, 134, 68.2941176470588, 29, 42.8, 140.7, 0, 
49.2222222222222, 103.833333333333, 0, 20.125, 0, 67.75, 
48, 87, 93, 78, 49.5, 55, 65.6, 83, 59, 54, 153, 114, 111, 
83, 8.66666666666667)), .Names = c("ST", "quarter", "variable", 
"value"), row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 24L, 25L, 
26L, 27L, 29L, 30L, 31L, 33L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 
42L), class = "data.frame", na.action = structure(c(22L, 23L, 
28L, 32L, 34L), .Names = c("22", "23", "28", "32", "34"), class =           "omit"))

【问题讨论】:

  • 啊,尽量避免拼写错误,但最后一段应该说“livetype”arg,而不是 livetype。对不起
  • 自动拼写检查,我猜是:“linetype”
  • 请通过包含更多绘图代码(如代码的geom_path 部分)和数据集的一个小示例来使您的问题可重现。有关如何向问题添加数据的一些示例,请参阅 here
  • 添加代码和数据,HTH,谢谢!

标签: r ggplot2 arguments


【解决方案1】:

aes_string 没有读取您正在使用的interaction 代码。避免这种情况的一种方法是在绘图之前在函数内的数据集中创建一个新的“交互”变量。

例如:

fplot <- function(lagres, timevar, grpvar){
    lagres$combine = interaction(lagres[["variable"]], lagres[[grpvar]])
    plot <- ggplot(lagres, aes_string(x=timevar, y="value", 
                                      group = "combine", linetype = "variable", 
                                      color = grpvar, shape = "variable")) +
        geom_line(size = 0.5) + 
        geom_point(size = 3) 
    plot
}

【讨论】:

  • 优秀!非常感谢!如果可以的话,请给我一个评论/链接,以便我更好地理解“语言交互(ERTp,变量)”的含义以及 aes 如何/为什么以不同的方式解析它。但是,你真的帮我走出了这个坑。非常感谢。
  • @DocWeen 本质上aes_string 期望变量名写成字符,所以aes_string 中的整个interaction 代码需要是一个字符。但是interaction 需要非字符变量名。有关相关问题和答案,请参阅 here。另外,如果我的回答帮助您解决了问题,您可以点击它旁边的复选标记。
猜你喜欢
  • 1970-01-01
  • 2018-08-05
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 2019-11-01
相关资源
最近更新 更多