【问题标题】:geom_polygon to draw normal and logistic distributionsgeom_polygon 绘制正态分布和逻辑分布
【发布时间】:2011-09-19 16:21:42
【问题描述】:

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

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

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    我会使用 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)
    

    【讨论】:

      【解决方案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))
      

      为清晰起见进行了编辑

      您可以通过添加具有正确值的点来对其进行修改,使其仅下降到您想要的程度。例如,我强制逻辑分布一直填充到零。您可以通过rbinding 最小正态密度值来使其与正态分布保持一致。此外,请注意将它们添加到数据框中的位置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))
      

      就个人而言,我更喜欢这个而不是 coord_cartesian,因为我是一个坚持从零开始我的轴的人。

      【讨论】:

        【解决方案3】:

        解决方法是使用

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

        【讨论】:

          【解决方案4】:

          我运行了你的代码,然后分析了 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

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

          【讨论】: