Как мне построить поверхность 4D графика?

11

Я пытаюсь построить волновую функцию для частицы в 3D-окне. Это требует от меня построения 4 переменных: осей x, y, z и функции плотности вероятности.

Функция плотности вероятности:

abs((np.sin((p*np.pi*X)/a))*(np.sin((q*np.pi*Y)/b))*(np.sin((r*np.pi*Z)/c)))**2

Я использую np.arange()для X, Y и Z.

Я прочитал, что для этого вам нужно построить поверхность 4D графика. Вот как это должно выглядеть:

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

репа
источник
3
Как насчет использования цвета для представления плотности вероятности?
Шухао Цао
Я бы предположил, что непрозрачность будет хорошо работать для такого рода сюжета. Возможно, вам придется предоставить различные перспективы каждого графика, но если сделать график более непрозрачным там, где вероятно может быть частица, эти данные будут хорошо визуализированы.
Годрик Провидец
2
Так как похоже, что вы используете NumPy, вы можете использовать Mayavi для фактического построения. В документах есть пример построения скалярных данных в 3D .
Хорхе

Ответы:

13

Это не совсем 4D данные. Как сказал Джефф, это трехмерные скалярные данные, т.е. вы визуализируете скалярную функцию трех переменных: .е(Икс,Y,Z)

Существует несколько способов визуализации данных такого рода и множество инструментов, которые помогут вам. Я покажу вам несколько стилей графиков, которые вы можете сделать.

  1. Контурная диаграмма, показывающая одну или несколько поверхностей , Возможно с прозрачностью.е(Икс,Y,Z)знак равно(Const.)

    В Mathematica,

    ContourPlot3D[
     Abs[Sin[\[Pi] x] Sin[\[Pi] y] Sin[\[Pi] z]]^2 == 1/2,
     {x, -1, 1}, {y, -1, 1}, {z, -1, 1}]
    

    Покажите поверхности с постоянной вероятностью 0,2, 0,5 и 0,8:

    ContourPlot3D[
     Abs[Sin[\[Pi] x] Sin[\[Pi] y] Sin[\[Pi] z]]^2,
     {x, -1, 1}, {y, -1, 1}, {z, -1, 1}, Contours -> {0.2, 0.5, 0.8}, 
     ContourStyle -> (Directive[#, Opacity[0.25]] & /@ {Yellow, Orange, Red}), 
     Lighting -> "Neutral", Mesh -> None]
    

  2. Вы можете сделать некоторый тип визуализации объема , возможно с вырезами и нарезкой. Вы сможете назначить цвет и непрозрачность для каждой точки в 3D. Более продвинутые инструменты также позволят вам выбрать функцию передачи.

    imgdata = 
      Table[Abs[Sin[\[Pi] x] Sin[\[Pi] y] Sin[\[Pi] z]]^2, 
        {x, -1., 1, .01}, {y, -1., 1, .01}, {z, -1., 1, .01}];
    
    img = Image3D[imgdata, ClipRange -> {{150, 200}, {0, 100}, {0, 200}}]
    

    Часто помогает нарезка, особенно если вы можете в интерактивном режиме контролировать, какой срез отображать.

    Image3DSlices[img, Range[1, 200, 10]]
    

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

Сабольч
источник
9

Традиционный подход к скалярным полевым данным (температура, величина скорости, давление, плотность и т. Д.), Построенным по двум или трем измерениям пространства, использует цвет. Важно отметить, что выбор цветовой схемы может исказить ваши впечатления от данных. По этой причине не используйте цветовую гамму радуги. (Почему, смотрите здесь , здесь , здесь и здесь .) К сожалению, радуга - это стандартная цветовая схема в MATLAB и matplotlib.

Если вы пытаетесь выделить изменения интенсивности, хорошо работает схема с различной насыщенностью, например, от белого (нулевая плотность) до черного (максимальная плотность). Прозрачность также может хорошо работать. Сложная проблема с трехмерными графиками при использовании цвета заключается в том, что вам нужно смотреть на данные с разных точек зрения, чтобы получить более полное представление о тенденциях и особенностях; Вам также может понадобиться построить ломтики.

Джефф Оксберри
источник
Да, цветной график не подойдет, ты прав. Любая идея, какую функцию я бы использовал для этого тогда?
репка
2
Вы имеете в виду функцию в Python? Есть несколько библиотек, которые хорошо работают для построения графиков. Matplotlib обычно используется для 2D-графиков, а не 3D-графиков; ggplot и Bokeh имеют похожие варианты использования. Mayavi2, как предположил Хорхе, хорош для трехмерного изображения. Я предпочитаю программные пакеты для визуализации трехмерных данных, такие как ParaView или VisIt. Вы также можете взглянуть на yt (который основан на Python) и хорошо выполняет построение трехмерных данных. Любая стоящая библиотека визуализации должна предоставить вам несколько вариантов цветовой шкалы, непрозрачности, насыщенности и т. Д.
Джефф Оксберри,