AnyLogic新手求助:如何创建符合预期的Time Stack Chart
实现AnyLogic定时统计Agent状态的堆叠图表
结论
完全可以实现你需要的每60分钟统计一次Agent状态数量、并持续更新的堆叠图表效果。下面是具体实现步骤:
1. 改用定时触发的统计逻辑
你当前是在Agent离开Delay块时统计,属于事件触发,不符合"每60分钟定时统计"的需求,需要替换为定时事件:
- 在Main画布中拖拽一个Event块,设置触发类型为
Periodically,周期设为60分钟(注意匹配模型的时间单位,若模型用秒则填3600)。 - 在Event的「动作」栏编写统计代码,示例如下(假设你的Agent有
state枚举属性,且所有Agent都在agentPopulation集合中):// 统计各状态Agent数量 int state1Count = count(agentPopulation, a -> a.state == State.STATE_1); int state2Count = count(agentPopulation, a -> a.state == State.STATE_2); int state3Count = count(agentPopulation, a -> a.state == State.STATE_3); // 获取当前时间(转为小时格式,方便X轴展示) double currentHour = time() / 60;
2. 选择适配的图表类型
如果你的预期图表是每60分钟一个堆叠柱子的样式,建议使用Stacked Bar Chart而非Time Stack Chart:
- 拖拽Stacked Bar Chart到界面,设置X轴为时间点(比如上面的
currentHour),Y轴为Agent数量。 - 创建一个Dataset(在「数据」面板中添加),添加列:
time(数值型)、state1(整数型)、state2(整数型)、state3(整数型)。 - 在定时Event的动作代码末尾,将统计结果添加到Dataset:
dataset.add(currentHour, state1Count, state2Count, state3Count); - 绑定图表数据源:将Stacked Bar Chart的「数据集」设为你创建的dataset,X轴选择
time列,每个状态对应一个系列(比如系列1关联state1列)。
3. 持续更新的实现
只要定时Event每60分钟执行一次,就会自动把新的统计数据添加到Dataset,图表会自动刷新显示最新的堆叠柱子,实现持续更新。
4. 若坚持使用Time Stack Chart的适配方法
如果一定要用Time Stack Chart呈现定时更新的效果,可在定时Event中手动给图表的每个系列添加数据点:
// 给每个状态系列添加当前时间点的数值 timeStackChart.addPoint("状态1", time(), state1Count); timeStackChart.addPoint("状态2", time(), state2Count); timeStackChart.addPoint("状态3", time(), state3Count);
这种方式会让图表在每个小时点生成一个数据节点,呈现阶梯式的堆叠效果,也能满足定时统计的需求。
关键注意事项
- 确保Agent的
state属性在状态切换时(比如进入/离开Delay、状态图转换)被正确更新,否则统计结果会出错。 - 统计时要针对当前存在的Agent,使用
agentPopulation集合或getAllAgents(Agent.class)方法(根据你的模型结构选择),避免统计已销毁的Agent。
内容的提问来源于stack exchange,提问作者Kittinun Yenyueak
相关产品推荐
相关产品推荐

