python - 3D 图和 3D 直方图子图

标签 python matplotlib matplotlib-3d

    import numpy as np
    import math
    from pylab import cm,imshow,colorbar,title,show
    import pylab as pyl

    from mpl_toolkits import mplot3d
    import matplotlib.pyplot as plt


    #Parameters
    N = 10**2                        #Step of discretization
 
    # Cost function
    T = np.linspace(0,1,N, False) #Discretization of [0,1]
    S = np.linspace(1,2,N,False) #Discretization of [1,2]
    X,Y = np.meshgrid(T,S)
    C = (X-Y)**2                    #Matrix of c[i,j]=(xi-yj)²

    def Sinkhorn(M, r, c, lam):
    """
    Computes the optimal transport matrix and Slinkhorn distance using the
    Sinkhorn-Knopp algorithm

    Inputs:
        - M : cost matrix (n x m)
        - r : vector of marginals (n, )
        - c : vector of marginals (m, )
        - lam : strength of the entropic regularization
        - arret : convergence parameter

    Outputs:
        - P : optimal transport matrix (n x m)
        - dist : Sinkhorn distance
    """

    # Uniform measure over [0;1]
    uni1 = np.ones(N)

    # Uniform measure over [1;2]
    uni2 = np.ones(N)

    n = 1000

    fig = plt.figure()
    ax = plt.axes(projection='3d')
    # I'm going to compute a matrix which is a approximation of a probability over R^{2}
    Gamma_star = Sinkhorn(C, uni1, uni2, 1/10**4)
    ax.scatter(X, Y, Gamma_star)
    plt.title("Gamma bar 1/{} entre une uniforme([0;1]) et uniforme([1;2])".format(1/10**4))    
    plt.show()

Output of my code

我的问题: Gamma 条收敛到我想研究的一个度量,所以我想打印子图,如下所示:(当然它不起作用,只是为了告诉你我的想法)

    for i in range(4):
        plt.subplot(2,2,i+1) 
        Gamma_star = Sinkhorn(C, uni1, uni2, 1/10**i)
        ax.scatter(X, Y, Gamma_star)
        plt.title("Gamma bar 1/{} between uniform([0;1]) and uniform([1;2])".format(1/10**i))    
    plt.plot()

我还想用 X、Y 和 Z = Gamma_bar 绘制(以完全相同的方式绘制子图)3D 直方图,如下所示:

Histogram3D

最佳答案

我设法完成了第一部分(绘制图表的子图),这是我的解决方案:

fig = plt.figure()
for i in range(4):
    ax = fig.add_subplot(2, 2, i+1, projection='3d')
    Gamma_star, tqui = Sinkhorn(C, uni1, uni2, 1/10**i)
    ax.scatter(X, Y, Gamma_star)
    plt.title("Gamma bar 1/{} entre une uniforme([0;1]) et uniforme([1;2])".format(1/10**i))

plt.show()

结果:Output

你有什么想法可以改进我的情节吗? 也许添加颜色,也许更改参数,因为所有图看起来都一样,... 欢迎任何帮助:)。

例如,我发现这种颜色很酷:

Colorfull plot

无论如何,现在我将重点关注 histogram3D 子图。

关于python - 3D 图和 3D 直方图子图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59442800/

相关文章:

python - 在 pandas 的 seaborn clustermap 中设置 col_colors

python - Matplotlib/Seaborn 中的颜色无法正常工作

python - 使用 matplotlib.pyplot 添加轴时如何保留分辨率?

python - 给定一般 3D 平面方程

python - 具有颜色渐变的 3D 散点图,其中颜色取决于计数

python - 如何为 SQLAlchemy 中的所有表设置公共(public)前缀

python - 如何在 Networkx 中绘制图形的长度

python - 为什么 += 在列表中表现异常?

python - 线性回归预测与训练数据不匹配

python - 如何绘制 2 个变量的 3D 函数