如何从ggplot图中提取与外部变量的交互?

时间:2016-05-25 13:49:52

标签: r ggplot2

我有一个像这样定义的ggplot图:

x <- seq(0, 10, by = 0.1)
y1 <- cos(x)
y2 <- sin(x)
df1 <- data.frame(x = x, y = y1, type = "sin", id = 1)
df2 <- data.frame(x = x, y = y2, type = "cos", id = 2)
df3 <- data.frame(x = 2, y = 0.5, type = "constant", id = 3)
df4 <- data.frame(x = 4, y = 0.2, type = "constant", id = 4)

combined <- rbind(df1, df2, df3, df4)

ggplot(combined, aes(x, y, colour = interaction(type, id))) + geom_line() +
  geom_point(data = subset(combined, type == "constant"))

这非常有效,如下图所示: beautiful image, ugly legend

现在我想在变量中提取交互以便以后重复使用(例如,自定义图例样式或标签)。

我以一种非常天真的方式做到了这一点:

my.interaction <- interaction(combined$type, combined$id)

ggplot(combined, aes(x, y, colour = my.interaction)) + geom_line() +
  geom_point(data = subset(combined, type == "constant"))

但后来我有一个错误:

  

错误:美学必须是长度1或与数据(2)相同:   x,y,颜色

修改 这是我可以做的操作:编辑图例的线型

displayed <- levels(factor(my.interaction))
line.style <- rep(1, length.out = length(displayed))
line.style[grep("constant", displayed)] <- 0

有效:

ggplot(combined, aes(x, y, colour = interaction(type, id))) + geom_line() +
    geom_point(data = subset(combined, type == "constant")) +
    guides(colour=guide_legend(override.aes=list(linetype = line.style)))

beautiful image, better legend

那不是:

ggplot(combined, aes(x, y, colour = my.interation) + geom_line() +
    geom_point(data = subset(combined, type == "constant")) +
    guides(colour=guide_legend(override.aes=list(linetype = line.style)))

最后,我还可以编辑形状或图例标签(例如“Id:1 / Type:sin”或基于交互值的标签的任何其他高级转换)。

1 个答案:

答案 0 :(得分:0)

这个工作。在数据框中添加列有什么问题?

combined %>% mutate(my.interaction = paste(type, id, sep='.')) %>%
  ggplot(aes(x, y, colour = my.interaction)) + geom_line() +
  geom_point(data = subset(combined, type == "constant"))

TFS Source Control Explorer Extensions