【问题标题】:Surface Plotting on Python 2.7 with pyplot使用 pyplot 在 Python 2.7 上进行曲面绘图
【发布时间】:2018-11-22 14:34:00
【问题描述】:

我是 Python 新手。我一直在尝试绘制一个包含 3 列和 1024 个数据点的数据文件。运行代码时出现以下错误:

    Traceback (most recent call last):
  File "plot-data.py", line 27, in <module>
    linewidth=0, antialiased=False)
  File "/home/ritajit/.local/lib/python2.7/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 1624, in plot_surface
    X, Y, Z = np.broadcast_arrays(X, Y, Z)
  File "/home/ritajit/.local/lib/python2.7/site-packages/numpy/lib/stride_tricks.py", line 249, in broadcast_arrays
    shape = _broadcast_shape(*args)
  File "/home/ritajit/.local/lib/python2.7/site-packages/numpy            /lib/stride_tricks.py", line 184, in _broadcast_shape
b = np.broadcast(*args[:32])
ValueError: shape mismatch: objects cannot be broadcast to a single shape

我的代码是这样的

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.mlab import griddata
import matplotlib.cm as cm    
from pylab import rcParams
rcParams['figure.figsize'] = 9, 9


## 3D surface_plot
fig = plt.figure()
axes = fig.add_subplot(111, projection='3d') #gca = get current axis

data = np.loadtxt('2D-data.txt')
x = data[:,0]
y = data[:,1]
z = data[:,2]

xi = np.unique(x)
yi = np.unique(y)

xv, yv = np.meshgrid(x,y)
Z = griddata(x, y, z, xi, yi, interp='linear')

# surface_plot with color grading and color bar
p = axes.plot_surface(xv,yv,Z, rstride=4, cstride=4, cmap=cm.RdBu, 
    linewidth=0, antialiased=False)
fig.colorbar(p, shrink=0.5)

axes.set_xlabel('$x$',fontsize=15)
axes.set_ylabel('$y$',fontsize=15)
axes.set_zlabel('$z$',fontsize=15)
plt.tight_layout()
fig.savefig("surface.pdf")
plt.show()

我无法解决这个问题。
我做错了什么?
还有其他方法可以绘制 3d 数据文件吗?

我的数据文件中的几行:

1 2 1.30884
2 2 1.30925
3 2 1.30974
4 2 1.30841
5 2 1.30864
6 2 1.30795

第1、2、3列分别为x、y、z

【问题讨论】:

  • 您将数据网格化到Z,但随后尝试绘制一维数组z。请改用Z
  • @PaulH 我从 'z' 更改为 'Z' 但仍然出现新错误

标签: python-2.7 matplotlib mplot3d data-files


【解决方案1】:

这里有三个主要问题:

  • 您需要对唯一值进行网格网格化,而不是原始值

    xi = np.unique(x)
    yi = np.unique(y)
    xv, yv = np.meshgrid(xi,yi)
    
  • 您需要对网格值进行插值

    griddata(x, y, z, xv, yv)
    
  • 你需要绘制Z,而不是z

    p = axes.plot_surface(xv,yv,Z)
    

总的来说,您可以通过重塑数据列来实现几乎相同的效果(但小数据摘录不足以判断这一点)。

最后,matplotlib.mlab.griddata 将在下一个版本中被弃用。作为替代方案,请考虑scipy.interpolate.griddata。另请查看Contour plot of irregularly spaced data 示例。

【讨论】:

  • 感谢您的回复。我已经整理了代码中的所有错误,现在它显示了这一点,ValueError: Argument Z must be 2-dimensional 无法弄清楚。
  • 这是回答不提供minimal reproducible example 的问题的常见问题。您假设人们只需查看代码即可解决您的问题。我现在更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 2016-07-21
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
相关资源
最近更新 更多