2013-07-20 38 views
7

我必须编写自己的函数来绘制二项分布的密度函数,因此当n = 20和p = 0.1,0.2,...,0.9时绘制合适的图。另外我需要对图表进行评论。R,二项分布图

我试过了;

graph <- function(n,p){ 
       x <- dbinom(0:n,size=n,prob=p) 
       return(barplot(x,names.arg=0:n)) 
      } 


    graph(20,0.1) 
    graph(20,0.2) 
    graph(20,0.3) 
    graph(20,0.4) 
    graph(20,0.5) 
    graph(20,0.6) 
    graph(20,0.7) 
    graph(20,0.8) 
    graph(20,0.9) 

    #OR 
    graph(20,scan()) 

我的第一个问题:有没有什么办法让我不需要行graph(20,p)几次写下来,除了使用scan()

我的第二个问题:

我想看到的图表在一个设备或想打ENTER看到下图。我写了

par(mfcol=c(2,5)) 
    graph(20,0.1) 
    graph(20,0.2) 
    graph(20,0.3) 
    graph(20,0.4) 
    graph(20,0.5) 
    graph(20,0.6) 
    graph(20,0.7) 
    graph(20,0.8) 
    graph(20,0.9) 

但图表太小。我怎样才能很好地给出头部线条n = 20和p =我用来绘制图形的值?[虽然可以通过在调用函数之后编写mtext()来完成,但是这样做我必须写出类似的线数次。所以我想要做到这一点,包括功能。 ]

我最后一个问题:

关于评论。图表显示,随着成功概率的增加,图形正在向右倾斜,也就是说,图形是右倾斜的。

有什么方法可以使用program来评论图吗?

+0

考虑一个循环或'lapply'来通过p的几个值。 – Thomas

回答

4

这里有一个mapply的工作,因为你循环了2个变量。

graph <- function(n,p){ 
    x <- dbinom(0:n,size=n,prob=p) 
    barplot(x,names.arg=0:n, 
     main=sprintf(paste('bin. dist. ',n,p,sep=':'))) 
} 
par(mfcol=c(2,5)) 
    mapply(graph,20,seq(0.1,1,0.1)) 

enter image description here

+1

'sapply(seq(0.1,1,0.1),图形,n = 20)'也可以工作 –

2

绘制图形的基础是你经常要使用for循环的时期之一。原因是因为大多数绘图函数都是在不可见的情况下返回一个对象,但是您对这些对象并不感兴趣。所有你想要的是绘图的副作用。循环会忽略返回的obects,而*apply家庭会浪费精力收集并返回它们。

par(mfrow=c(2, 5)) 
for(p in seq(0.1, 1, len=10)) 
{ 
    x <- dbinom(0:20, size=20, p=p) 
    barplot(x, names.arg=0:20, space=0) 
} 
+0

对不起,我担心这是模棱两可的......“大多数[基本绘图函数]都会隐式返回一个对象” ?我认为这很具误导性,而且通常是不正确的。当提到基本绘图函数时,认为for-loops“忽略返回的对象”也是不正确的。 –

+0

上下文是基本图形的使用,所以我认为OP需要指定窄边距的帮助。 –