【发布时间】:2020-11-27 14:50:14
【问题描述】:
我基本上想在其支持上“显示”三维 Dirichlet 分布的 pdf。下面的函数simplex 计算该支撑上的常规点,这些点存储在数组sim 中。数组pdf 保存sim 中每一行的标量密度。
我想到的第一件事是使用三角测量。但是,plot_trisurface 的 color 参数仅支持所有三角形的一种颜色。设置cmap 根据 z 坐标值为三角形着色(参见图 1)。 plot_trisurface 也忽略了 facecolors kwarg。然而,我想要的是根据pdf 为表面着色。
作为我发现的一种解决方法,我可以将曲面内插为 3d 散点图。这通常给出了所需的可视化,但我清楚地看到它是一个散点图;特别是在边界上。 (见图2)
有没有办法将 pdf 投影到单纯形上?
import itertools
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
def simplex(n_vals):
base = np.linspace(0, 1, n_vals, endpoint=False)
coords = np.asarray(list(itertools.product(base, repeat=3)))
return coords[np.isclose(coords.sum(axis=-1), 1.0)]
sim = simplex(20)
pdf = stats.dirichlet([1.1, 1.5, 1.3]).pdf(sim.T)
fig1 = plt.figure()
ax1 = fig1.add_subplot(1, 2, 1, projection='3d', azim=20)
ax2 = fig1.add_subplot(1, 2, 2, projection='3d', azim=20)
ax1.plot_trisurf(x, y, z, color='k')
ax2.plot_trisurf(x, y, z, cmap='Spectral')
fig2 = plt.figure()
ax21 = fig2.add_subplot(projection='3d', azim=20)
ax21.scatter3D(*sim.T, s=50, alpha=.5, c=pdf, cmap='Spectral')
【问题讨论】:
-
@gboffi 您发布的答案不相关,因为我没有矩形网格。感谢您的一般建议:谷歌搜索,是的,很棒的想法......
标签: python matplotlib triangulation