Почему Z должен быть 2-мерным для 3D-построения в matplotlib - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь построить 3d Surface plots, используя код этого сайта , используя matplotlib:

X, Y и Z получены следующим образом:

from math import pi
from numpy import cos, meshgrid
alpha = 0.7
phi_ext = 2 * pi * 0.5

def flux_qubit_potential(phi_m, phi_p):
    return 2 + alpha - 2 * cos(phi_p)*cos(phi_m) - alpha * cos(phi_ext - 2*phi_p)

phi_m = linspace(0, 2*pi, 100)
phi_p = linspace(0, 2*pi, 100)
X,Y = meshgrid(phi_p, phi_m)
Z = flux_qubit_potential(X, Y).T

И 3D-черчение выполняется с помощью следующего кода:

from mpl_toolkits.mplot3d.axes3d import Axes3D

fig = plt.figure(figsize=(14,6))

# `ax` is a 3D-aware axis instance, because of the projection='3d' keyword argument to add_subplot
ax = fig.add_subplot(1, 2, 1, projection='3d')

p = ax.plot_surface(X, Y, Z, rstride=4, cstride=4, linewidth=0)

# surface_plot with color grading and color bar
ax = fig.add_subplot(1, 2, 2, projection='3d')
p = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False)
cb = fig.colorbar(p, shrink=0.5)

Однако, если я заменю X, Y и Z на свои данные по x, y, z 3d (пример ниже), возникает ошибка, что Z has to be 2 dimensional. Как я могу построить с обычными значениями x, y, z, как показано ниже:

   x   y   z
0  12  0  0.1
1  13  1  0.8
2  14  3  1.0
3  16  4  1.2
4  18  4  0.7

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Это потому, что, в моем понимании, чтобы нарисовать поверхность, вам нужно сформировать полигональную сетку . Чтобы нарисовать трехмерную поверхность, вам нужно иметь маленькие квадраты, например, на плоскости xy, а затем иметь 1 соответствующее значение z для всех точек x-y. Чем меньше площадь квадрата, тем лучше сетка и лучшее разрешение (гладкая поверхность). Теперь, если у вас есть произвольный набор точек xyz, как matplotlib может определить, какую поверхность рисовать. Вот почему сетка требуется. Вы можете, конечно, построить 3D разброс или линейных графиков с вашими данными.

0 голосов
/ 11 ноября 2018

В документации вы обнаружите, что x, y и z нужны для двумерного массива. Для координат x и y вам нужно будет использовать numpy.meshgrid, как показано в первом фрагменте кода. Это создает двумерный массив для каждой координаты, где x и y постоянны в другом направлении и изменяются в своем собственном направлении.

Что касается z, это также должен быть двумерный массив, поскольку Axes3D.surface_plot отображает каждый элемент двумерного массива z с двумерной сеткой, определяемой x и y.

Следовательно, когда вы используете свои x, y и z, убедитесь, что вы используете numpy.meshgrid для x и y, а затем определите z = f (x, y) (например, функция flux_qubit_potential, которую вы показываете).

Редактировать

После комментария ОП ясно, что желаемым результатом является график, где функция g имеет вид g = f (x, y, z). Это будет означать, что g в конце концов является трехмерным массивом. Чтобы сделать это с точки зрения изоповерхностей, посмотрите на эти ответы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...