<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">Hello,</p>
<p style="margin:0px 0px 1.2em!important">I couldn’t find an example in the gallery, but just reading <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Figure.savefig</code>, and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">FigureCanvasBase.print_figure</code> it was pretty clear how extra arguments would flow to the backend, and that appropriately prefixed keyword arguments would insulate the the high level API.</p>
<p style="margin:0px 0px 1.2em!important">Since the preferred approach would be to just migrate this logic into the SVG backend, it would also be a good opportunity to expose some of the other parts of the SVG canvas that are otherwise left constant or effectively constant by association e.g. <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">height</code> vs. <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">viewBox</code> dimensions, setting other attributes on the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline"><svg></code> element, and the inclusion of some extra external components like including <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline"><defs></code> sections as described in <a href="http://matplotlib.org/examples/misc/svg_filter_line.html">svg_filter_line</a>.</p>
<p style="margin:0px 0px 1.2em!important">Proposed implementation would be:</p>
<ol style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px">Add keyword arguments <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">svg_gid_data</code> and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">svg_attribs</code> to <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">FigureCanvasSVG._print_svg</code> to be passed to <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">RendererSVG</code>, which will be expected to be <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Mapping</code>-like objects.</li>
<li style="margin:0.5em 0px">Add <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">svg_gid_data</code> and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">svg_attribs</code> arguments to <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">RendererSVG.__init__</code> and attributes by the same name.</li>
<li style="margin:0.5em 0px">When <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">RendererSVG</code> begins writing the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline"><svg></code> tag, use the default values as written, and those key-value pairs of <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">self.svg_attribs</code> except for <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">"defs"</code> and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">"extra_content"</code> keys.</li>
<li style="margin:0.5em 0px">After completing the opening <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline"><svg></code> tag, if a <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">"extra_content"</code> key is in <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">self.svg_attribs</code>, this content will be written verbatim into the output stream, where malformed XML will produce invalid markup.</li>
<li style="margin:0.5em 0px">If <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">"defs"</code> is in <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">self.svg_attribs</code>, the value will be written into the stream verbatim, (or map a dict of dicts  to XML? Seems too much work for something I don’t know enough about).</li>
<li style="margin:0.5em 0px">When <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">RendererSVG</code> begins rendering an artist, it will check if the artist has an assigned gid by calling <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Artist.get_gid</code>, and if a gid is set, check <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">self.svg_gid_data</code> for additional data to include when opening the artist’s appropriate tag. No translation will be done so attribute names will be used as-is. This could be used to set <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">on<event></code> handlers and set the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">class</code> attribute, as well as adding <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">data-<name></code> attributes for adding semantic data to the graphical elements.</li>
</ol>
<p style="margin:0px 0px 1.2em!important">I can also fix an omission in <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">FigureCanvasSVG.print_svgz</code> failing to propagate **kwargs to <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">_print_svg</code>.</p>
<p style="margin:0px 0px 1.2em!important">Thank you,<br>Joshua Klein</p>
<div title="MDH:SGVsbG8sPGRpdj48YnI+PC9kaXY+PGRpdj5JIGNvdWxkbid0IGZpbmQgYW4gZXhhbXBsZSBpbiB0
aGUgZ2FsbGVyeSwgYnV0IGp1c3QgcmVhZGluZyBgRmlndXJlLnNhdmVmaWdgLCBhbmQgYEZpZ3Vy
ZUNhbnZhc0Jhc2UucHJpbnRfPHdicj5maWd1cmVgIGl0IHdhcyBwcmV0dHkgY2xlYXIgaG93IGV4
dHJhIGFyZ3VtZW50cyB3b3VsZCBmbG93IHRvIHRoZSBiYWNrZW5kLCBhbmQgdGhhdCBhcHByb3By
aWF0ZWx5IHByZWZpeGVkIGtleXdvcmQgYXJndW1lbnRzIHdvdWxkIGluc3VsYXRlIHRoZSB0aGUg
aGlnaCBsZXZlbCBBUEkuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5TaW5jZSB0aGUgcHJlZmVy
cmVkIGFwcHJvYWNoIHdvdWxkIGJlIHRvIGp1c3QgbWlncmF0ZSB0aGlzIGxvZ2ljIGludG8gdGhl
IFNWRyBiYWNrZW5kLCBpdCB3b3VsZCBhbHNvIGJlIGEgZ29vZCBvcHBvcnR1bml0eSB0byBleHBv
c2Ugc29tZSBvZiB0aGUgb3RoZXIgcGFydHMgb2YgdGhlIFNWRyBjYW52YXMgdGhhdCBhcmUgb3Ro
ZXJ3aXNlIGxlZnQgY29uc3RhbnQgb3IgZWZmZWN0aXZlbHkgY29uc3RhbnQgYnkgYXNzb2NpYXRp
b24gZS5nLiBgaGVpZ2h0YCB2cy4gYHZpZXdCb3hgIGRpbWVuc2lvbnMsIHNldHRpbmcgb3RoZXIg
YXR0cmlidXRlcyBvbiB0aGUgYCZsdDtzdmcmZ3Q7YCBlbGVtZW50LCBhbmQgdGhlIGluY2x1c2lv
biBvZiBzb21lIGV4dHJhIGV4dGVybmFsIGNvbXBvbmVudHMgbGlrZSBpbmNsdWRpbmcgYCZsdDtk
ZWZzJmd0O2Agc2VjdGlvbnMgYXMgZGVzY3JpYmVkIGluIFtzdmdfZmlsdGVyX2xpbmVdKDxhIGhy
ZWY9Imh0dHA6Ly9tYXRwbG90bGliLm9yZy9leGFtcGxlcy9taXNjL3N2Z19maWx0ZXJfbGluZS5o
dG1sIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovLzx3YnI+bWF0cGxvdGxpYi5vcmcvZXhhbXBsZXMv
bWlzYy88d2JyPnN2Z19maWx0ZXJfbGluZS5odG1sPC9hPikuPC9kaXY+PGRpdj48YnI+PC9kaXY+
PGRpdj5Qcm9wb3NlZCBpbXBsZW1lbnRhdGlvbiB3b3VsZCBiZTo8L2Rpdj48ZGl2Pjxicj48L2Rp
dj48ZGl2PjEuIEFkZCBrZXl3b3JkIGFyZ3VtZW50cyBgc3ZnX2dpZF9kYXRhYCBhbmQgYHN2Z19h
dHRyaWJzYCB0byBgRmlndXJlQ2FudmFzU1ZHLl9wcmludF9zdmdgIHRvIGJlIHBhc3NlZCB0byBg
UmVuZGVyZXJTVkdgLCB3aGljaCB3aWxsIGJlIGV4cGVjdGVkIHRvIGJlIGBNYXBwaW5nYC1saWtl
IG9iamVjdHMuPC9kaXY+PGRpdj4yLiBBZGQgYHN2Z19naWRfZGF0YWAgYW5kIGBzdmdfYXR0cmli
c2AmbmJzcDthcmd1bWVudHMgdG8gYFJlbmRlcmVyU1ZHLl9faW5pdF9fYCBhbmQgYXR0cmlidXRl
cyBieSB0aGUgc2FtZSBuYW1lLjwvZGl2PjxkaXY+My4gV2hlbiBgUmVuZGVyZXJTVkdgIGJlZ2lu
cyB3cml0aW5nIHRoZSBgJmx0O3N2ZyZndDtgIHRhZywgdXNlIHRoZSBkZWZhdWx0IHZhbHVlcyBh
cyB3cml0dGVuLCBhbmQgdGhvc2Uga2V5LXZhbHVlIHBhaXJzIG9mIGBzZWxmLnN2Z19hdHRyaWJz
YCBleGNlcHQgZm9yIGAiZGVmcyJgIGFuZCBgImV4dHJhX2NvbnRlbnQiYCBrZXlzLjwvZGl2Pjxk
aXY+NC4gQWZ0ZXIgY29tcGxldGluZyB0aGUgb3BlbmluZyBgJmx0O3N2ZyZndDtgIHRhZywgaWYg
YSBgImV4dHJhX2NvbnRlbnQiYCBrZXkgaXMgaW4gYHNlbGYuc3ZnX2F0dHJpYnNgLCB0aGlzIGNv
bnRlbnQgd2lsbCBiZSB3cml0dGVuIHZlcmJhdGltIGludG8gdGhlIG91dHB1dCBzdHJlYW0sIHdo
ZXJlIG1hbGZvcm1lZCBYTUwgd2lsbCBwcm9kdWNlIGludmFsaWQgbWFya3VwLjwvZGl2PjxkaXY+
NS4gSWYgYCJkZWZzImAgaXMgaW4gYHNlbGYuc3ZnX2F0dHJpYnNgLCB0aGUgdmFsdWUgd2lsbCBi
ZSB3cml0dGVuIGludG8gdGhlIHN0cmVhbSB2ZXJiYXRpbSwgKG9yIG1hcCBhIGRpY3Qgb2YgZGlj
dHMgJm5ic3A7dG8gWE1MPyBTZWVtcyB0b28gbXVjaCB3b3JrIGZvciBzb21ldGhpbmcgSSBkb24n
dCBrbm93IGVub3VnaCBhYm91dCkuPC9kaXY+PGRpdj42LiBXaGVuIGBSZW5kZXJlclNWR2AgYmVn
aW5zIHJlbmRlcmluZyBhbiBhcnRpc3QsIGl0IHdpbGwgY2hlY2sgaWYgdGhlIGFydGlzdCBoYXMg
YW4gYXNzaWduZWQgZ2lkIGJ5IGNhbGxpbmcgYEFydGlzdC5nZXRfZ2lkYCwgYW5kIGlmIGEgZ2lk
IGlzIHNldCwgY2hlY2sgYHNlbGYuc3ZnX2dpZF9kYXRhYCBmb3IgYWRkaXRpb25hbCBkYXRhIHRv
IGluY2x1ZGUgd2hlbiBvcGVuaW5nIHRoZSBhcnRpc3QncyBhcHByb3ByaWF0ZSB0YWcuIE5vIHRy
YW5zbGF0aW9uIHdpbGwgYmUgZG9uZSBzbyBhdHRyaWJ1dGUgbmFtZXMgd2lsbCBiZSB1c2VkIGFz
LWlzLiBUaGlzIGNvdWxkIGJlIHVzZWQgdG8gc2V0IGBvbiZsdDtldmVudCZndDtgIGhhbmRsZXJz
IGFuZCBzZXQgdGhlIGBjbGFzc2AgYXR0cmlidXRlLCBhcyB3ZWxsIGFzIGFkZGluZyBgZGF0YS0m
bHQ7bmFtZSZndDtgIGF0dHJpYnV0ZXMgZm9yIGFkZGluZyBzZW1hbnRpYyBkYXRhIHRvIHRoZSBn
cmFwaGljYWwgZWxlbWVudHMuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JIGNhbiBhbHNvIGZp
eCBhbiBvbWlzc2lvbiBpbiBgRmlndXJlQ2FudmFzU1ZHLnByaW50X3N2Z3pgIGZhaWxpbmcgdG8g
cHJvcGFnYXRlICoqa3dhcmdzIHRvIGBfcHJpbnRfc3ZnYC48L2Rpdj48ZGl2Pjxicj48L2Rpdj48
ZGl2PlRoYW5rIHlvdSw8L2Rpdj48ZGl2Pkpvc2h1YSBLbGVpbjwvZGl2Pg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Apr 1, 2017 at 4:30 PM, Thomas Caswell <span dir="ltr"><<a href="mailto:tcaswell@gmail.com" target="_blank">tcaswell@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Joshua,<div><br></div><div>That is an interesting use case!</div><div><br></div><div>I am hesitant to add this attribute to Artist because it is very specific to the SVG backend (none of the other backends would make use of this as far as I know). On the other hand, a generic way to use gid to add extra information in the SVG backend could be interesting.  I am pretty sure there are examples of optianal backend-specific kwargs going into `savefig`, what would the API for that look like?</div><div><br></div><div>Tom</div></div><br><div class="gmail_quote"><div><div class="h5"><div dir="ltr">On Wed, Mar 22, 2017 at 4:42 PM Joshua Klein <<a href="mailto:mobiusklein@gmail.com" target="_blank">mobiusklein@gmail.com</a>> wrote:<br></div></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5"><div dir="ltr" class="m_4789840580364361708gmail_msg"><div class="m_4789840580364361708m_67930946521814947markdown-here-wrapper m_4789840580364361708gmail_msg"><p style="margin:0px 0px 1.2em!important" class="m_4789840580364361708gmail_msg">Hello,</p>
<p style="margin:0px 0px 1.2em!important" class="m_4789840580364361708gmail_msg">I often embed figures as SVG graphics in web pages. As part of this process, I usually do the following</p>
<ol style="margin:1.2em 0px;padding-left:2em" class="m_4789840580364361708gmail_msg">
<li style="margin:0.5em 0px" class="m_4789840580364361708gmail_msg"><p style="margin:0px 0px 1.2em!important;margin:0.5em 0px!important" class="m_4789840580364361708gmail_msg">Set gids on artists and link that gid to a set of data describing that part of a graphic in an external dictionary. This includes things like setting the element’s class, extra contextual information, information that would be good to show in a tooltip, ids of related elements, and so forth.</p>
</li>
<li style="margin:0.5em 0px" class="m_4789840580364361708gmail_msg"><p style="margin:0px 0px 1.2em!important;margin:0.5em 0px!important" class="m_4789840580364361708gmail_msg">Serialize the figure into a file-like object, use an element tree implementation’s <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline" class="m_4789840580364361708gmail_msg">XMLID</code> to get an element id map and Element objects</p>
</li>
<li style="margin:0.5em 0px" class="m_4789840580364361708gmail_msg"><p style="margin:0px 0px 1.2em!important;margin:0.5em 0px!important" class="m_4789840580364361708gmail_msg">Iterate over my data dictionary from (1) and set keys in the mapped Element’s <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline" class="m_4789840580364361708gmail_msg">attrib</code> dictionary, using the id map from (2)</p>
</li>
<li style="margin:0.5em 0px" class="m_4789840580364361708gmail_msg"><p style="margin:0px 0px 1.2em!important;margin:0.5em 0px!important" class="m_4789840580364361708gmail_msg">Use the element tree implementation’s <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline" class="m_4789840580364361708gmail_msg">tostring</code> function to serialize the updated Element objects back into a string and then send the string out as a response to a web request.</p>
</li>
<li style="margin:0.5em 0px" class="m_4789840580364361708gmail_msg"><p style="margin:0px 0px 1.2em!important;margin:0.5em 0px!important" class="m_4789840580364361708gmail_msg">After receiving the SVG string from the server on the client, add the SVG to the page’s DOM and then hang event handlers on it (or pre-specify delegated handlers) that use the added attributes to configure interactive behavior.</p>
</li>
</ol>
<p style="margin:0px 0px 1.2em!important" class="m_4789840580364361708gmail_msg">I looked at the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline" class="m_4789840580364361708gmail_msg">Artist</code> type and saw no good place to store “arbitrary data”. Before I start working on this I wanted to know if anyone else had a better solution. I would also like to know if the devs would be opposed to a PR that adds an extra dictionary/attribute to every <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline" class="m_4789840580364361708gmail_msg">Artist</code> instance created.</p>
<p style="margin:0px 0px 1.2em!important" class="m_4789840580364361708gmail_msg">Another alternative solution would be to find a way to push my dictionary mapping gids to extra attributes into the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline" class="m_4789840580364361708gmail_msg">SVGRenderer</code> and have it pass them as <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline" class="m_4789840580364361708gmail_msg">**extras</code> to <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline" class="m_4789840580364361708gmail_msg">XMLWriter.element</code> when it processes individual artists.</p>
<p style="margin:0px 0px 1.2em!important" class="m_4789840580364361708gmail_msg">Here’s a generic example of what I do currently:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px" class="m_4789840580364361708gmail_msg"><code class="m_4789840580364361708m_67930946521814947hljs m_4789840580364361708m_67930946521814947language-python m_4789840580364361708gmail_msg" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;background:rgb(241,239,238);color:rgb(104,97,94);padding:0.5em"><span class="m_4789840580364361708m_67930946521814947hljs-function m_4789840580364361708gmail_msg" style="color:rgb(64,126,231)"><span class="m_4789840580364361708m_67930946521814947hljs-keyword m_4789840580364361708gmail_msg" style="color:rgb(102,102,234)">def</span> <span class="m_4789840580364361708m_67930946521814947hljs-title m_4789840580364361708gmail_msg" style="color:rgb(118,110,107)">plot_with_extras_for_svg</span><span class="m_4789840580364361708m_67930946521814947hljs-params m_4789840580364361708gmail_msg" style="color:rgb(223,83,32)">(*<wbr>data, **kwargs)</span>:</span>
    <span class="m_4789840580364361708m_67930946521814947hljs-comment m_4789840580364361708gmail_msg" style="color:rgb(118,110,107)"># Do the plotting, generating the id-linked data in `id_mapper`</span>
    ax, id_mapper = plot_my_data(*data, **kwargs)
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()

    <span class="m_4789840580364361708m_67930946521814947hljs-comment m_4789840580364361708gmail_msg" style="color:rgb(118,110,107)"># compute the total space used in both dimensions when dealing with</span>
    <span class="m_4789840580364361708m_67930946521814947hljs-comment m_4789840580364361708gmail_msg" style="color:rgb(118,110,107)"># negative axis bounds</span>
    x_size = sum(map(abs, xlim))
    y_size = sum(map(abs, ylim))

    <span class="m_4789840580364361708m_67930946521814947hljs-comment m_4789840580364361708gmail_msg" style="color:rgb(118,110,107)"># Map the used axis space to the drawable region dimensions</span>
    aspect_ratio = x_size / y_size
    canvas_x = <span class="m_4789840580364361708m_67930946521814947hljs-number m_4789840580364361708gmail_msg" style="color:rgb(223,83,32)">8.</span>
    canvas_y = canvas_x / aspect_ratio

    <span class="m_4789840580364361708m_67930946521814947hljs-comment m_4789840580364361708gmail_msg" style="color:rgb(118,110,107)"># Configure the artist to draw within the new drawable region bounds</span>
    fig = ax.get_figure()
    fig.tight_layout(pad=<span class="m_4789840580364361708m_67930946521814947hljs-number m_4789840580364361708gmail_msg" style="color:rgb(223,83,32)">0.2</span>)
    fig.patch.set_visible(<span class="m_4789840580364361708m_67930946521814947hljs-keyword m_4789840580364361708gmail_msg" style="color:rgb(102,102,234)">False</span>)
    fig.set_figwidth(canvas_x)
    fig.set_figheight(canvas_y)

    ax.patch.set_visible(<span class="m_4789840580364361708m_67930946521814947hljs-keyword m_4789840580364361708gmail_msg" style="color:rgb(102,102,234)">False</span>)

    <span class="m_4789840580364361708m_67930946521814947hljs-comment m_4789840580364361708gmail_msg" style="color:rgb(118,110,107)"># Perform the first serialization</span>
    buff = StringIO()
    fig.savefig(buff, format=<span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">'svg'</span>)

    <span class="m_4789840580364361708m_67930946521814947hljs-comment m_4789840580364361708gmail_msg" style="color:rgb(118,110,107)"># Parse XML buffer from `buff` and configure tag attributes</span>
    root, ids = ET.XMLID(buff.getvalue())
    root.attrib[<span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">'class'</span>] = <span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">'plot-class-svg'</span>
    <span class="m_4789840580364361708m_67930946521814947hljs-keyword m_4789840580364361708gmail_msg" style="color:rgb(102,102,234)">for</span> id, attributes <span class="m_4789840580364361708m_67930946521814947hljs-keyword m_4789840580364361708gmail_msg" style="color:rgb(102,102,234)">in</span> id_mapper.items():
        element = ids[id]
        element.attrib.update({(<span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">"data-<wbr>"</span> + k): str(v)
                               <span class="m_4789840580364361708m_67930946521814947hljs-keyword m_4789840580364361708gmail_msg" style="color:rgb(102,102,234)">for</span> k, v <span class="m_4789840580364361708m_67930946521814947hljs-keyword m_4789840580364361708gmail_msg" style="color:rgb(102,102,234)">in</span> attributes.items()})
        element.attrib[<span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">'class'</span>] = id.rsplit(<span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">'-'</span>)[<span class="m_4789840580364361708m_67930946521814947hljs-number m_4789840580364361708gmail_msg" style="color:rgb(223,83,32)">0</span>]

    <span class="m_4789840580364361708m_67930946521814947hljs-comment m_4789840580364361708gmail_msg" style="color:rgb(118,110,107)"># More drawable space shenanigans</span>
    min_x, min_y, max_x, max_y = map(int, root.attrib[<span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">"viewBox"</span>].split(<span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">" "</span>))
    min_x += <span class="m_4789840580364361708m_67930946521814947hljs-number m_4789840580364361708gmail_msg" style="color:rgb(223,83,32)">100</span>
    max_x += <span class="m_4789840580364361708m_67930946521814947hljs-number m_4789840580364361708gmail_msg" style="color:rgb(223,83,32)">200</span>
    view_box = <span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">' '</span>.join(map(str, (min_x, min_y, max_x, max_y)))
    root.attrib[<span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">"viewBox"</span>] = view_box
    width = float(root.attrib[<span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">"width"</span>][:-<span class="m_4789840580364361708m_67930946521814947hljs-number m_4789840580364361708gmail_msg" style="color:rgb(223,83,32)">2</span><wbr>]) * <span class="m_4789840580364361708m_67930946521814947hljs-number m_4789840580364361708gmail_msg" style="color:rgb(223,83,32)">1.75</span>
    root.attrib[<span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">"width"</span>] = <span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">"100%"</span>

    height = width / (aspect_ratio)

    root.attrib[<span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">"height"</span>] = <span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">"%dpt"</span> % (height * <span class="m_4789840580364361708m_67930946521814947hljs-number m_4789840580364361708gmail_msg" style="color:rgb(223,83,32)">1.2</span>)
    root.attrib[<span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">"<wbr>preserveAspectRatio"</span>] = <span class="m_4789840580364361708m_67930946521814947hljs-string m_4789840580364361708gmail_msg" style="color:rgb(90,183,56)">"xMinYMin meet"</span>

    <span class="m_4789840580364361708m_67930946521814947hljs-comment m_4789840580364361708gmail_msg" style="color:rgb(118,110,107)"># Second serialization</span>
    svg = ET.tostring(root)
    plt.close(fig)

    <span class="m_4789840580364361708m_67930946521814947hljs-keyword m_4789840580364361708gmail_msg" style="color:rgb(102,102,234)">return</span> svg
</code></pre>
<p style="margin:0px 0px 1.2em!important" class="m_4789840580364361708gmail_msg">Thank you</p>
<div title="MDH:SGVsbG8sPGRpdj48YnI+PC9kaXY+PGRpdj5JIG9mdGVuIGVtYmVkIGZpZ3VyZXMgYXMgU1ZHIGdy
YXBoaWNzIGluIHdlYiBwYWdlcy4gQXMgcGFydCBvZiB0aGlzIHByb2Nlc3MsIEkgdXN1YWxseSBk
byB0aGUgZm9sbG93aW5nPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj4xLiBTZXQgZ2lkcyBvbiBh
cnRpc3RzIGFuZCBsaW5rIHRoYXQgZ2lkIHRvIGEgc2V0IG9mIGRhdGEgZGVzY3JpYmluZyB0aGF0
IHBhcnQgb2YgYSBncmFwaGljIGluIGFuIGV4dGVybmFsIGRpY3Rpb25hcnkuIFRoaXMgaW5jbHVk
ZXMgdGhpbmdzIGxpa2Ugc2V0dGluZyB0aGUgZWxlbWVudCdzIGNsYXNzLCBleHRyYSBjb250ZXh0
dWFsIGluZm9ybWF0aW9uLCBpbmZvcm1hdGlvbiB0aGF0IHdvdWxkIGJlIGdvb2QgdG8gc2hvdyBp
biBhIHRvb2x0aXAsIGlkcyBvZiByZWxhdGVkIGVsZW1lbnRzLCBhbmQgc28gZm9ydGguPC9kaXY+
PGRpdj48YnI+PC9kaXY+PGRpdj4yLiBTZXJpYWxpemUgdGhlIGZpZ3VyZSBpbnRvIGEgZmlsZS1s
aWtlIG9iamVjdCwgdXNlIGFuIGVsZW1lbnQgdHJlZSBpbXBsZW1lbnRhdGlvbidzIGBYTUxJRGAg
dG8gZ2V0IGFuIGVsZW1lbnQgaWQgbWFwIGFuZCBFbGVtZW50IG9iamVjdHM8L2Rpdj48ZGl2Pjxi
cj48L2Rpdj48ZGl2PjMuIEl0ZXJhdGUgb3ZlciBteSBkYXRhIGRpY3Rpb25hcnkgZnJvbSAoMSkg
YW5kIHNldCBrZXlzIGluIHRoZSBtYXBwZWQgRWxlbWVudCdzIGBhdHRyaWJgIGRpY3Rpb25hcnks
IHVzaW5nIHRoZSBpZCBtYXAgZnJvbSAoMik8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PjQuIFVz
ZSB0aGUgZWxlbWVudCB0cmVlIGltcGxlbWVudGF0aW9uJ3MgYHRvc3RyaW5nYCBmdW5jdGlvbiB0
byBzZXJpYWxpemUgdGhlIHVwZGF0ZWQgRWxlbWVudCBvYmplY3RzIGJhY2sgaW50byBhIHN0cmlu
ZyBhbmQgdGhlbiBzZW5kIHRoZSBzdHJpbmcgb3V0IGFzIGEgcmVzcG9uc2UgdG8gYSB3ZWIgcmVx
dWVzdC48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PjUuIEFmdGVyIHJlY2VpdmluZyB0aGUgU1ZH
IHN0cmluZyBmcm9tIHRoZSBzZXJ2ZXIgb24gdGhlIGNsaWVudCwgYWRkIHRoZSBTVkcgdG8gdGhl
IHBhZ2UncyBET00gYW5kIHRoZW4gaGFuZyBldmVudCBoYW5kbGVycyBvbiBpdCAob3IgcHJlLXNw
ZWNpZnkgZGVsZWdhdGVkIGhhbmRsZXJzKSB0aGF0IHVzZSB0aGUgYWRkZWQgYXR0cmlidXRlcyB0
byBjb25maWd1cmUgaW50ZXJhY3RpdmUgYmVoYXZpb3IuPC9kaXY+PGRpdj48ZGl2Pjxicj48L2Rp
dj48ZGl2PkkgbG9va2VkIGF0IHRoZSBgQXJ0aXN0YCB0eXBlIGFuZCBzYXcgbm8gZ29vZCBwbGFj
ZSB0byBzdG9yZSAiYXJiaXRyYXJ5IGRhdGEiLiBCZWZvcmUgSSBzdGFydCB3b3JraW5nIG9uIHRo
aXMgSSB3YW50ZWQgdG8ga25vdyBpZiBhbnlvbmUgZWxzZSBoYWQgYSBiZXR0ZXIgc29sdXRpb24u
IEkgd291bGQgYWxzbyBsaWtlIHRvIGtub3cgaWYgdGhlIGRldnMgd291bGQgYmUgb3Bwb3NlZCB0
byBhIFBSIHRoYXQgYWRkcyBhbiBleHRyYSBkaWN0aW9uYXJ5L2F0dHJpYnV0ZSB0byBldmVyeSBg
QXJ0aXN0YCBpbnN0YW5jZSBjcmVhdGVkLjwvZGl2PjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+
QW5vdGhlciBhbHRlcm5hdGl2ZSBzb2x1dGlvbiB3b3VsZCBiZSB0byBmaW5kIGEgd2F5IHRvIHB1
c2ggbXkgZGljdGlvbmFyeSBtYXBwaW5nIGdpZHMgdG8gZXh0cmEgYXR0cmlidXRlcyBpbnRvIHRo
ZSBgU1ZHUmVuZGVyZXJgIGFuZCBoYXZlIGl0IHBhc3MgdGhlbSBhcyBgKipleHRyYXNgIHRvIGBY
TUxXcml0ZXIuZWxlbWVudGAgd2hlbiBpdCBwcm9jZXNzZXMgaW5kaXZpZHVhbCBhcnRpc3RzLjwv
ZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SGVyZSdzIGEgZ2VuZXJpYyBl
eGFtcGxlIG9mIHdoYXQgSSBkbyBjdXJyZW50bHk6PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5g
YGBweXRob248L2Rpdj48ZGl2PmRlZiBwbG90X3dpdGhfZXh0cmFzX2Zvcl9zdmcoKmRhdGEsICoq
a3dhcmdzKTo8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgIyBEbyB0aGUgcGxvdHRpbmcsIGdlbmVy
YXRpbmcgdGhlIGlkLWxpbmtlZCBkYXRhIGluIGBpZF9tYXBwZXJgPC9kaXY+PGRpdj48ZGl2PiZu
YnNwOyAmbmJzcDsgYXgsIGlkX21hcHBlciA9IHBsb3RfbXlfZGF0YSgqZGF0YSwgKiprd2FyZ3Mp
PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IHhsaW0gPSBheC5nZXRfeGxpbSgpPC9kaXY+PGRpdj4m
bmJzcDsgJm5ic3A7IHlsaW0gPSBheC5nZXRfeWxpbSgpPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRp
dj4mbmJzcDsgJm5ic3A7ICMgY29tcHV0ZSB0aGUgdG90YWwgc3BhY2UgdXNlZCBpbiBib3RoIGRp
bWVuc2lvbnMgd2hlbiBkZWFsaW5nIHdpdGg8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgIyBuZWdh
dGl2ZSBheGlzIGJvdW5kczwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyB4X3NpemUgPSBzdW0obWFw
KGFicywgeGxpbSkpPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IHlfc2l6ZSA9IHN1bShtYXAoYWJz
LCB5bGltKSk8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PiZuYnNwOyAm
bmJzcDsgIyBNYXAgdGhlIHVzZWQgYXhpcyBzcGFjZSB0byB0aGUgZHJhd2FibGUgcmVnaW9uIGRp
bWVuc2lvbnM8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgYXNwZWN0X3JhdGlvID0geF9zaXplIC8g
eV9zaXplPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IGNhbnZhc194ID0gOC48L2Rpdj48ZGl2PiZu
YnNwOyAmbmJzcDsgY2FudmFzX3kgPSBjYW52YXNfeCAvIGFzcGVjdF9yYXRpbzwvZGl2PjxkaXY+
PGJyPjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAjIENvbmZpZ3VyZSB0aGUgYXJ0aXN0IHRvIGRy
YXcgd2l0aGluIHRoZSBuZXcgZHJhd2FibGUgcmVnaW9uIGJvdW5kczwvZGl2PjxkaXY+Jm5ic3A7
ICZuYnNwOyBmaWcgPSBheC5nZXRfZmlndXJlKCk8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgZmln
LnRpZ2h0X2xheW91dChwYWQ9MC4yKTwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyBmaWcucGF0Y2gu
c2V0X3Zpc2libGUoRmFsc2UpPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IGZpZy5zZXRfZmlnd2lk
dGgoY2FudmFzX3gpPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IGZpZy5zZXRfZmlnaGVpZ2h0KGNh
bnZhc195KTwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyBheC5wYXRjaC5z
ZXRfdmlzaWJsZShGYWxzZSk8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsg
IyBQZXJmb3JtIHRoZSBmaXJzdCBzZXJpYWxpemF0aW9uPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7
IGJ1ZmYgPSBTdHJpbmdJTygpPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IGZpZy5zYXZlZmlnKGJ1
ZmYsIGZvcm1hdD0nc3ZnJyk8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsg
IyBQYXJzZSBYTUwgYnVmZmVyIGZyb20gYGJ1ZmZgIGFuZCBjb25maWd1cmUgdGFnIGF0dHJpYnV0
ZXM8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgcm9vdCwgaWRzID0gRVQuWE1MSUQoYnVmZi5nZXR2
YWx1ZSgpKTwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyByb290LmF0dHJpYlsnY2xhc3MnXSA9ICdw
bG90LWNsYXNzLXN2Zyc8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgZm9yIGlkLCBhdHRyaWJ1dGVz
IGluIGlkX21hcHBlci5pdGVtcygpOjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i
c3A7IGVsZW1lbnQgPSBpZHNbaWRdPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz
cDsgZWxlbWVudC5hdHRyaWIudXBkYXRlKHsoImRhdGEtIiArIGspOiBzdHIodik8L2Rpdj48ZGl2
PiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg
Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO2Zv
ciBrLCB2IGluIGF0dHJpYnV0ZXMuaXRlbXMoKX0pPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICZu
YnNwOyAmbmJzcDsgZWxlbWVudC5hdHRyaWJbJ2NsYXNzJ10gPSBpZC5yc3BsaXQoJy0nKVswXTwv
ZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAjIE1vcmUgZHJhd2FibGUgc3Bh
Y2Ugc2hlbmFuaWdhbnM8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgbWluX3gsIG1pbl95LCBtYXhf
eCwgbWF4X3kgPSBtYXAoaW50LCByb290LmF0dHJpYlsidmlld0JveCJdLnNwbGl0KCIgIikpPC9k
aXY+PGRpdj4mbmJzcDsgJm5ic3A7IG1pbl94ICs9IDEwMDwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNw
OyBtYXhfeCArPSAyMDA8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgdmlld19ib3ggPSAnICcuam9p
bihtYXAoc3RyLCAobWluX3gsIG1pbl95LCBtYXhfeCwgbWF4X3kpKSk8L2Rpdj48ZGl2PiZuYnNw
OyAmbmJzcDsgcm9vdC5hdHRyaWJbInZpZXdCb3giXSA9IHZpZXdfYm94PC9kaXY+PGRpdj4mbmJz
cDsgJm5ic3A7IHdpZHRoID0gZmxvYXQocm9vdC5hdHRyaWJbIndpZHRoIl1bOi0yXSkgKiAxLjc1
PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IHJvb3QuYXR0cmliWyJ3aWR0aCJdID0gIjEwMCUiPC9k
aXY+PGRpdj48YnI+PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IGhlaWdodCA9IHdpZHRoIC8gKGFz
cGVjdF9yYXRpbyk8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgcm9vdC5h
dHRyaWJbImhlaWdodCJdID0gIiVkcHQiICUgKGhlaWdodCAqIDEuMik8L2Rpdj48ZGl2PiZuYnNw
OyAmbmJzcDsgcm9vdC5hdHRyaWJbInByZXNlcnZlQXNwZWN0UmF0aW8iXSA9ICJ4TWluWU1pbiBt
ZWV0IjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAjIFNlY29uZCBzZXJp
YWxpemF0aW9uPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IHN2ZyA9IEVULnRvc3RyaW5nKHJvb3Qp
PGJyPjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyBwbHQuY2xvc2UoZmlnKTwvZGl2PjxkaXY+PGJy
PjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyByZXR1cm4gc3ZnPGJyPjwvZGl2PjwvZGl2PjxkaXY+
YGBgPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5UaGFuayB5b3U8L2Rpdj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0" class="m_4789840580364361708gmail_msg">​</div></div></div></div></div>
______________________________<wbr>_________________<br class="m_4789840580364361708gmail_msg">
Matplotlib-users mailing list<br class="m_4789840580364361708gmail_msg">
<a href="mailto:Matplotlib-users@python.org" class="m_4789840580364361708gmail_msg" target="_blank">Matplotlib-users@python.org</a><br class="m_4789840580364361708gmail_msg">
<a href="https://mail.python.org/mailman/listinfo/matplotlib-users" rel="noreferrer" class="m_4789840580364361708gmail_msg" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/matplotlib-<wbr>users</a><br class="m_4789840580364361708gmail_msg">
</blockquote></div>
</blockquote></div><br></div>