Как создать поверхностный график с помощью matplotlib замкнутого цикла, вращающегося вокруг оси с учетом координатных данных 2D-профиля?

  • У меня есть замкнутый цикл, хранящийся в виде двух столбцов массивом N строк.

  • Последняя строка массива совпадает с первой строкой, что означает, что это действительно замкнутый цикл.

  • Количество угловых делений при вращении (как, так сказать, «кусочки пирога») должно быть установлено переменной, называемой «угловые шаги».

  • Рассматриваемый профиль строится в координатной плоскости x-y и вращается вокруг «оси x».

  • Вы можете найти профиль, о котором идет речь, здесь. https://i.imgur.com/yJoKIEp.png

Я извиняюсь за отсутствие кода, но данные профиля имеют так много взаимозависимостей, что я не могу опубликовать код, который их генерирует, не используя ярлык для подключения страницы github для него.

уменьшенная версия данных кривой выглядит следующим образом.

    bulkmat =         [[  5.2          0.        ]
     [  0.381        0.        ]
     [  0.381        3.164     ]
     [  2.           3.164     ]
     [  2.           4.1       ]
     [  3.78         4.1       ]
     [  3.78         6.477     ]
     [  1.898        6.477     ]
     [  1.898        7.        ]
     [  3.18         7.        ]
     [  3.18         9.6       ]
     [  1.898        9.6       ]
     [  1.898        9.6       ]
     [  2.31987929  12.42620027]
     [  3.4801454   15.24663923]
     [  5.22074074  17.97407407]
     [  7.38360768  20.521262  ]
     [  9.81068861  22.80096022]
     [ 12.34392593  24.72592593]
     [ 14.825262    26.20891632]
     [ 17.09663923  27.16268861]
     [ 19.          27.5       ]
     [ 19.          27.5       ]
     [ 19.62962963  27.44718793]
     [ 20.18518519  27.29972565]
     [ 20.66666667  27.07407407]
     [ 21.07407407  26.7866941 ]
     [ 21.40740741  26.45404664]
     [ 21.66666667  26.09259259]
     [ 21.85185185  25.71879287]
     [ 21.96296296  25.34910837]
     [ 22.          25.        ]
     [ 22.          25.        ]
     [ 21.12125862  24.17043472]
     [ 18.91060645  23.59946824]
     [ 15.97201646  22.9218107 ]
     [ 12.84280513  21.85346069]
     [  9.96762011  20.14089993]
     [  7.67242798  17.51028807]
     [  6.13850192  13.61665735]
     [  5.37640942   7.99310742]
     [  5.2          0.        ]]

person bdazman    schedule 16.11.2017    source источник
comment
Это хорошая задача. В чем проблема?   -  person ImportanceOfBeingErnest    schedule 16.11.2017
comment
Проблема в том, что я не знаю, как создать из этого 3D-график поверхности. Я ознакомился с документацией по поверхностям, которую предлагает matplotlib (а также со значительно большим количеством примеров), и я не смог полностью понять, как обусловить эти данные, а затем передать их в plt.surface()   -  person bdazman    schedule 16.11.2017
comment
Как насчет этого вопроса?   -  person ImportanceOfBeingErnest    schedule 16.11.2017
comment
Я видел подобные, в основном этот, но проблема в том, что у меня нет символической функции, у меня есть точки данных. Как мне исправить это?   -  person bdazman    schedule 16.11.2017
comment
Мое предложение состояло бы в том, чтобы использовать имеющуюся у вас информацию для построения тела вращения функции. Сделайте это очень легко (например, 6 баллов или около того). Затем попробуйте заменить функцию некоторыми точками. Если это вызывает проблему, отредактируйте свой вопрос здесь соответствующим образом, чтобы люди знали, в какой момент им помочь.   -  person ImportanceOfBeingErnest    schedule 16.11.2017
comment
У тебя вышло. Спасибо. Мое самое большое зависание, пока я пытаюсь это понять, это попытка понять, как правильно форматировать 3D-данные. Похоже, что размер созданных квадратных матриц не коррелирует ни с количеством вершин в модели поверхности, ни с количеством граней. Вы знаете, где я могу узнать больше о том, почему это так?   -  person bdazman    schedule 16.11.2017
comment
Так ты решил проблему сейчас? Я не знаю, что вы хотите узнать, но я полагаю, что лучше всего вы учитесь, пробуя что-то новое, и если это не удастся, вы всегда можете задать вопрос здесь.   -  person ImportanceOfBeingErnest    schedule 16.11.2017
comment
Нах еще не взломал. Все еще пытаюсь ознакомиться с тем, что именно делает meshgrid. А также как, во имя бога, форматировать входные данные для поверхностного графика.   -  person bdazman    schedule 16.11.2017
comment
Я дал вам пример ниже для 4 входных точек (последняя повторяется, чтобы закрыть фигуру). Я думаю, что это позволит расширить ваши реальные входные данные, но в то же время будет достаточно простым, чтобы понять проблему.   -  person ImportanceOfBeingErnest    schedule 17.11.2017


Ответы (1)


Ниже приведен пример тела вращения, построенного вокруг оси z. В качестве входных данных мы берем несколько точек, а затем создаем из них необходимые 2D-массивы.

import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d

# input xy coordinates
xy = np.array([[1,0],[2,1],[2,2],[1,1.5],[1,0]])
# radial component is x values of input
r = xy[:,0]
# angular component is one revolution of 60 steps
phi = np.linspace(0, 2*np.pi, 60)
# create grid
R,Phi = np.meshgrid(r,phi)
# transform to cartesian coordinates
X = R*np.cos(Phi)
Y = R*np.sin(Phi)
# Z values are y values, repeated 60 times
Z = np.tile(xy[:,1],len(Y)).reshape(Y.shape)


fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
ax2 = fig.add_axes([0.05,0.7,0.15,.2])
ax2.plot(xy[:,0],xy[:,1], color="k")

ax.plot_surface(X, Y, Z, alpha=0.5, color='gold', rstride=1, cstride=1)

plt.show()

введите здесь описание изображения

person ImportanceOfBeingErnest    schedule 16.11.2017
comment
Ты супергерой, друг. - person bdazman; 17.11.2017
comment
Теперь я пытаюсь выяснить, какой шаблон ваших параметров определял, вокруг какой оси вы вращались. Я уверен, что скоро найду его, и тогда я смогу пометить этот пост как решенный. - person bdazman; 17.11.2017