如何使用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
相关产品推荐
相关产品推荐

