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

使用Python+Anaconda3读取CSV绘制3D颜色图报错求助

Python绘制3D颜色图的CSV读取错误解决

问题背景

近期在Anaconda3环境编写Python代码,目标是从CSV文件绘制3D颜色图,但被数据读取相关错误困扰多日。

原始代码

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

DataX_Y_1D = np.loadtxt("datacsv_1d_xy.csv", delimiter=",")

X, Y = np.meshgrid(DataX_Y_1D[:,0], DataX_Y_1D[:,1])

Z = np.loadtxt("datacsv_2d_Z.csv", delimiter=",")

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.plot_surface(X, Y, Z)

plt.show()

遇到的错误

File "/Users/lenguyen/Desktop/test_3D/plot_3D_4.py", line 1, in <module>
    DataAll1D = np.loadtxt("datacsv_1d.csv", delimiter=",")
NameError: name 'np' is not defined

(base) lenguyen@ntmle2 test_3D % python plot_3D_4.py
Traceback (most recent call last):
  File "/Users/lenguyen/Desktop/test_3D/plot_3D_4.py", line 5, in <module>
    DataAll1D = np.loadtxt("datacsv_1d.csv", delimiter=",")
  File "/opt/anaconda3/lib/python3.9/site-packages/numpy/lib/npyio.py", line 1148, in loadtxt
    for x in read_data(_loadtxt_chunksize):
  File "/opt/anaconda3/lib/python3.9/site-packages/numpy/lib/npyio.py", line 999, in read_data
    items = [conv(val) for (conv, val) in zip(converters, vals)]
  File "/opt/anaconda3/lib/python3.9/site-packages/numpy/lib/npyio.py", line 999, in <listcomp>
    items = [conv(val) for (conv, val) in zip(converters, vals)]
  File "/opt/anaconda3/lib/python3.9/site-packages/numpy/lib/npyio.py", line 736, in floatconv
    return float(x)
ValueError: could not convert string to float: '\ufeff9.9'

错误分析

  1. NameError: 出现name 'np' is not defined是因为某次运行的代码中遗漏了import numpy as np语句,你提供的代码里包含这行,应该是测试时的疏忽。
  2. ValueError: 核心错误是\ufeff字符导致无法转成浮点数,这个字符是UTF-8 BOM(字节顺序标记),说明你的CSV文件是带BOM的UTF-8格式,而numpy默认的loadtxt不支持这种格式。

解决方案

方法1:修改numpy读取参数

在np.loadtxt中添加encoding='utf-8-sig'参数,让numpy识别带BOM的UTF-8文件。

方法2:修改CSV文件格式

用文本编辑器(如VS Code、Notepad++)打开CSV文件,重新保存为不带BOM的UTF-8格式(VS Code保存时选择"UTF-8"而非"UTF-8 with BOM")。

额外注意

确保Z数组的形状和X、Y一致,meshgrid生成的X、Y是二维数组,所以Z也必须是相同尺寸的二维数组,否则plot_surface会报错。

修正后的代码

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 读取带BOM的CSV文件,指定编码
DataX_Y_1D = np.loadtxt("datacsv_1d_xy.csv", delimiter=",", encoding='utf-8-sig')
X, Y = np.meshgrid(DataX_Y_1D[:,0], DataX_Y_1D[:,1])

# Z文件若同样带BOM,也添加encoding参数
Z = np.loadtxt("datacsv_2d_Z.csv", delimiter=",", encoding='utf-8-sig')

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.plot_surface(X, Y, Z)

plt.show()

内容的提问来源于stack exchange,提问作者EL-san

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:24:24