在R脚本中将参数传递给ggplot的问题

时间:2017-01-25 20:07:55

标签: r ggplot2 arguments

我正在试图弄清楚我把错误传递给ggplot的错误。我已经在现有职位上走了很长一段路,但在这里已经碰壁了。可能是一些愚蠢的东西,但是这里(我正在遗漏一些情节格式,因为那不是问题所在):

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

Error CS0012    The type 'Window' is defined in an assembly that is not referenced. You must add a reference to assembly 'PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.

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

> 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  

enter image description here

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

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

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

问题似乎在于“linetype”arg,因为删除它会在值/颜色方面产生合适的图形,但是连接错误的线条,并且每个变量/ grp显然没有单独的行。

Plot looks like this:

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

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)

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

> 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

因此,让小组成为“语言互动”与1级因素,会有所不同吗?无法弄清楚如何解决该解析问题,以便正确地进行组交互。看到可以使用“paste()”的地方,但是,不,这不起作用。传递所有参数(因此,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 个答案:

答案 0 :(得分:0)

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
}