Python绘制3D图报错:'list' object has no attribute 'ndim' 求排查
AttributeError: 'list' object has no attribute 'ndim' in 3D Wireframe Plot Hey there! Let's break down why you're hitting this error and how to fix it quickly.
The Root Cause
The plot_wireframe() method from Matplotlib's 3D toolkit expects 2D grid data (not simple 1D lists) for your X, Y, and Z inputs. Under the hood, it relies on NumPy array properties like ndim (number of dimensions) to validate the data structure—and regular Python lists don't have this attribute.
On top of that, wireframe plots require grid-aligned points (think of a grid where every x value pairs with every y value), not just a sequence of individual points. Your current 1D lists don't fit this grid structure.
The Fix
Here's how to adjust your code to work correctly:
- Import NumPy (we need it to create proper grid arrays)
- Convert your 1D value lists to NumPy arrays
- Use
np.meshgrid()to generate the 2D grid for X and Y - Ensure your Z data matches the shape of the X/Y grid
from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt import numpy as np # Convert your original 1D values to NumPy arrays x_vals = np.array([1,2,3,4,5,6,7,8]) y_vals = np.array([2,5,3,8,9,5,6,1]) # Create 2D grid from the 1D x and y values X, Y = np.meshgrid(x_vals, y_vals) # Generate Z values that match the grid shape (example: Z = X + Y, replace with your logic) Z = X + Y fig = plt.figure() chart = fig.add_subplot(1,1,1, projection='3d') chart.plot_wireframe(X, Y, Z) plt.show()
Alternative: If You Want to Plot Individual Points/Line
If your goal isn't a wireframe grid but instead connecting your 1D sequence of points into a 3D line, use plot3D() instead of plot_wireframe(). This works with 1D lists (or NumPy arrays):
from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt X,Y,Z = [1,2,3,4,5,6,7,8], [2,5,3,8,9,5,6,1], [3,6,2,7,5,4,5,6] fig = plt.figure() chart = fig.add_subplot(1,1,1, projection='3d') # Use plot3D for a line through your points chart.plot3D(X, Y, Z) # Or use scatter3D if you want just the points # chart.scatter3D(X, Y, Z) plt.show()
内容的提问来源于stack exchange,提问作者abdulbasit

