2011-09-19 280 views
1

更新:
我已经解决了我的问题。我正在寻找geom_polygon绘制正常和逻辑分布

coord_cartesian(xlim = c(800, 2100), ylim = c(0, 0.0021)) 

感谢每一位试图帮助!

问题是:
我想绘制一个正常和逻辑分布之间的区别是一个很好的图片。我已经达到了这一点:

x=seq(1000,2000,length=200) 
dat <- data.frame(
    norm = dnorm(x,mean=1500,sd=200), 
    logistic = dlogis(x,location=1500,scale=200), x = x 
) 
ggplot(data=dat, aes(x=x)) + 
    geom_polygon(aes(y=norm), fill="red", alpha=0.6) + 
    geom_polygon(aes(y=logistic), fill="blue", alpha=0.6) + 
    xlab("") + ylab("") + 
    opts(title="Logistic and Normal Distributions") + 
    scale_x_continuous(expand = c(0, 0)) + 
    scale_y_continuous(expand = c(0, 0)) 

但逻辑的一个是“切”在底部。我认为我应该做的就是绘制这个分布从0到3000例如但只显示1000-2000。

任何线索如何做到这一点?

我试图scale_x_continuous(限= C(1000,2000)),但是,这并不工作

UPDATE:

我已经更新了我的代码,所以我的传说,现在它看起来是这样的:

x=seq(700,2300,length=200) 
    dat2 <- data.frame(x=x) 
    dat2$value <- dnorm(x,mean=1500,sd=200) 
    dat2$type <- "Normal" 

dat1 <- data.frame(x=x) 
dat1$value <- dlogis(x,location=1500,scale=200)  
dat1$type <- "Logistic" 

dat <- rbind(dat1, dat2) 

ggplot(data=dat, aes(x=x, y=value, colour=type, fill=type)) + geom_polygon(alpha=0.6) + scale_y_continuous(expand = c(0, 0)) 

回答

1

的解决方案是使用

+ coord_cartesian(xlim = c(800, 2100), ylim = c(0, 0.0021)) 
1

它切断底部的原因是因为geom_polygon字面上吸引包括连接你给它点线的多边形。因此,分布底部的扁平线只是连接数据框中的第一个和最后一个值。如果你想它延伸到底层,你可以添加适当的点,你的数据帧:

ggplot(data=dat, aes(x=x)) + 
    geom_polygon(aes(y=norm), fill="red", alpha=0.6) + 
    geom_polygon(data = rbind(c(NA,0,1000),dat,c(NA,0,2000)),aes(y=logistic), fill="blue", alpha=0.6) + xlab("") + ylab("") + 
    opts(title="Logistic and Normal Distributions")+ 
    scale_x_continuous(expand = c(0, 0)) + 
    scale_y_continuous(expand = c(0, 0)) 

enter image description here

编辑的清晰度

你可以用这个鼓捣得到它只需要通过添加具有正确值的点来尽可能减少。例如,我强制逻辑分配完全填充到零。您可以改为使用正态分布的水平,而不是最小正态密度值。另外,请小心,其中您将它们添加到您的数据框中。 geom_polygon将按照它们出现的顺序连接点。这就是为什么我在数据框的开头添加一个,最后添加一个。

编辑2

根据修改后的代码,我的解决方案仍然能正常工作:

x=seq(700,2300,length=200) 
dat2 <- data.frame(x=x) 
dat2$value <- dnorm(x,mean=1500,sd=200) 
dat2$type <- "Normal" 

dat1 <- data.frame(x=x) 
dat1$value <- dlogis(x,location=1500,scale=200)  
dat1$type <- "Logistic" 

#Append extra points at the top/bottom to 
# complete the polygon 
dat1 <- rbind(data.frame(x=700,value=0,type = "Logistic"),dat1, 
       data.frame(x=2300,value=0,type = "Logistic")) 

dat <- rbind(dat1, dat2) 

ggplot(data=dat, aes(x=x, y=value, colour=type, fill=type)) + 
     geom_polygon(alpha=0.6) + 
     scale_y_continuous(expand = c(0, 0)) 

enter image description here

而且就个人而言,我宁愿这个在coord_cartesian,因为我一个坚持从零开始我的轴。

3

我会使用z得分从[-2; +2]。这有你的问题消失的副作用。

x=seq(-2,2,length=200) 
dat <- data.frame(
    norm = dnorm(x,mean=0,sd=0.2), 
    logistic = dlogis(x,location=0,scale=0.2), x = x 
) 
p <- ggplot(data=dat, aes(x=x)) + 
    geom_polygon(aes(y=norm), fill="red", alpha=0.6) + 
    geom_polygon(aes(y=logistic), fill="blue", alpha=0.6) + 
    xlab("z") + ylab("") + 
    scale_x_continuous(expand = c(0, 0)) + 
    scale_y_continuous(expand = c(0, 0)) + 
    opts(title="Logistic and Normal Distributions") 

print(p) 

enter image description here

0

我跑你的代码,然后分析了规范和物流的价值观:

Rgames:MYSTAT(DAT $后勤)

min  max  mean median 

3.51e-04 1.25e-03 8.46e-04 8.63e-04

2.96e-04 -1.33e-01 -1.4

Rgames:MYSTAT(DAT $规范)

min  max  mean median 

8.76e-05 1.99e-03 9.83e-04 9.06e-04

sdev  skew kurtosis 

6.62e-04 1.67e-01 -1.48

所以,你的逻辑值,其实正确绘制。正如其他答案显示的那样,有更好的方法来创建您的基础数据。