3

假设我有这个数据集:

x <- rnorm(1000)
y <- rnorm(1000, 2, 5)
line.color <- sample(rep(1:4, 250))
line.type <- as.factor(sample(rep(1:5, 200)))

data <- data.frame(x, y, line.color, line.type)

我试图通过 line.type 和 line.color 的交互来绘制 x 和 y 变量组。此外,我想使用 line.type 指定线型,​​使用 line.color 指定颜色。如果我写这个:

ggplot(data, aes(x = x, y = y, group = interaction(line.type, line.color), colour = line.color, linetype = line.type)) + geom_line()

它有效,但如果我尝试像这样使用 aes_string:

interact <- c("line.color", "line.type")
inter <- paste0("interaction(", paste0('"', interact, '"', collapse = ", "), ")")

ggplot(data, aes_string(x = "x", y = "y", group = inter, colour = "line.color", linetype = "line.type")) + geom_line()

我得到错误:

Error: geom_path: If you are using dotted or dashed lines, colour, size and linetype must be constant over the line

我究竟做错了什么?我需要使用 aes_string 因为我有很多变量要绘制。

4

2 回答 2

3

事实证明,我在上面的评论中有几个错误。这似乎有效:

data$inter <- interaction(data$line.type,data$line.color)
ggplot(data, aes_string(x = "x", y = "y", group = "inter",colour = "line.color",linetype = "line.type")) + geom_line()

(关于在单条虚线/点线内指定不同颜色等的图表,我完全错了。)

不过,我认为这是一个轻微的辩护,依靠解析interaction内部代码aes_string()通常是一个坏主意。我的猜测是,在 ggplot 尝试解析您aes_string()在复杂情况下给出的内容时,只是有一个小错误,这导致它按顺序评估事物,使您看起来像是在虚线/点线上要求不同的美学。

于 2013-10-16T18:54:18.007 回答
2

你几乎在那里定义

inter <- paste0("interaction(", paste0('"', interact, '"', collapse = ", "), ")")

但是,为了aes_string工作,您需要传递一个字符串,如果您正在调用它会起作用aes,也就是说,您不需要将参数interaction作为字符串包含在其中。你想创建一个字符串"interaction(line.color, line.type)"。所以

 inter <- paste0('interaction(', paste0(interact, collapse = ', ' ),')')
 # or
 # inter <- sprintf('interaction(%s), paste0(interact, collapse = ', '))
 # the result being
 inter
 ## [1] "interaction(line.color, line.type)"

 # and the following works
 ggplot(data, aes_string(x = "x", y = "y", 
    group = inter, colour = "line.color", linetype = "line.type")) + 
    geom_line()
于 2013-10-16T23:03:42.673 回答