如何在Matplotlib pyplot图表中基于CSV文件添加执行时间范围?
解决CSV时间范围图表绘制问题
你遇到的问题很典型——直接用row[0]:row[1]这种切片语法往列表里塞时间范围是行不通的,因为切片是针对序列的操作,而且从CSV读出来的时间还是字符串类型,没法直接表示范围。要展示每个数据对应的开始-结束时间范围,我们可以换一种图表类型来实现,比如用水平线段或者条形图,下面是具体的解决方案:
第一步:先把时间字符串转成数值类型
首先,CSV读取的所有内容都是字符串,我们需要把开始时间(row[0])、结束时间(row[1])和传输字节数(row[6])转换成数值(整数或浮点数),这样才能进行计算和绘图。
方案1:用水平线段展示时间范围对应字节数
这种方式最直观,每个数据行对应一条水平线段,y轴是传输的字节数,x轴是时间,线段的左端是开始时间,右端是结束时间:
修改后的代码如下:
import matplotlib.pyplot as plt import csv # 初始化存储列表 start_times = [] end_times = [] bytes_transferred = [] with open('graph.csv','r') as csvfile : plots = csv.reader(csvfile, delimiter=',') # 跳过表头(如果你的CSV有表头的话,没有就注释掉这行) next(plots) for row in plots : # 转换为整数(如果时间是小数就用float) start = int(row[0]) end = int(row[1]) byte_count = int(row[6]) start_times.append(start) end_times.append(end) bytes_transferred.append(byte_count) plt.figure(figsize=(10,6)) # 绘制每个时间范围的水平线段 for y, x_start, x_end in zip(bytes_transferred, start_times, end_times): plt.hlines(y=y, xmin=x_start, xmax=x_end, color='blue', linewidth=2) # 可以在两端加上标记点,更清晰 plt.scatter(x_start, y, color='red', marker='o') plt.scatter(x_end, y, color='green', marker='s') plt.title("Input/Output graph of Virtual file system layer and ext4 layer read and writes.") plt.xlabel("time(ms)") plt.ylabel("bytes") plt.grid(axis='x', linestyle='--', alpha=0.7) plt.show()
方案2:用条形图展示时间跨度(适合强调时长)
如果更关注每个任务的持续时长,可以用条形图,条形的宽度是结束时间减开始时间,x轴是开始时间,y轴是字节数:
import matplotlib.pyplot as plt import csv start_times = [] durations = [] bytes_transferred = [] with open('graph.csv','r') as csvfile : plots = csv.reader(csvfile, delimiter=',') next(plots) # 跳过表头 for row in plots : start = int(row[0]) end = int(row[1]) duration = end - start byte_count = int(row[6]) start_times.append(start) durations.append(duration) bytes_transferred.append(byte_count) plt.figure(figsize=(10,6)) plt.barh(bytes_transferred, durations, left=start_times, color='skyblue') plt.title("Input/Output graph of Virtual file system layer and ext4 layer read and writes.") plt.xlabel("time(ms)") plt.ylabel("bytes") plt.grid(axis='x', linestyle='--', alpha=0.7) plt.show()
额外优化:用Pandas简化数据处理
因为你已经导入了Pandas,用它读取CSV会更高效,自动处理数据类型转换:
import matplotlib.pyplot as plt import pandas as pd # 读取CSV,指定列类型(假设时间和字节数都是整数) df = pd.read_csv('graph.csv', usecols=[0,1,6], names=['start_time', 'end_time', 'bytes'], dtype=int) plt.figure(figsize=(10,6)) for idx, row in df.iterrows(): plt.hlines(y=row['bytes'], xmin=row['start_time'], xmax=row['end_time'], color='blue', linewidth=2) plt.scatter(row['start_time'], row['bytes'], color='red') plt.scatter(row['end_time'], row['bytes'], color='green') plt.title("Input/Output graph of Virtual file system layer and ext4 layer read and writes.") plt.xlabel("time(ms)") plt.ylabel("bytes") plt.grid(axis='x', alpha=0.7) plt.show()
这样就能完美展示每个数据对应的时间范围啦,你可以根据自己的需求选择合适的图表类型~
内容的提问来源于stack exchange,提问作者Nagmat
相关产品推荐
相关产品推荐

