Построение поверхности на Python 2.7 с pyplot - PullRequest
0 голосов
/ 13 июня 2018

Я новичок в 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()

Я не могу пройти через это.
Что я не такделать?
Есть ли другой способ построения трехмерного файла данных?

Несколько строк из моего файла данных:

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-й столбцы имеют х, y, z соответственно

1 Ответ

0 голосов
/ 13 июня 2018

Три основных вопроса здесь:

  • Вам необходимо объединить в сетку уникальные значения, а не исходные

    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 с нерегулярно расположенными данными пример.

...