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

如何使用np.genfromtxt读取Dataframe而非文件并在Matplotlib中绘制含时间轴与状态的图表

解决Matplotlib时间轴绘图及状态展示问题

嘿,作为Matplotlib新手,你遇到的这个问题其实很常见——核心是用错了工具,而且有更简洁的方式实现你的需求!

先说说你出错的原因

你用np.genfromtxt来读取DataFrame是不对的,这个函数是用来读文本文件(比如.csv或.txt)的,直接传DataFrame会导致它把数据当成字节流处理,这就是为什么会报strptime() argument 1 must be str, not bytes的错误。其实你已经有现成的DataFrame了,完全不需要绕弯用np.genfromtxt,直接用pandas+Matplotlib就能搞定。

简便的实现方案

下面是一步到位的代码,既能处理时间轴,又能清晰展示不同状态的标记:

1. 先把时间列转成可识别的时间类型

pandas的pd.to_datetime比手动写strptime方便太多,直接把你的字符串时间转成Matplotlib能识别的时间格式:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# 假设你的DataFrame变量名是df
df['Zeitstempel'] = pd.to_datetime(df['Zeitstempel'], format='%d.%m.%Y %H:%M:%S')

2. 按状态分组绘制图表

为了区分PASS/FAIL/BLOCKED,我们给每个状态设置不同的颜色和标记,这样一眼就能看出对应时间点的状态:

# 定义状态和样式的映射,你可以根据喜好调整颜色和标记
status_style = {
    'PASS': {'color': 'forestgreen', 'marker': 'o'},
    'FAIL': {'color': 'firebrick', 'marker': 'X'},
    'BLOCKED': {'color': 'darkorange', 'marker': 's'}
}

# 创建图表
fig, ax = plt.subplots(figsize=(10, 6))

# 遍历每个状态,分别绘制数据点和连线
for status, style in status_style.items():
    # 筛选当前状态的数据
    filtered_data = df[df['Ergebnis'] == status]
    # 绘制折线+散点:ls='-'表示连线,marker是点的样式
    ax.plot(filtered_data['Zeitstempel'], filtered_data['indeces'],
            ls='-', marker=style['marker'], color=style['color'], label=status)

# 配置x轴的时间显示格式
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d/%m/%Y %H:%M'))
# 自动旋转x轴标签,避免重叠
fig.autofmt_xdate(rotation=45)

# 添加图表的基础元素
ax.set_title('索引状态随时间变化')
ax.set_xlabel('时间')
ax.set_ylabel('索引值')
# 添加图例,方便识别状态
ax.legend(title='测试状态')
ax.grid(True, alpha=0.3)

# 自动调整布局,避免标签被截断
plt.tight_layout()
plt.show()

额外小技巧

  • 如果不想显示连线(只想看每个时间点的状态标记),把ls='-'改成ls=''就行。
  • 你的indeces列有重复值(比如示例里的382、383),这个代码会自动连接同一索引的不同时间点,能直观看到同一索引的状态变化。

内容的提问来源于stack exchange,提问作者Codepy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:27:44