向R中的条形图添加正态分布

向R中的条形图添加正态分布,r,bar-chart,normal-distribution,R,Bar Chart,Normal Distribution,我想画一个直方图,然后用代表数据分布的正态分布覆盖它。但是,我的数据已经计算在内: df<- structure(list(trips = c(12955L, 36890L, 47035L, 48650L, 70910L, 93755L, 45315L, 16565L, 4725L, 9460L), dist.km = c(0.5, 2, 4, 8.5, 12.5, 17.5, 22.5, 27.5, 32.5, 42.5), share = c(0.03, 0.09, 0.12,

我想画一个直方图,然后用代表数据分布的正态分布覆盖它。但是,我的数据已经计算在内:

df<- structure(list(trips = c(12955L, 36890L, 47035L, 48650L, 70910L, 
93755L, 45315L, 16565L, 4725L, 9460L), dist.km = c(0.5, 2, 4, 
8.5, 12.5, 17.5, 22.5, 27.5, 32.5, 42.5), share = c(0.03, 0.09, 
0.12, 0.13, 0.18, 0.24, 0.12, 0.04, 0.01, 0.02)), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

两个问题:

  • 在这种情况下,有没有办法直接绘制直方图而不是使用
    barplot
  • 如何用适合我的数据的正态分布线覆盖此条形图

  • 这里有一个很好的链接来解决您的问题:

    回答您的问题:

    1-是的,您应该将dist.km和trips设为1个变量,然后调用函数hist(),但是使用数据格式,您的方式非常酷


    2-如链接所示,使用曲线()和直线()。

    这里有一个很好的链接来解决您的问题:

    回答您的问题:

    1-是的,您应该将dist.km和trips设为1个变量,然后调用函数hist(),但是使用数据格式,您的方式非常酷


    2-使用curve()和lines(),如链接所示。

    Q1:如果没有原始数据,则不能使用
    hist

    问题2:有些工作

    首先,
    条形图
    不提供离散的x轴。从图中可以清楚地看到,前两列(2-0.5=1.5)之间的间距与后两列(42.5-32.5=10)相同。通过查看
    条形图的(不可见)返回值,可以获得x轴中点:

    (barplot(df$share, names.arg=df$dist.km,
             col="orange", xlab="km", ylab="trips"))
    #       [,1]
    #  [1,]  0.7
    #  [2,]  1.9
    #  [3,]  3.1
    #  [4,]  4.3
    #  [5,]  5.5
    #  [6,]  6.7
    #  [7,]  7.9
    #  [8,]  9.1
    #  [9,] 10.3
    # [10,] 11.5
    
    尽管实际的点没有这样做,但这些点是等距的。这种等距离是因为R实际上假设的是分类数据,而不是连续数据

    为了补偿这一点,我们可以调整绘图的宽度或它们之间的空间。如果我们改变宽度,那么我们将把宽度与视觉重要性混为一谈,这是我们应该避免的,所以让我们使用“空间”:

    不幸的是,正如我们在上面第二个
    条形图的输出中看到的,x轴与数据的比例不同。幸运的是,它对我们来说仍然是连续的和线性的,所以我们只需要调整它。我们可以手动计算,但为了便于论证,这里有一个反向转换函数:

    func <- function(a) {
      (min(df$dist.km) - bp[1,1]) + # the offset, happens to be 0 here since
                                    # the first datapoint is exactly 0.5
        a * diff(range(bp[,1])) / diff(range(df$dist.km))
    }
    
    mu2 <- func(mu)
    sigma2 <- sigma
    c(mu2, sigma2)
    # [1] 16.472196  8.911899
    

    注意:作为
    curve
    的第一个参数,我们给出的函数调用需要
    x
    变量,尽管我们没有定义它。这在内部用于
    曲线
    ,并替换为值的实际向量。它可以是不同的,可能是通过
    曲线(dnorm(yy,…),xname=“yy”)

    美学上它不够高。。。我们可以按最大频率进行缩放:

    # start over
    bp <- barplot(df$share, names.arg=df$dist.km,
                  space = c(0, diff(df$dist.km)),
                  col="orange", xlab="km", ylab="trips")
    curve(dnorm(x, mean=mu2, sd=sigma2) / max(df$share),
          col = "red", lwd = 2, add=TRUE)
    
    #重新开始
    
    bpQ1:如果没有原始数据,则不能使用
    hist

    问题2:有些工作

    首先,
    条形图
    不提供离散的x轴。从图中可以清楚地看到,前两列(2-0.5=1.5)之间的间距与后两列(42.5-32.5=10)相同。通过查看
    条形图的(不可见)返回值,可以获得x轴中点:

    (barplot(df$share, names.arg=df$dist.km,
             col="orange", xlab="km", ylab="trips"))
    #       [,1]
    #  [1,]  0.7
    #  [2,]  1.9
    #  [3,]  3.1
    #  [4,]  4.3
    #  [5,]  5.5
    #  [6,]  6.7
    #  [7,]  7.9
    #  [8,]  9.1
    #  [9,] 10.3
    # [10,] 11.5
    
    尽管实际的点没有这样做,但这些点是等距的。这种等距离是因为R实际上假设的是分类数据,而不是连续数据

    为了补偿这一点,我们可以调整绘图的宽度或它们之间的空间。如果我们改变宽度,那么我们将把宽度与视觉重要性混为一谈,这是我们应该避免的,所以让我们使用“空间”:

    不幸的是,正如我们在上面第二个
    条形图的输出中看到的,x轴与数据的比例不同。幸运的是,它对我们来说仍然是连续的和线性的,所以我们只需要调整它。我们可以手动计算,但为了便于论证,这里有一个反向转换函数:

    func <- function(a) {
      (min(df$dist.km) - bp[1,1]) + # the offset, happens to be 0 here since
                                    # the first datapoint is exactly 0.5
        a * diff(range(bp[,1])) / diff(range(df$dist.km))
    }
    
    mu2 <- func(mu)
    sigma2 <- sigma
    c(mu2, sigma2)
    # [1] 16.472196  8.911899
    

    注意:作为
    curve
    的第一个参数,我们给出的函数调用需要
    x
    变量,尽管我们没有定义它。这在内部用于
    曲线
    ,并替换为值的实际向量。它可以是不同的,可能是通过
    曲线(dnorm(yy,…),xname=“yy”)

    美学上它不够高。。。我们可以按最大频率进行缩放:

    # start over
    bp <- barplot(df$share, names.arg=df$dist.km,
                  space = c(0, diff(df$dist.km)),
                  col="orange", xlab="km", ylab="trips")
    curve(dnorm(x, mean=mu2, sd=sigma2) / max(df$share),
          col = "red", lwd = 2, add=TRUE)
    
    #重新开始
    
    bp你发送的链接是当我有柱状图时,我正在寻找一种在条形图上绘制正态分布的方法,或者绘制柱状图(除了将我的数据更改为大型数据集之外),然后绘制正态分布。你发送的链接是当我有柱状图时,我正在寻找一种在条形图上绘制正态分布的方法,或者绘制直方图(除了将数据更改为大型数据集之外),然后绘制正态分布。
    # start over
    bp <- barplot(df$share, names.arg=df$dist.km,
                  space = c(0, diff(df$dist.km)),
                  col="orange", xlab="km", ylab="trips")
    curve(dnorm(x, mean=mu2, sd=sigma2) / max(df$share),
          col = "red", lwd = 2, add=TRUE)