Как построить трехмерные треугольники в matplotlib с координатами вершин треугольников (9 чисел для каждого треугольника)?

У меня есть много треугольников (скажем, N = 10 ^ 6) с координатами (x, y, z) каждой вершины треугольников, хранящихся в файле. Таким образом, каждый треугольник имеет 9 чисел, хранящихся в виде строки в файле. Следовательно, файл имеет N строк. Теперь я просто хочу построить (в 3D) все треугольники, заполненные каким-либо цветом. Треугольники могут быть, а могут и не быть смежными. Я очень-очень запутался, просматривая документацию matplotlib. Пожалуйста, помогите. Не ругайте меня, пожалуйста.


person deltasata    schedule 13.04.2017    source источник


Ответы (1)


Построение 10 миллионов треугольников на графике, который имеет не более 1 миллиона пикселей, может не иметь особого смысла. В любом случае, если у вас нет информации о том, какая вершина соседствует с какой другой, вы не можете напрямую использовать метод plot_trisurf.

Я вижу два варианта:

  1. Нарисуйте Poly3DCollection.
  2. Отфильтруйте уникальные точки из данных и укажите их в plot_trisurf . Используя этот метод, вы, возможно, не сможете раскрасить треугольники по своему желанию, а только в соответствии с z-Value.

Ниже приведен пример того, как построить Poly3DCollection из ваших входных данных. В целях демонстрации нам сначала нужно предоставить некоторые образцы данных (это должно быть обязанностью спрашивающего, а не отвечающего).

import numpy as np
np.set_printoptions(threshold='nan')

phi = np.linspace(0,2*np.pi, 7)
x = np.cos(phi) + np.sin(phi)
y = -np.sin(phi) + np.cos(phi)
z = np.cos(phi)*0.12+0.7

a = np.zeros((len(phi)-1, 9))
a[:,0] = x[:-1]
a[:,1] = y[:-1]
a[:,2] = z[:-1]
a[:,3:6] = np.roll( a[:,0:3], -1, axis=0)
a[:,8] = np.ones_like(phi[:-1])
a = np.around(a, 2)
print a

который печатает

[[ 1.    1.    0.82  1.37 -0.37  0.76  0.    0.    1.  ]
 [ 1.37 -0.37  0.76  0.37 -1.37  0.64  0.    0.    1.  ]
 [ 0.37 -1.37  0.64 -1.   -1.    0.58  0.    0.    1.  ]
 [-1.   -1.    0.58 -1.37  0.37  0.64  0.    0.    1.  ]
 [-1.37  0.37  0.64 -0.37  1.37  0.76  0.    0.    1.  ]
 [-0.37  1.37  0.76  1.    1.    0.82  0.    0.    1.  ]]

(каждый набор из 3 столбцов принадлежит одной точке, первый столбец — это x, второй — y, третий — z).

Теперь мы можем создать коллекцию Poly3D.

from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

fc = ["crimson" if i%2 else "gold" for i in range(a.shape[0])]

poly3d = [[ a[i, j*3:j*3+3] for j in range(3)  ] for i in range(a.shape[0])]

ax.add_collection3d(Poly3DCollection(poly3d, facecolors=fc, linewidths=1))

ax.set_xlim(-1.5,1.5)
ax.set_ylim(-1.5,1.5)

plt.show()

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

person ImportanceOfBeingErnest    schedule 13.04.2017
comment
Это действительно помогает. Но по мере увеличения числа треугольников построение графика становится очень медленным и требует много оперативной памяти. Я заметил то же самое в матлабе. Думаю не обойти эту проблему. Давайте посмотрим. Спасибо еще раз. - person deltasata; 13.04.2017
comment
Я обнаружил одну серьезную проблему с приведенным выше кодом: когда я закомментировал ax.set_xlim() для установки автомасштабирования, он не работает. Каким-то образом диапазон графика становится (0,1) для всех трех осей, когда я явно не устанавливаю диапазон. Пожалуйста помоги. - person deltasata; 13.04.2017
comment
Итак, мой вопрос в приведенном выше коде, как установить автоматический предел x, y, z. Это очень важно, потому что при большом количестве треугольников коду требуется много времени для создания графика. Таким образом, требуется очень много времени, чтобы сначала построить треугольники с полным диапазоном, а затем увидеть и настроить xlim, ylim и zlim. - person deltasata; 13.04.2017
comment
Как я уже сказал, я бы не стал строить так много треугольников, чтобы иметь какой-то смысл, так как в итоге вы получите больше треугольников, чем точек на экране. Чтобы установить ограничения, вы можете просто узнать минимум и максимум из данных и использовать их в качестве ограничений. - person ImportanceOfBeingErnest; 14.04.2017
comment
Я согласен. Но 10 ^ 6 - это максимальное количество треугольников, которое у меня может быть. Мне нужен код и для меньшего количества треугольников, скажем, 1 лакх. Я также хотел знать, могу ли я установить угол обзора, сохраняя фигу в формате pdf. Как вы знаете, треугольник не такой высокий, что я не могу повернуть рис из plt.show(), а затем сохранить. Поэтому мне нужно указать угол обзора, прежде чем сохранять фигу в самом коде. Пожалуйста помоги. - person deltasata; 14.04.2017
comment
Вопросы о stackoverflow касаются конкретных проблем. Вот вы спросили о построении треугольников, и получили ответ. Если вы хотите узнать об установке ограничений или настройке угла обзора (что можно сделать с помощью ax.view_init()), вам следует сначала найти возможное решение, и если вы не можете его оштрафовать или если оно не дает желаемого результата, задайте новый конкретный вопрос. об этом. - person ImportanceOfBeingErnest; 14.04.2017