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

Matplotlib可视化CSV数据:纵轴缩放异常、S曲线显示线性求助

问题:Matplotlib可视化CSV数据异常排查

我想用Matplotlib可视化CSV数据,在Colab中运行代码后未达预期:

  • 纵轴缩放错误,数值堆叠
  • 原本应为S曲线的数据在Matplotlib中显示为线性,但Excel中可正常呈现S曲线

附上Colab代码:

import os
import pandas as pd
import matplotlib.pyplot as plt

# 挂载Google Drive以访问CSV文件
from google.colab import drive
drive.mount('/content/drive')
# 定义CSV文件路径
path = "/content/drive/MyDrive/CSV_Files/"

# 获取路径下所有CSV文件列表
csv_files = [f for f in os.listdir(path) if f.endswith('.csv')]

# 遍历每个CSV文件,绘制e1、e2列与zt列的关系图
for file in csv_files:
  # 将CSV文件加载为DataFrame
  df = pd.read_csv(path + file, sep=";")
  
  # 绘制e1、e2随zt变化的曲线
  plt.plot(df['zt'], df['e1'], label='e1')
  plt.plot(df['zt'], df['e2'], label='e2')
  plt.title(file[:-4]) # 标题设为去掉.csv后缀的文件名
  plt.legend()
  plt.show()

输出图特征:纵轴数值堆叠,原本应为S曲线的图形呈现异常线性,与Excel中正常显示的S曲线不符。


问题排查与解决方案

1. 数据类型错误(字符串格式的数值)

如果CSV中的zt、e1、e2列是字符串类型(比如包含千分位逗号、特殊符号,或读取时未自动解析为数值),Matplotlib会按类别顺序绘制,而非数值顺序,直接导致曲线异常、纵轴堆叠。

修复代码:
读取数据时转换数值格式,处理可能的逗号代替小数点的情况:

# 读取后转换列类型,处理格式问题
df['zt'] = pd.to_numeric(df['zt'].str.replace(',', '.'), errors='coerce')
df['e1'] = pd.to_numeric(df['e1'].str.replace(',', '.'), errors='coerce')
df['e2'] = pd.to_numeric(df['e2'].str.replace(',', '.'), errors='coerce')
# 删除转换失败的无效行
df = df.dropna(subset=['zt', 'e1', 'e2'])

2. 数据未按zt列排序

若zt列数值乱序,Matplotlib会按数据原始顺序连接点,导致曲线看起来像“线性堆叠”,而非按zt递增的S曲线。

修复代码:
绘图前按zt升序排序:

df = df.sort_values(by='zt')

3. 纵轴刻度范围适配问题

纵轴数值堆叠也可能是因为数据范围差异大,可手动设置纵轴范围优化显示:

plt.ylim(min(df['e1'].min(), df['e2'].min()), max(df['e1'].max(), df['e2'].max()))

完整修正代码

import os
import pandas as pd
import matplotlib.pyplot as plt

from google.colab import drive
drive.mount('/content/drive')
path = "/content/drive/MyDrive/CSV_Files/"

csv_files = [f for f in os.listdir(path) if f.endswith('.csv')]

for file in csv_files:
  df = pd.read_csv(path + file, sep=";")
  
  # 转换数值类型并处理格式问题
  for col in ['zt', 'e1', 'e2']:
    df[col] = pd.to_numeric(df[col].str.replace(',', '.'), errors='coerce')
  df = df.dropna(subset=['zt', 'e1', 'e2'])
  
  # 按zt列升序排序
  df = df.sort_values(by='zt')
  
  # 绘图
  plt.plot(df['zt'], df['e1'], label='e1')
  plt.plot(df['zt'], df['e2'], label='e2')
  plt.title(file[:-4])
  plt.legend()
  plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:23:27