Как сделать 3D-графики в Python? - PullRequest
4 голосов
/ 26 января 2011

Это версия кода 3D для построения графиков MATLAB: РЕДАКТИРОВАТЬ: Это текущий код:

        plt.figure(2)
        fig_b = Axes3D(fig2)
        xx2 = np.arange(0, L+h_grid*L, h_grid*L)
        yy2 = np.arange(-b, b+h_grid*b, h_grid*b)
        X, Y = np.meshgrid(xx2, yy2)
        W = np.zeros((41,21), float)
        mx = len(xx2)*len(yy2)
        X = np.reshape(X, (1, mx))
        Y = np.reshape(Y, (1, mx))
        W = np.reshape(W, (1, mx))
        for j in range(0, mx):
            W[0][j] = np.sin(np.pi*X[0][j]/L)
        surf = fig_b.plot_surface(X, Y, W, rstride=1, cstride=1, cmap=cm.jet, linewidth=0, antialiased=False) # This is the line number 168
        plt.xlabel('x')
        plt.ylabel('y')

Это сообщение об ошибке, которое я получаю:

Traceback (most recent call last):
  File "nonhomog.py", line 247, in <module>
    main()
  File "nonhomog.py", line 245, in main
    nonhomog(nu)
  File "nonhomog.py", line 168, in nonhomog
    surf = fig_b.plot_surface(X, Y, W, rstride=1, cstride=1, cmap=cm.jet, linewidth=0, antialiased=False)
  File "/usr/lib/pymodules/python2.6/mpl_toolkits/mplot3d/axes3d.py", line 618, in plot_surface
    polyc = art3d.Poly3DCollection(polys, *args, **kwargs)
  File "/usr/lib/pymodules/python2.6/mpl_toolkits/mplot3d/art3d.py", line 290, in __init__
    PolyCollection.__init__(self, verts, *args, **kwargs)
  File "/usr/lib/pymodules/python2.6/matplotlib/collections.py", line 668, in __init__
    self.set_verts(verts, closed)
  File "/usr/lib/pymodules/python2.6/mpl_toolkits/mplot3d/art3d.py", line 312, in set_verts
    self.get_vector(verts)
  File "/usr/lib/pymodules/python2.6/mpl_toolkits/mplot3d/art3d.py", line 305, in get_vector
    xs, ys, zs = zip(*points)
ValueError: need more than 0 values to unpack

Ответы [ 2 ]

4 голосов
/ 26 января 2011

После настройки сетки сетки для X и Y вам нужно создать сетку для значений Z.

В моем коде в настоящее время я делаю это так:

# [ (x1, y1, z1), (x2, y2, z2), ... (xN, yN, zN) ]
all_vals = ...
# (x1, x2, ... xN) , (y1, y2, ... yN) , (z1, z2, ... zN)
all_xvals, all_yvals, all_zvals = zip(*all_vals)
fig = plt.figure()
ax = Axes3D(fig)
X, Y = np.meshgrid(xvals, yvals)
# This is the part you want:
Z1 = np.zeros(X.shape, float)
for (x, y, z) in all_vals:
    x = find_in_sorted_list(x, xvals)
    y = find_in_sorted_list(y, yvals)
    Z1[y,x] = z    
surf = ax.plot_surface(X, Y, Z1, rstride=1, cstride=1, cmap=cm.jet,
        linewidth=0, antialiased=False)
plt.xlabel('Blur standard deviation')  
plt.ylabel('JPEG quality')
ax.w_zaxis.set_major_locator(LinearLocator(10))
ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f'))    
fig.colorbar(surf, shrink=0.5, aspect=5)    
plt.show()

Это дает мне график, который выглядит следующим образом:

surf

Я сохранил его в виде файла, но когда вы вызываете plt.show(), вы получаете интерактивное окно, гдеВы можете изменить точку обзора на что угодно.

4 голосов
/ 26 января 2011

Что не так?Вы пытаетесь сделать не-число отрицательным.Другими словами: AxesSubplot (что бы это ни было) не реализует унарный оператор.

Таким образом, этот код не может быть разумно «тем, что вы сделали», поскольку вы даже не определяете bв этом коде, тем не менее, он существует и имеет некоторый пользовательский тип, называемый AxesSubplot.Если вы объясните, что такое AxesSubplot, это поможет.Попробуйте по возможности включить код, который фактически демонстрирует проблему.

Редактировать: Как указывает DSM, вы перезаписываете свою переменную b.Проблема в том, что вы застряли в «математическом режиме» и используете неописательные имена переменных, такие как «a», «b» и «M».Вместо этого используйте более длинные описательные имена.

Вместо:

 a = fig.add_subplot(2,2,i)
 b = fig2.add_subplot(2,2,i)

do:

 x_subplot = fig.add_subplot(2,2,i)
 y_subplot = fig2.add_subplot(2,2,i)

Или что-то в этом роде (я не уверен, какая переменная на самом деле - это , так что это всего лишь пример).

...