我正在尝试绘制一个定义在单形上的函数。显然,你可以使用do it very nicely using the Matlab API。

但是我不知道如何使用Python API来做到这一点。该参考有一个名为Ternary Contour Plots in 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)但我得到的是这个图:

发布于 2018-11-08 01:34:33
如果有人仍然感兴趣,here是一本Jupyter Notebook,看看如何生成Plotly三元等高线图。
发布于 2018-07-02 23:26:58
如果您可以生成要按任意比例绘制其等高线的数据,则可以采用一种解决方法。在这种情况下,您可以在网格上生成(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)

然而,这仍然是一个变通办法,所以如果你有更好的想法,我将非常高兴听到你的消息。
https://stackoverflow.com/questions/51104595
复制相似问题