|
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
|