2014-05-16 9 views
6

Ich erstelle ein Mesh-Plot mit mayavi.mlab und möchte, dass die Hintergrund-Opazität 0. (oder transparent) ist. Ist das möglich?Kann Mayavi eine Figurenszene mit transparentem Hintergrund rendern?

+0

Welche Ergebnis Datei erwarten Sie? Genauer: Was erwarten Sie von diesem transparenten Hintergrund? Versuchen Sie, Bilder mit einigen 3D gerenderten Objekten auf einem anderen Hintergrund zu erstellen? Oder versuchen Sie vielleicht, dass Ihr Fenstermanager die Szene auf einen anderen Hintergrund zusammensetzt? Das erste Szenario ist wahrscheinlich mit Nachbearbeitungshilfe möglich. Das zweite ist definitiv nicht. Geben Sie genauer an, was Sie zu tun versuchen. – aestrivex

Antwort

1

Sie können die Transparenz nicht direkt festlegen. Sie können jedoch die Figur mit einer Hintergrundfarbe (anders als die Vordergrundfarbe) und verwenden ImageMagick speichern den Hintergrund

Zum Beispiel entfernen

mlab.figure(size = (1024,768),\ 
      bgcolor = (1,1,1), fgcolor = (0.5, 0.5, 0.5)) 

# Your fantastic plotting script 

mlab.save('pure_beauty.png') 

jetzt ImageMagick verwenden, um den Hintergrund

convert pure_beauty.png -transparent white pure_transparent_beauty.png 
zu entfernen

wie gezeigt here.

2

Wenn es Ihr Ziel ist, die Mayavi-Figur in eine Matplotlib-Figur zu integrieren, ist dies möglich. Sie können mlab.screenshot verwenden, um eine Anzahl von RGBA-Werten zu erhalten, und mlab setzt Hintergrundpixel automatisch auf 0. Sie können diese RGBA-Matrix dann über imshow zu einer Matlab-Figur hinzufügen. Beispiel (angepasst von 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

können Sie auch die RGBA-Array speichern nur direkt mit plt.imsave(arr=imgmap, fname="foo.png")

+3

Wenn ich diesen genauen Code ausführe, funktioniert es nicht (d. H. Die Mayavi-Figur hat einen grauen Hintergrund anstelle von transparent). –

+0

Es funktioniert gut für mich: 'mayavi' Version' 4.5.0' & 'matplotlib' Version' 1.5.1'. – ryanjdillon

Verwandte Themen