Generuję wykres siatki za pomocą mayavi.mlab i chcę, aby krycie tła miało wartość 0. (lub przezroczyste). czy to możliwe?Czy Mayavi może renderować scenę z przezroczystym tłem?
Odpowiedz
Nie można bezpośrednio ustawić przezroczystości. Można jednak zapisać postać z kolorem tła (innym niż kolor na pierwszym planie) i używać ImageMagick aby usunąć tło
Na przykład
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')
teraz używać ImageMagick aby usunąć tło
convert pure_beauty.png -transparent white pure_transparent_beauty.png
jak pokazano here.
Jeśli twoim celem jest integracja figury mayavi w postaci matplotlib, jest to możliwe. Możesz użyć mlab.screenshot
, aby uzyskać numpy tablicę wartości RGBA, a mlab
ustawi piksele w tle tak, aby automatycznie zawierały alfa 0
. Następnie można dodać tę macierz RGBA do postaci matlab przez imshow
. Przykład (zaadaptowane z 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')
Można również po prostu zapisać tablicę RGBA bezpośrednio do pliku przy użyciu plt.imsave(arr=imgmap, fname="foo.png")
Po uruchomieniu tego dokładnego kodu, to nie działa (tj. Rysunek mayavi ma szare tło zamiast przezroczystego). –
Działa to dobrze dla mnie: 'mayavi' wersja' 4.5.0' i 'matplotlib' wersja' 1.5.1'. – ryanjdillon
Jaki wynik się spodziewasz? A dokładniej, czego możesz się spodziewać * z * tym przezroczystym tłem? Czy próbujesz utworzyć obrazy z niektórymi obiektami 3D renderowanymi na innym tle? A może starasz się, aby twój menedżer okien komponował scenę na jakimś innym tle? Pierwszy scenariusz jest prawdopodobnie możliwy przy pomocy postprocessingu. Drugi zdecydowanie nie jest. Podaj więcej szczegółów na temat tego, co próbujesz zrobić. – aestrivex