使用ax.plot_wireframe时因X轴为字符串报错的问题排查
3D线框图绘制报错问题解决
用户问题描述
想要使用matplotlib为网站绘制3D线框图,但运行代码时出现错误,源代码如下:
from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(111, projection='3d') X = np.array([ '4K', '8K' ]) Y = np.array([ 1, 4 ]) Z = np.array([[0.1925, 0.1848], [0.1807, 0.1966]]) ax.plot_wireframe(X, Y, Z) plt.show()
报错信息:
Traceback (most recent call last): File "wire3d.py", line 21, in <module> ax.plot_wireframe(X, Y, Z) File "/usr/local/lib/python3.8/dist-packages/matplotlib/_api/deprecation.py", line 415, in wrapper return func(*inner_args, **inner_kwargs) File "/usr/local/lib/python3.8/dist-packages/mpl_toolkits/mplot3d/axes3d.py", line 1908, in plot_wireframe self.auto_scale_xyz(X, Y, Z, had_data) File "/usr/local/lib/python3.8/dist-packages/mpl_toolkits/mplot3d/axes3d.py", line 652, in auto_scale_xyz self.xy_dataLim.update_from_data_xy( File "/usr/local/lib/python3.8/dist-packages/matplotlib/transforms.py", line 967, in update_from_data_xy path = Path(xy) File "/usr/local/lib/python3.8/dist-packages/matplotlib/path.py", line 129, in __init__ vertices = _to_unmasked_float_array(vertices) File "/usr/local/lib/python3.8/dist-packages/matplotlib/cbook/__init__.py", line 1298, in _to_unmasked_float_array return np.asarray(x, float) ValueError: could not convert string to float: '4K'
问题根源
plot_wireframe函数要求X、Y、Z轴的输入必须是数值类型数组,因为matplotlib需要基于这些数值计算三维空间的坐标位置。你定义的X数组包含字符串'4K'、'8K',无法被转换为浮点数用于绘图计算,因此抛出转换错误。
修正方案
先用数值作为X轴的底层数据完成绘图,再手动将X轴的刻度标签替换为目标字符串。修正后的代码如下:
from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 使用数值作为X轴的底层数据,这里用[0, 1]示例,也可以用[4, 8]对应4K、8K的数字部分 X = np.array([0, 1]) Y = np.array([1, 4]) Z = np.array([[0.1925, 0.1848], [0.1807, 0.1966]]) ax.plot_wireframe(X, Y, Z) # 替换X轴刻度标签为目标字符串 ax.set_xticks(X) ax.set_xticklabels(['4K', '8K']) plt.show()
关键说明
- 所有3D绘图函数的坐标输入都必须是数值型,字符串无法参与坐标计算。
- 如果需要显示非数值的轴标签,都要遵循“先数值绘图,后替换刻度文本”的流程,Y轴和Z轴的标签替换同理,分别使用
set_yticks/set_yticklabels、set_zticks/set_zticklabels。
内容的提问来源于stack exchange,提问作者Bogi
相关产品推荐
相关产品推荐

