You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:32:54