Can Mayavi render a figure scene with a transparent background?

后端 未结 2 711
谎友^
谎友^ 2021-01-18 03:37

I am generating a mesh plot using mayavi.mlab and want the background opacity to be 0. (or transparent). Is this possible?

2条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-01-18 04:25

    If your goal is to integrate the mayavi figure into a matplotlib figure, this is possible. You can use mlab.screenshot to get a numpy array of RGBA values, and mlab will set background pixels to have alpha 0 automatically. You can then add this RGBA matrix to a matplotlib figure via imshow. Example (adapted from here):

    import numpy as np
    from mayavi import mlab
    import matplotlib.pyplot as plt
    # set up some plotting params
    dphi, dtheta = np.pi / 250.0, np.pi / 250.0
    [phi, theta] = np.mgrid[0:np.pi + dphi * 1.5:dphi,
                            0:2 * np.pi + dtheta * 1.5:dtheta]
    m0, m1, m2, m3 = 4, 3, 2, 3
    m4, m5, m6, m7 = 6, 2, 6, 4
    r = np.sin(m0 * phi) ** m1 + np.cos(m2 * phi) ** m3 + \
        np.sin(m4 * theta) ** m5 + np.cos(m6 * theta) ** m7
    x = r * np.sin(phi) * np.cos(theta)
    y = r * np.cos(phi)
    z = r * np.sin(phi) * np.sin(theta)
    # do the meshplot    
    fig = mlab.figure(size=(480, 340))
    mlab.mesh(x, y, z, colormap='cool', figure=fig)
    imgmap = mlab.screenshot(figure=fig, mode='rgba', antialiased=True)
    mlab.close(fig)
    # do the matplotlib plot
    fig2 = plt.figure(figsize=(7, 5))
    plt.imshow(imgmap, zorder=4)
    plt.plot(np.arange(0, 480), np.arange(480, 0, -1), 'r-')
    plt.savefig('example.png')
    

    mayavi meshplot composited onto matplotlib line graph

    You can also just save the RGBA array directly to file using plt.imsave(arr=imgmap, fname="foo.png")

提交回复
热议问题