Как сделать тройной контурный график с помощью Python Plotly? - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь построить функцию, определенную на симплексе. По-видимому, вы можете сделать это очень хорошо, используя Matlab API .

enter image description here

Но я не могу понять, как это сделать, используя Python API. Ссылка имеет раздел с именем Ternary Contour Plots в Python , но она не отображает числовую функцию, а представляет функцию, отображающую симплекс в заданный дискретный набор.

Я пытался эмулировать код Matlab:

import plotly as py

A = [0, .2, .2, .2, 0, .6, .75, .9, 0, 1, .8, .3]
B = [1, .2, .4, .1, 0, .4, .05, 0, .8, 0, .05, .3]
C = [0, .6, .4, .7, 1, 0, .2, .1, .2, 0, .15, .4]
Z = [.1, .5, .1, .2, 1, .8, .4, 0, .1, .6, 1, .7]

trace = {
    "type": 'scatterternary',
    "carpet": 'scattercontour',
    "a": A,
    "b": B,
    "c": C,
    "z": Z
}

layout = {
    'title': 'Simple Ternary Contour Plot with Python'
}

figure = dict(data=[trace], layout=layout)
py.offline.plot(figure, validate=False)

Но вместо этого я получаю этот сюжет:

enter image description here

Ответы [ 2 ]

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

Если кто-то все еще заинтересован, здесь - это блокнот Jupyter, чтобы увидеть, как сгенерировать трехслойный контурный график.

0 голосов
/ 02 июля 2018

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

Вот пример, показывающий функцию плотности распределения Дирихле:

import plotly as py
import plotly.graph_objs as go
import numpy as np


def compute_in_barycentric_coordinates(a, b, c):
    epsilon = 1e-6
    if 0.0 < a < 1.0 and 0.0 < b < 1.0 and 0.0 < c < 1.0 and abs(a + b + c - 1.0) < epsilon:
        return pow(a, 2) * pow(b, 1.5) * pow(c, 1.8)
    return None


x_data = np.linspace(0, 1, 101)
y_data = np.linspace(0, 1, 101)
z_data = []
f = 1.0 / pow(3.0, 0.5)
for y in y_data:
    next_slice = []
    for x in x_data:
        a = 1 - x - f*y
        b = x - f*y
        c = 2*f*y
        z = compute_in_barycentric_coordinates(a, b, c)
        next_slice.append(z)
    z_data.append(next_slice)


data = [
    go.Contour(
        x=x_data,
        y=y_data,
        z=z_data,
    )
]


py.offline.plot(data)

enter image description here

Однако это все еще обходной путь, поэтому, если у вас есть идея получше, я буду очень рад услышать от вас.

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