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
相关产品推荐
相关产品推荐

