抖动geom_line()

时间:2012-06-02 21:22:38

标签: r plot ggplot2

有没有办法抖动geom_line()中的行?我知道它有点违背了这个情节的目的,但如果你有一个几行的情节,并希望它们都表明它可以很方便。可能是此可见性问题的其他解决方案。

请参阅下面的代码, jitter geom_line

A  <- c(1,2,3,5,1)
B  <- c(3,4,1,2,3)
id <- 1:5
df <- data.frame(id, A, B)


# install.packages(reshape2)
require(reshape2) # for melt
dfm <- melt(df, id=c("id"))

# install.packages(ggplot2)
require(ggplot2)
p1 <- ggplot(data = dfm, aes(x = variable, y = value, group = id, 
color= as.factor(id))) + geom_line() + labs(x = "id # 1 is hardly 
visible as it is covered by id # 5") + scale_colour_manual(values = 
c('red','blue', 'green', 'yellow', 'black')) 


p2 <- ggplot(subset(dfm, id != 5), aes(x = variable, y = value, 
group = id, color= as.factor(id))) + geom_line() + labs(x = "id # 
5 removed, id # 1 is visible") + scale_colour_manual(values = 
c('red','blue', 'green', 'yellow', 'black')) 

# install.packages(RODBC)
require(gridExtra)

grid.arrange(p1, p2)

3 个答案:

答案 0 :(得分:24)

你可以尝试

geom_line(position=position_jitter(w=0.02, h=0))

看看它是否运作良好。

答案 1 :(得分:14)

如果你只是想防止两条线完全重叠,现在有一种更好的方法:position_dodge(),“通过避开重叠来调整位置”。这比向任何线路添加抖动更好,即使它不需要也是如此。

使用position_dodge()

避免ggplot2行完全重叠

代码示例:

df<-data.frame(x=1:10,y=1:10,z=1:10);
df.m <- melt(df, id.vars = "x");
ggplot(df.m, aes(x=x,y=value,group=variable,colour=variable)) 
    + geom_line(position=position_dodge(width=0.2));

感谢position_dodge(),我们现在可以看到情节中有两行,这恰好恰好包含在内:

prevent line overlap in ggplot with position_doge

答案 2 :(得分:4)

我倾向于使用不同的线条样式,例如,一条蓝色的实线“透过”它上方的红色虚线。 然后,它确实取决于你想要给读者的东西。首先要记住数据应该是点和理论行,除非这会使事情变得混乱。除非y x值相同,否则更容易看到这些点。 (或者您可以将现有的jitter函数应用于x值)  接下来,如果您只想显示哪些运行在“捆绑”中并且哪些是异常值,则重叠无关紧要,因为两个异常值几乎不可能相等。

如果你想展示一堆接近平等的运行,你可能更愿意(也就是说,你的读者会更好地理解)将增量与平均值而不是实际值进行对比。