Python 将相同的颜色贴图和颜色栏应用于多个3D打印

Python 将相同的颜色贴图和颜色栏应用于多个3D打印,python,matplotlib,colorbar,mplot3d,Python,Matplotlib,Colorbar,Mplot3d,目标是以“公平”的方式输出两个不同的3D绘图(plot\u surface),为曲面(facecolors)提供特定的颜色,即为两个图形使用相同的颜色比例(相同的x、y和z轴固定,但这很容易)。此外,颜色条必须相同(即相同的刻度和范围)。换句话说,假设图1中的(任意)值8与深红色关联。然后,也必须申请图2。请注意,在示例中,X、Y和Z对于两个图都是相同的,以使事情更简单。与表面相关的颜色有什么变化(即V1和V2) 如您所见,存在两个问题: 尽管V1和V2不同,但两个曲面的颜色是相同的(事实上

目标是以“公平”的方式输出两个不同的3D绘图(
plot\u surface
),为曲面(
facecolors
)提供特定的颜色,即为两个图形使用相同的颜色比例(相同的x、y和z轴固定,但这很容易)。此外,颜色条必须相同(即相同的刻度和范围)。换句话说,假设图1中的(任意)值8与深红色关联。然后,也必须申请图2。请注意,在示例中,X、Y和Z对于两个图都是相同的,以使事情更简单。与表面相关的颜色有什么变化(即V1和V2)

如您所见,存在两个问题:

  • 尽管V1和V2不同,但两个曲面的颜色是相同的(事实上,我应用了线性缩放从V1获得V2)
  • 颜色栏具有不同的值范围

  • 好的是,颜色栏将所有图形中相同的颜色与相同的值相关联。如何解决前两个问题?

    在调用
    m.set\u array(V2)
    的循环中。所以两者都使用
    V2
    作为数组;因此,它们是相同的

    应该使用lopp变量
    V

    m.set_array(V)
    

    我想我已经为您提供了规范化V值的方法。当使用两个不同的数组进行着色时,您需要确保对这两个数组使用相同的规范化,而不是单独规范化每个数组

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    from matplotlib import cm
    import matplotlib.colors
    
    x = np.arange(3)
    X,Y = np.meshgrid(x,x)
    Z = np.ones_like(X)
    
    V1 = np.array([[3,2,2],[1,0,3],[2,1,0]])
    V2 = 1+ V1*1.6
    
    def plot_array(V, vmin, vmax):
    
        fig = plt.figure()
        ax = fig.add_subplot(111, projection='3d')
        norm = matplotlib.colors.Normalize(vmin=vmin, vmax=vmax)
        ax.plot_surface(X, Y, Z, facecolors=plt.cm.jet(norm(V)), shade=False)
    
        m = cm.ScalarMappable(cmap=plt.cm.jet, norm=norm)
        m.set_array([])
        plt.colorbar(m)
    
        ax.set_xlabel('x')
        ax.set_ylabel('y')
    
    
    plot_array(V1, np.min([V1.min(), V2.min()]), np.max([V1.max(), V2.max()]))
    plot_array(V2, np.min([V1.min(), V2.min()]), np.max([V1.max(), V2.max()]))
    
    plt.show()
    

    请修复代码的缩进。我不知道函数
    my_plot3d
    的结束位置。感谢您发现该错误。然而,这种解决方案只能部分解决问题。我已经编辑了问题,更新了答案。
    m.set_array(V)
    
    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    from matplotlib import cm
    import matplotlib.colors
    
    x = np.arange(3)
    X,Y = np.meshgrid(x,x)
    Z = np.ones_like(X)
    
    V1 = np.array([[3,2,2],[1,0,3],[2,1,0]])
    V2 = 1+ V1*1.6
    
    def plot_array(V, vmin, vmax):
    
        fig = plt.figure()
        ax = fig.add_subplot(111, projection='3d')
        norm = matplotlib.colors.Normalize(vmin=vmin, vmax=vmax)
        ax.plot_surface(X, Y, Z, facecolors=plt.cm.jet(norm(V)), shade=False)
    
        m = cm.ScalarMappable(cmap=plt.cm.jet, norm=norm)
        m.set_array([])
        plt.colorbar(m)
    
        ax.set_xlabel('x')
        ax.set_ylabel('y')
    
    
    plot_array(V1, np.min([V1.min(), V2.min()]), np.max([V1.max(), V2.max()]))
    plot_array(V2, np.min([V1.min(), V2.min()]), np.max([V1.max(), V2.max()]))
    
    plt.show()