matplotlib制作3D曲面图plot_surface时,alpha值的设置问题。

我现在用matplotlib制作3D图(plot_surface)有一行代码如下:
ax.plot_surface(x, y, np_2, rstride=50, cstride=50, cmap='rainbow')
其中,x,y代表网格化,np_2是高度数据(一个数组,数组中的每个值的位置对应于x和y的网格化位置)
我现在并不想让np_2的所有数值都显现出来,能否用到alpha参数,让低于某个阈值的数值alpha值变为0,其余变为1?

另外,在2D图中下面的写法是有用的,但是3D图好像不管用。
alpha_1 = np.where(list_1[1] > backgroud_value, 0.9, 0)
ax.imshow(list_1[1], zorder=2, alpha=alpha_1, clim=(backgroud_value, max_value), cmap='rainbow')

有哪位高人知道吗?多谢赐教!

努力の小熊结合ChatGPT的回答:
可以使用alpha参数来控制3D曲面图的透明度,以达到让低于某个阈值的数值alpha值变为0的效果。具体做法是将np_2中小于阈值的数值设为0,大于等于阈值的数值设为1,然后在plot_surface时设置alpha参数为np_2即可。示例代码如下:

np_2_alpha = np.where(np_2 < threshold, 0, 1)
ax.plot_surface(x, y, np_2, rstride=50, cstride=50, cmap='rainbow', alpha=np_2_alpha)

关于2D图中使用imshow函数设置alpha参数的问题,在3D图中不适用是因为imshow函数只能绘制二维图像,而不能指定图像在三维空间中的位置和姿态。在3D曲面图中,应该使用plot_surface函数来呈现数据,同时使用alpha参数来控制透明度。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    在绘制3D曲面图时,可以在绘制表面时传入alpha参数,控制表面透明度,低于某个阈值的数值的alpha值变为0,其余变为1的方法如下:

    1.先将Z矩阵按照阈值划分为两个矩阵:Z0和Z1,其中Z0中小于阈值的值赋为0,大于该阈值的值赋为nan,Z1中小于该阈值的值赋为nan,大于该阈值的值赋为1。

    thres = 0.5
    Z0 = Z.copy()
    Z1 = Z.copy()
    Z0[Z0 <= thres] = 0
    Z0[Z0 > thres] = np.nan
    Z1[Z1 < thres] = np.nan
    Z1[Z1 >= thres] = 1
    

    2.绘制表面的时候,将表面的颜色取一个较深的值,同时将Z1的alpha值设为1,Z0的alpha值设为0,即可实现上述需求。完整代码如下:

    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    from matplotlib import cm
    from matplotlib.ticker import LinearLocator, FormatStrFormatter
    import numpy as np
    
    
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    
    # Make data.
    X = np.arange(-5, 5, 0.25)
    Y = np.arange(-5, 5, 0.25)
    X, Y = np.meshgrid(X, Y)
    R = np.sqrt(X**2 + Y**2)
    Z = np.sin(R)
    
    # get threshold matrix
    thres = 0.5
    Z0 = Z.copy()
    Z1 = Z.copy()
    Z0[Z0 <= thres] = 0
    Z0[Z0 > thres] = np.nan
    Z1[Z1 < thres] = np.nan
    Z1[Z1 >= thres] = 1
    
    # Plot the surface.
    surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm, alpha=0.2,
                           linewidth=0, antialiased=False)
    
    # Add Z0 and Z1 matrix to plot
    ax.plot_surface(X, Y, Z1, cmap=cm.coolwarm, alpha=1,
                           linewidth=0, antialiased=False)
    ax.plot_surface(X, Y, Z0, color='black', alpha=0,
                           linewidth=0, antialiased=False)
    
    # Customize the z axis.
    ax.set_zlim(-1.01, 1.01)
    ax.zaxis.set_major_locator(LinearLocator(10))
    ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
    
    # Add a color bar which maps values to colors.
    fig.colorbar(surf, shrink=0.5, aspect=5)
    
    plt.show()
    

    另外,2D图的相应代码在3D图中不能起作用的原因是,二者的绘图参数与函数不同,需要对应修改代码。如果需要将2D图的展示内容加入到3D图中,需要另外对2D图进行重写。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^