【问题标题】:How do I plot a distribution curve over a histogram in NetLogo?如何在 NetLogo 中绘制直方图上的分布曲线?
【发布时间】:2018-08-06 22:49:06
【问题描述】:

我正在 NetLogo 中为蜜蜂的食物交换编写一个简单的模型。我绘制了一个直方图,以显示蜜蜂在每个刻度上具有不同食物量的分布。现在我想绘制一条覆盖直方图的正态分布曲线,每次我运行我的模型时,即一条适合直方图条的曲线。我用一支笔用这个命令来绘制我的直方图:histogram [food] of turtles 并且还写了一个这样的函数来添加另一支笔:

to draw-PDF
  set-current-plot "OVERALL FOOD DISTRIBUTION"
  create-temporary-plot-pen "normal"
  set-plot-pen-color red
  plot-pen-down
  let distsd sqrt ( variance ([food] of turtles) )
  let distmean mean [food] of turtles
  let multconst Number_of_bees / distsd / sqrt(2 * pi)
  let expconst 2 * distsd ^ 2
  let b 0
  while [ b < Number_of_bees]
  [
    let f foodofeachbee b
    let exparg (- ((f - distmean) ^ 2)) / expconst
    let y multconst * exp(exparg)
    plotxy f  y ]
end

foodofeachbee 是我单独定义的记者。但是运行这个,我得到一个错误,说“你的模型太大而无法运行!”

有什么建议吗?

【问题讨论】:

  • 欢迎来到 StackOverFlow 请看stackoverflow.com/help/how-to-ask
  • 使用第二支绘图笔,您可以在同一绘图中绘制 PDF,您可以找到 here。但是您的直方图不会被标准化。
  • 感谢您的回答,艾伦。我将尝试按照您的建议绘制概率分布。但是您知道在 NetLogo 中实际标准化直方图的任何函数吗?

标签: plot histogram netlogo normal-distribution agent-based-modeling


【解决方案1】:

您将不得不为您的特定变量等修改此代码,但这里有一个完整的模型,它演示了如何做我认为您想要的。将此代码复制到一个空白模型中,并使用具有histogram [ value ] of turtles 和间隔为 0.05 的笔创建一个名为 Test 的图。该代码添加了第二支笔,其 pdf 由变量的均值和方差构成,并根据海龟的数量进行了调整。

您正在尝试为每只蜜蜂构造一个值。 pdf 与单个蜜蜂无关,因此绘图程序可以完全忽略它们,除非提取均值和方差所需的值。

turtles-own [value]

to testme
  clear-all
  create-turtles 100
  [ set value random-normal 0.5 0.1 ]
  plot-normalised
  reset-ticks
end

to plot-normalised
  let meanPlot mean [value] of turtles
  let varPlot variance [value] of turtles
  let mult (count turtles / 20)  / sqrt (2 * pi * varPlot)
  set-current-plot "Test"
  create-temporary-plot-pen "normal"
  set-plot-pen-color red
  plot-pen-down
  let stepper 0.025
  while [ stepper <= 1 ]
  [ plotxy stepper (mult * exp ( - ((stepper - meanPlot) ^ 2) / (2 * varPlot) ) )
    set stepper stepper + 0.05
  ]
end

基本上,此代码计算正在绘制的变量的均值和方差,并将 stepper 的特定值(即 x 坐标)提供给正态分布 pdf 函数以计算绘图的 y 值。

您必须为您的代码做的是用您要绘制的变量的minmax 替换此代码逐步执行的区间[0,1]。在mult值的计算中,可以看到count turtles / 20。这也需要更换。 20 是绘图间隔的长度(在本例中为 1)除以每个直方图条的宽度(在本例中为 0.05)。

所以最后一段代码看起来应该是这样的:

let mymin min [value] of turtles
let mymax max [value] of turtles
let stepper mymin + 0.025
while [ stepper <= mymax ]
[ plotxy stepper (mult * exp ( - ((stepper - meanPlot) ^ 2) / (2 * varPlot) ) )
  set stepper stepper + 0.05
]

【讨论】:

  • 感谢您的完整回答和所有解释。很有帮助。
猜你喜欢
  • 2014-03-19
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
相关资源
最近更新 更多