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

为何导入CSV数据后Matplotlib刻度标签重叠?如何解决?

Matplotlib导入CSV数据后刻度标签混乱的问题解决

问题现象

使用numpy数值数组绘制Matplotlib图表时,刻度会自动合理分布;但导入CSV数据到numpy数组后,X/Y轴刻度会为每个数据点生成标签,导致严重重叠,即使数据量很大(如20000个点)也无法自动优化。

问题原因

核心原因是CSV导入的数据被识别为字符串类型,而非数值类型:

  • 当轴数据为数值类型(int/float)时,Matplotlib会根据数据范围自动计算并生成均匀分布的刻度;
  • 当轴数据为字符串类型时,Matplotlib会将每个字符串视为独立分类标签,为每个数据点创建刻度,最终导致标签重叠;
  • 验证方式:执行print(x.dtype),导入后的数组会显示<Uxx(字符串类型),而正常示例的数组为int64/float64数值类型。

解决方案

方案1:直接读取CSV为数值数组

使用numpy的np.loadtxt或np.genfromtxt直接读取CSV,自动将数据转换为数值类型:

import numpy as np
import matplotlib.pyplot as plt

# 直接读取为float类型数组,指定分隔符和编码
data = np.loadtxt("graph.csv", delimiter=",", encoding='utf-8-sig')
x = data[:, 0][:10]  # 取前10个X数据
y = data[:, 1][:10]  # 取前10个Y数据

fig, ax = plt.subplots()
ax.plot(x, y, ".")
plt.show()

方案2:手动转换字符串数组为数值类型

如果已用csv.reader读取数据,可手动将字符串数组转换为float类型:

import numpy as np
import matplotlib.pyplot as plt
import csv

with open("graph.csv", encoding='utf-8-sig') as fp:
    reader = csv.reader(fp, delimiter=",")
    data_read = [row for row in reader]

# 转换为float64类型数组,再转置
d = np.array(data_read, dtype=np.float64).T
x = d[0][:10]
y = d[1][:10]

fig, ax = plt.subplots()
ax.plot(x, y, ".")
plt.show()

大数据量额外优化

当加载200000个数据点时,除确保数据为数值类型,还可通过以下方式优化刻度显示:

  • 启用自动缩放:ax.autoscale()(Matplotlib默认启用,可显式确保生效);
  • 旋转X轴标签:plt.xticks(rotation=45),避免水平标签重叠;
  • 自定义刻度格式:减少小数位数,缩短标签长度:
import matplotlib.ticker as ticker

# 设置X轴刻度保留2位小数,Y轴保留1位小数
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.2f'))
ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1f'))

现象示例说明

  • 正常表现图表:X轴为0到1e6的均匀刻度,标签分布合理无重叠;
  • CSV导入后的混乱图表:X轴刻度标签完全重叠,放大后可见每个数据点对应一个刻度;
  • 改用线性X轴后的图表:X轴为整数序列,自动生成均匀分布的刻度;
  • 20000个数据点的Y轴:标签密集重叠,数据范围在-106到-88之间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:00:40