使用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'
错误分析
- NameError: 出现
name 'np' is not defined是因为某次运行的代码中遗漏了import numpy as np语句,你提供的代码里包含这行,应该是测试时的疏忽。 - 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
相关产品推荐
相关产品推荐

