使用ggplot aes_string,group和linetype时出现问题

时间:2013-10-16 18:16:27

标签: r ggplot2

假设我有这个数据集:

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,因为我有很多变量要绘制。

2 个答案:

答案 0 :(得分: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()的内容只是一个小错误,导致它以一种顺序评估事物,使得它看起来像你要求不同的美学虚线/虚线。

答案 1 :(得分:2)

你几乎在那里定义

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

但是,要使aes_string起作用,您需要传递一个字符串,如果您正在调用aes,那么该字符串将起作用,即您不需要在{{1}内使用参数作为字符串。您想要创建一个字符串interaction。因此

"interaction(line.color, line.type)"