2016-02-26 97 views
0

我想在R中使用ggplot绘制2个ACFs。我使用geom_segment(),它工作正常,但有一点烦人的细节是,根据我声明geom_segment的顺序,如果我在最大值之前声明它们,图形会覆盖最小的ACF。如果一个ACF总是有一个更大的值,那么这就不成问题了(以前我会用geom_segment的情况)。我知道这听起来有点混乱,所以这里是一个工作示例:绘制2个ACFs ggplot2 - 显示最小值颜色

library(ggplot2) 
library(grid) 
library(plyr) 

set.seed(123) 
data1 <- arima.sim(n = 10000, model = list(ar = 0.4,ma=0.4)) 
data2 <- arima.sim(n = 10000, model = list(ma = c(0.9,0.3))) 

acf1 <- acf(data1, plot = FALSE,lag.max=15) 
acf1DF <- with(acf1, data.frame(lag, acf)) 
acf1DF$lag <- as.integer(acf1DF$lag) 
acf2 <- acf(data2, plot = FALSE,lag.max=15) 
acf2DF <- with(acf2, data.frame(lag, acf)) 
acf2DF$lag <- as.integer(acf2DF$lag) 

q <- ggplot(data = acf1DF, mapping = aes(x = lag, y = acf)) + 
    geom_hline(aes(yintercept = 0)) + 
    geom_segment(mapping = aes(xend = lag, yend = 0,color="red")) + 
    geom_segment(data=acf2DF,mapping = aes(x=lag,y=acf,xend = lag, yend = 0), 
    inherit.aes=FALSE,show.legend=FALSE) 
q 

注意,我看不到的最小值为先滞后。

谢谢。

回答

3

它会成为您创建barplot的解决方案吗?分段重叠的问题会使您的情节变得不那么容易理解,可能会指向使用不同的可视化方案作为解决方案。这里是一个barplot:

首先,我们将数据结合在ggplot中,当你多次调用geom时,你没有做正确的事情。

acf1DF$group <- 1 
acf2DF$group <- 2 

dat <- rbind(acf1DF,acf2DF) 

然后,我们可以做一个barplot:

p1 <- ggplot(dat,aes(x=factor(lag), y=acf,fill=factor(group))) + 
    geom_bar(width=0.3,stat="identity", position=position_dodge()) 

enter image description here 或者,如果我们真的要细分,而不是棒(例如,因为我们希望有一个连续的x轴,或类似的外观线作为图例),我们可以绘制

dat$lag_offset <- dat$lag + as.numeric(dat$group==2) * 0.1 

然后情节段之前添加轻微偏移组2滞后:

p2 <- ggplot(dat, aes(x=lag_offset, xend=lag_offset, y=0,yend=acf, color=factor(group))) + 
    geom_segment() + 
    scale_color_manual(values=c(`1`="black",`2`="red")) 

enter image description here

+0

非常感谢;我开始获得ggplot数据安排的要点。 – user191919

+0

不客气!我知道一次查看您的数据int格式是非常有用的。并且知道如何将数据转换成形状ggplot想要它(长时间,一行上的数据点的所有信息)将使您的ggplot生活更容易。 – Heroka