基于matplotlib绘制多属性机器任务耗时图表的技术问询
多维度效率数据可视化方案(Matplotlib新手友好)
嘿,作为matplotlib新手,想要把包含machine、weights、sets和time的多维度数据可视化,选对图表类型就成功一半啦!我给你几个实用的方案,附带可直接运行的代码示例,你可以根据自己的需求调整~
1. 分组条形图(最推荐:直观对比同参数下的机器效率)
这个图表能把相同(weights, sets)参数组合下,不同机器的耗时放在同一组对比,谁快谁慢一目了然,完全匹配你的数据场景。
代码示例:
import matplotlib.pyplot as plt import pandas as pd # 把你的原始数据转成DataFrame(新手友好的格式) efficiency = [ {'weights': '25', 'sets': '5', 'time': '8.48', 'machine': 'a'}, {'weights': '100', 'sets': '25', 'time': '7.43', 'machine': 'a'}, {'weights': '25', 'sets': '5', 'time': '8.70', 'machine': 'b'}, {'weights': '100', 'sets': '25', 'time': '7.73', 'machine': 'b'}, {'weights': '25', 'sets': '5', 'time': '7.14', 'machine': 'c'}, {'weights': '100', 'sets': '25', 'time': '8.38', 'machine': 'c'}, {'weights': '25', 'sets': '5', 'time': '6.11', 'machine': 'd'} ] df = pd.DataFrame(efficiency) # 把time转成数值类型(不然没法绘图) df['time'] = df['time'].astype(float) # 生成参数组合标签(比如"25kg - 5组") df['param'] = df['weights'] + 'kg - ' + df['sets'] + ' sets' # 获取所有参数组合和机器列表 params = df['param'].unique() machines = df['machine'].unique() bar_width = 0.2 # 每组内条形的宽度 x = range(len(params)) # 参数组合的x轴位置 # 绘制分组条形 plt.figure(figsize=(10, 6)) for i, machine in enumerate(machines): # 筛选当前机器的数据 machine_data = df[df['machine'] == machine] # 按参数组合排序,保证x轴对齐 machine_data = machine_data.set_index('param').reindex(params) # 绘制条形 plt.bar([pos + i*bar_width for pos in x], machine_data['time'], width=bar_width, label=f'Machine {machine}') # 设置图表细节 plt.xlabel('Parameter Combination', fontsize=12) plt.ylabel('Time (minutes)', fontsize=12) plt.title('Task Time by Machine & Parameters', fontsize=14) plt.xticks([pos + bar_width*(len(machines)-1)/2 for pos in x], params, fontsize=10) plt.legend() plt.tight_layout() # 自动调整布局,防止标签被截断 plt.show()
2. 折线图(适合观察参数变化时的效率趋势)
如果你的数据后续会补充更多参数组合(比如不同重量/组数的测试),折线图能清晰展示同一机器在不同参数下的耗时变化趋势,也能对比不同机器的趋势差异。
代码示例:
import matplotlib.pyplot as plt import pandas as pd # 同样先转成DataFrame df = pd.DataFrame(efficiency) df['time'] = df['time'].astype(float) # 把weights转成数值,方便按顺序排序 df['weights'] = df['weights'].astype(int) df['sets'] = df['sets'].astype(int) # 按weights和sets排序 df = df.sort_values(['weights', 'sets']) plt.figure(figsize=(10, 6)) # 遍历每个机器,绘制折线+数据点 for machine in df['machine'].unique(): machine_data = df[df['machine'] == machine] # 用"weights-sets"作为x轴标签 x_labels = [f"{w}kg-{s}sets" for w, s in zip(machine_data['weights'], machine_data['sets'])] plt.plot(x_labels, machine_data['time'], marker='o', label=f'Machine {machine}') plt.xlabel('Parameter Combination', fontsize=12) plt.ylabel('Time (minutes)', fontsize=12) plt.title('Efficiency Trend Across Parameters by Machine', fontsize=14) plt.legend() plt.grid(alpha=0.3) # 添加网格,方便读数 plt.tight_layout() plt.show()
3. 热力图(适合快速定位最优/最差组合)
如果你的数据量比较大,热力图可以用颜色深浅直观展示不同机器+参数组合的耗时高低,红色代表耗时久(效率低),蓝色代表耗时短(效率高)。
代码示例:
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd df = pd.DataFrame(efficiency) df['time'] = df['time'].astype(float) df['param'] = df['weights'] + 'kg - ' + df['sets'] + ' sets' # 把数据转成透视表(适合画热力图的格式) heatmap_data = df.pivot(index='machine', columns='param', values='time') plt.figure(figsize=(10, 6)) # 绘制热力图,添加数值标注 sns.heatmap(heatmap_data, annot=True, cmap='coolwarm', fmt='.2f', cbar_kws={'label': 'Time (minutes)'}) plt.title('Task Time Heatmap (Machine vs Parameters)', fontsize=14) plt.tight_layout() plt.show()
小提示:
- 如果某个参数组合下某台机器没有数据(比如你的示例里machine d没有100kg-25sets的数据),绘图时会自动留白或显示NaN,不影响整体效果;
- 可以根据需求调整颜色主题(比如把
cmap='coolwarm'改成'viridis'); - 新手可以先从分组条形图入手,代码逻辑简单,效果直观。
内容的提问来源于stack exchange,提问作者Laxmikant
相关产品推荐
相关产品推荐

