本文分享了由Jaco-Ben Vosloo编写的关于AnyLogic的使用实践技巧,希望能为正在学习或使用AnyLogic的用户提供帮助。
原文:https://www.theanylogicmodeler.com/post/how-to-programmatically-redraw-a-charthttps://www.https://www.theanylogicmodeler.com/post/how-to-programmatically-redraw-a-chart
作者:Jaco-Ben Vosloo
更新:2022,Feb 15
阅读时间:4 min read
您是否曾经遇到过这样的情况:在 AnyLogic 中创建了一个图表,但在仿真过程中想更改图表的一个非动态设置?
例如,在时序图中,您想要更改时间窗口(或 x 轴的长度)以显示更多或更少的数据。 如果您想随时间显示一个变量,但您不知道时间是多少,这是个很典型的情况,例如:项目的持续时间、智能体的生命周期、智能体走过的距离等。
或者您想在运行时更改图表Y 轴的最大值?如果您有多个图表,并且希望它们都具有相同的最大 Y 轴,以便您可以轻松地直观地比较图表。
所有这些都是在设计时设置的,在仿真运行期间无法更改。 因此,您在设计期间所做的选择都被限制住了......
您有这样的经历吗?
我们以下面的模型为例进行详细说明。
我们有一个4名IT工程师组成的工作组,负责在新IT平台的实施项目中处理支持案例。一个项目要支持的案例数可能是1-100中的任何值,通常用户每天报告大约1个案例。我们想要测量积压支持案例的平均值。
这是一个超级简单的模型!
最后,我们需要一个时间图来显示 queueLength 数据……但是我们将时间窗口设置为什么?
100?—— 但是如果模型需要更长的时间来完成...
200?—— 但是如果只有 10 个支持案例怎么办……那么图表将 95% 为空白并且没有那么有用……
我们先选择 100 ,运行几次模型并查看图表。
效果还不错……但在第一张图表中,模型在第 110 天结束,所以我们丢失了 10 天的初始数据,无法在图表上查看……在第三张图表中,模型在10 天之前结束, 因此需要扩展数据详细地查看一下……
下面我们要用到的解决方法,在 AnyLogic 中的许多其他实例也可以使用。让我们到幕后,看看 AnyLogic 在后台为我们做了什么。
在您构建模型、机械地拖放时,AnyLogic 正在秘密地努力在后台创建 Java 程序。
想要您一睹究竟,您只需单击绘图中的输入字段并按 Ctrl+j(对于 Windows)和 Cmd+j(在 Mac 上)即可查看对象背后的代码。
现在,我们需要做的就是将代码复制到函数中,添加一两个东西,然后我们就可以完全控制我们的图表了!
Step 1: 创建一个函数——并粘贴您从后台获取的代码——您可能需要对其进行一些格式化......
Step 2: 将看到时间窗口输入的新 TimePlot() 函数的参数更改为 roundToInt(time()) 以确保它始终显示为最新的模型时间。
Step 3: 每次智能体进入sink时调用该函数
Step 4: 运行模型
如果没有任何变化...
Step 5: 添加presentation.add(plot); 到函数末尾
然后,运行模型,发现现在绘制的图与模型运行的天数一样多了...
Step 6: 将创建的图保存到外部变量中,并在每次绘制新图之前将其删除。 请参阅下面代码中的第一行和最后一行。
完成!
这个例子可能很简单,但这里有两个关键要点:
1.在AnyLogic后台您可以看到为您生成的逻辑代码,并将其用于您的功能(使用代码绘制图表只是众多用例中的一个)
2.通过重新绘制图表,可以克服静态参数对图表的任何限制
您可以下载示例模型,或者在云中查看和下载源代码