From: Andrew S. <str...@as...> - 2004-05-21 21:02:14
|
John Hunter wrote: >>>>>>"Andrew" == Andrew Straw <str...@as...> writes: >>>>>> >>>>>> > > Andrew> Hi all, I'd like use matplotlib to draw shapes on a > Andrew> transparent background using the Agg backend to save .png > Andrew> files. Is this possible? > > Andrew> I've tried > > Andrew> fig._figurePatch.set_alpha(0) > >There is a vestigial limitation from the bad old days when we didn't >have an alpha channel. For polyons, there is no place holder for a >separate alpha channel for the edge and face. The way to do this >right is to simply replace all rgb instances throughout the library >with rgba, but this is a fair amount of work that touches the entire >library. What I am doing currently is sharing the alpha attribute >between edge and face for polygons. > >So setting alpha=0 *should work. What backend and version are you >using? Rectangle calls gc.set_alpha before calling draw_polygon in >patches.Patch. In _backend_agg.RendererAgg.draw_polygon, the alpha >attribute for the face is taken from the edge which gets it from the >gc (around line 204 in _backend_agg). I say all this just because >from my read of the code *it should* work, and indeed, in my tests > > f = figure(1, facecolor='r') > f._figurePatch.set_alpha(0.0) > >does work for me using Agg and the latest matplotlib. > > By "working for you", do you mean that you don't have a red face? Yes, that's fine, but if you read my initial email, I said "there's still (opaque) white drawn in the background" for this case. What do you get? I predict that you do. >What backend and version are you using? > > Agg, PS, CVS HEAD >That said, the best way to do this is to add a frameon attribute for >figures, because this will be respected across backends including >those who don't understand alpha. This way you can say > >f = figure(1, frameon=False) > >I checked this into CVS. > >JDH > > OK, here's a sample program (modified slightly from scatter_demo2.py: #!/usr/bin/env python import sys from matplotlib.matlab import * from data_helper import get_daily_data fig = figure(1,frameon=False) intc, msft = get_daily_data() delta1 = diff(intc.open)/intc.open[0] volume = (10*intc.volume[:-2]/intc.volume[0])**2 close = 0.003*intc.close[:-2]/0.003*intc.open[:-2] p = scatter(delta1[:-1], delta1[1:], c=close, s=volume) set(p, 'alpha', 0.75) set(gca(), 'xticks', arange(-0.06, 0.061, 0.02)) set(gca(), 'yticks', arange(-0.06, 0.061, 0.02)) xlabel(r'$\Delta_i$', fontsize='x-large') ylabel(r'$\Delta_{i+1}$', fontsize='x-large', verticalalignment='center', horizontalalignment='right', rotation='horizontal' ) title(r'Volume and percent change') grid(True) gca().set_frame_on(0) fig._figurePatch.set_alpha(0.0) # doesn't affect output savefig('scatter_demo3',facecolor='b',edgecolor='g') #show() Now, with the Agg backend (saving to PNG), I still get a non-transparent white background. (The face and edgecolors were specified just to test if they show up, which they don't.) Also, with the PS backend, I get a white rectangle at figure size. So, it looks like there's another white rectangle creeping in there somewhere... Can we find it and get rid of it? Cheers! Andrew |