geom_polygon用于绘制正态和逻辑分布

时间:2011-09-19 16:21:43

标签: r ggplot2

更新:
我已经解决了我的问题。我在寻找

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(limits = c(1000,2000))但这不起作用

更新:

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

  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))

4 个答案:

答案 0 :(得分:3)

我会使用z-scores绘制它,从[-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

答案 1 :(得分:2)

它切断底部的原因是因为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

为清晰起见而编辑

您可以通过添加具有正确值的点来修改它以使其仅在您想要的位置下降。例如,我强迫物流配送一直填充到零。您可以通过rbind最小正常密度值使其与正态分布保持水平。另外,请注意在哪里将它们添加到数据框中。 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,因为我是一个从零开始我的轴的坚持者。

答案 2 :(得分:1)

解决方案是使用

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

答案 3 :(得分:0)

我运行了你的代码,然后分析了norm和logistic的值:

Rgames:mystat(dat $ logistic)

  min      max     mean   median

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

 sdev      skew kurtosis

2.96e-04 -1.33e-01 -1.4

Rgames:mystat(dat $ norm)

  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

因此,您的逻辑值实际上已正确绘制。正如其他答案所示,有更好的方法来创建基础数据。