使用Ciw时为何可视化图表出现重复节点标签?
Ciw仿真后Pandas柱状图出现重复Node标签的解决方法
你遇到的问题本质是Pandas的plot.bar()默认会为DataFrame的每一行生成一个柱子,而你的slow_df中每个node对应多条记录(每个顾客在该节点的阻塞事件都会生成一行数据),所以x轴会重复显示node标签,尽管node的唯一值只有6个。
验证问题根源
可以先查看slow_df的记录数,确认每个node有多条数据:
print(len(slow_df)) # 结果远大于6,说明每个node对应多条阻塞记录
解决方法:先按Node聚合数据
要让每个node只显示一个柱子,需要先对数据按node分组,计算该节点的总阻塞时间、平均阻塞时间等统计值,再画图。修改后的完整代码如下:
import ciw import matplotlib.pyplot as plt import pandas as pd max_time = 20 # Routing Matrix R = [[0]*7 for i in range(7)] R[0][1] = 1 R[1][0] = 1/3 R[1][2] = 1/3 R[1][3] = 1/3 R[2][1] = 1 R[3][1] = 1/2 R[3][5] = 1/2 R[5][3] = 1/3 R[5][4] = 1/3 R[5][6] = 1/3 R[6][5] = 1/2 # Arrival dists arr_dists = [ciw.dists.Exponential(1/10)] * 3 + [None] * 4 N = ciw.create_network( arrival_distributions=arr_dists, service_distributions=[ciw.dists.Exponential(1)] * 7, routing=R, number_of_servers=[1]*7, queue_capacities=[1]*7 ) ciw.seed(2018) Q = ciw.Simulation(N) Q.simulate_until_max_time(max_time) slow_df = pd.DataFrame(Q.get_all_records()) # 关键步骤:按node分组,计算总阻塞时间(也可以用mean()计算平均阻塞时间) grouped_df = slow_df.groupby('node')['time_blocked'].sum().reset_index() # 绘制柱状图 grouped_df.plot.bar(x='node', y='time_blocked'); plt.show()
补充说明
- 你之前检查的
slow_df.node.unique()仅展示node的唯一值,但不代表每个node只有一条记录,这是导致误解的核心原因。 - 如果确实需要保留每条记录的柱子但不想x轴重复显示标签,可以手动设置x轴刻度,但这种场景下聚合后展示节点的整体阻塞情况,通常更符合仿真分析的需求。
内容的提问来源于stack exchange,提问作者Galen
相关产品推荐
相关产品推荐

