使用polygon填充正态分布图左尾10%,结果填充到了曲线上面,请问为什么?

mean.plus.sig<-17+4*4.5
mean.minu.sig<-17-4*4.5
least.ten<-qnorm(p=0.1,mean = 17,sd=4.5)
fx.ten<-dnorm(least.ten,mean=17,sd=4.5)
nor.data<-seq(mean.minu.sig,mean.plus.sig,length=50)
fx<-dnorm(nor.data,mean = 17,sd=4.5)
plot(nor.data,fx,type="l",xlim = c(mean.minu.sig-2,mean.plus.sig+2),
main = "Least 10% test time",xlab = "Test time x",ylab = "f(x)")
abline(h=0,col="gray")
abline(v=least.ten,lty=2)
least.data<-nor.data[nor.data<=least.ten]
least.fx<-dnorm(least.data,mean = 17,sd=4.5)
polygon(x=least.data,y=least.fx,border=NA,col="gray")

    24 天 后

    mean.plus.sig<-17+44.5
    mean.minu.sig<-17-44.5
    least.ten<-qnorm(p=0.1,mean = 17,sd=4.5)
    fx.ten<-dnorm(least.ten,mean=17,sd=4.5)
    nor.data<-seq(mean.minu.sig,mean.plus.sig,length=500)
    fx<-dnorm(nor.data,mean = 17,sd=4.5)
    plot(nor.data,fx,type="l",xlim = c(mean.minu.sig-2,mean.plus.sig+2),
    main = "Least 10% test time",xlab = "Test time x",ylab = "f(x)")
    abline(h=0,col="gray")
    abline(v=least.ten,lty=2)
    least.data<-nor.data[nor.data<=least.ten]
    least.fx<-dnorm(least.data,mean = 17,sd=4.5)

    #least.data2 = c(least.data, rep(max(least.data), 10) )
    #least.fx2 = c(least.fx, seq(max(least.fx), 0, length.out = 10) )
    #polygon(x=least.data2, y=least.fx2, border=NA, col="gray")

    #根据Jonie_Y 的建议改了终点和起始点坐标
    least.data3 = c(min(least.data), least.data, max(least.data) )
    least.fx3 = c(0, least.fx, 0)
    polygon(x=least.data3, y=least.fx3, border=NA, col="gray“)

    willdemon polygon会默认填充它围起来的区域,所谓的“围起来”,它的终点坐标和起点坐标会直接连起来。所以你起点坐标标和终点坐标最好是(xmin,0),(xmax,0),中间使用xmin和xmax中间的横坐标以及对应的dnorm(x)的纵坐标。不知道我解释清楚了没。

    你的填充

    中间使用xmin和xmax中间的横坐标以及对应的dnorm(x)的纵坐标。

    这个是没错的,问题在于

    所以你起点坐标标和终点坐标最好是(xmin,0),(xmax,0)

    但是你的起点和终点分别是(xmin,y_low),(xmax,y_high)它自动连起来就是曲线上面的部分了。

    修改一下你的代码,我只加了4行,标注了Jonie名字的那一块,其它的都是你的,你的不合理的我给注释掉了:

    ############## Plot Curve ########################
    mean.plus.sig<-17+4*4.5
    mean.minu.sig<-17-4*4.5
    nor.data<-seq(mean.minu.sig,mean.plus.sig,length=50)
    fx<-dnorm(nor.data,mean = 17,sd=4.5)
    plot(nor.data,fx,type="l",xlim = c(mean.minu.sig-2,mean.plus.sig+2),
         main = "Least 10% test time",xlab = "Test time x",ylab = "f(x)")
    
    ############## Add verticle and horizontal Line ###
    least.ten<-qnorm(p=0.1,mean = 17,sd=4.5)
    abline(h=0,col="gray")
    abline(v=least.ten,lty=2)
    
    ############## Generate shadow coordinate #########
    # Incorrect, because the x coordinate generated by  `nor.data[nor.data<=least.ten]` is much less than the real value "least.ten", and there would be a gap between shadow and verticle line.
    # You can decrease the gap distance by change the legnth parameter at the 4th line above from 50 to a larger value
    # But it is not correct also.
    # fx.ten<-dnorm(least.ten,mean=17,sd=4.5)            # This is not used by you
    # least.data<-nor.data[nor.data<=least.ten]
    # least.fx<-dnorm(least.data,mean = 17,sd=4.5)
    
    ###########Jonie: Generate x coordinate from minimum x to the verticle line ####
    least.data <- seq(mean.minu.sig, least.ten, length = 50)
    least.fx <- dnorm(least.data, mean = 17, sd = 4.5)
    least.data <- c(min(least.data),least.data,max(least.data))
    least.fx<-c(0,least.fx,0)
    
    ###########################################################################
    polygon(x=least.data,y=least.fx,border=NA,col="gray")