<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">5 could just be folded into 4 just by writing defs as raw XML. As for validating the extra content XML, it’s possible to validate the markup syntax, but it’s not easy to validate the SVG semantics of the markup. Syntactic validation can be carried out just using the standard library’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">xml.etree.ElementTree.fromstring</code> for detection, wrapped in a try-except to catch the initial error and raise a more informative error.</p>
<div title="MDH:NSBjb3VsZCBqdXN0IGJlIGZvbGRlZCBpbnRvIDQganVzdCBieSB3cml0aW5nIGRlZnMgYXMgcmF3
IFhNTC4gQXMgZm9yIHZhbGlkYXRpbmcgdGhlIGV4dHJhIGNvbnRlbnQgWE1MLCBpdCdzIHBvc3Np
YmxlIHRvIHZhbGlkYXRlIHRoZSBtYXJrdXAgc3ludGF4LCBidXQgaXQncyBub3QgZWFzeSB0byB2
YWxpZGF0ZSB0aGUgU1ZHIHNlbWFudGljcyBvZiB0aGUgbWFya3VwLiBTeW50YWN0aWMgdmFsaWRh
dGlvbiBjYW4gYmUgY2FycmllZCBvdXQganVzdCB1c2luZyB0aGUgc3RhbmRhcmQgbGlicmFyeSdz
IGB4bWwuZXRyZWUuRWxlbWVudFRyZWUuZnJvbXN0cmluZ2AgZm9yIGRldGVjdGlvbiwgd3JhcHBl
ZCBpbiBhIHRyeS1leGNlcHQgdG8gY2F0Y2ggdGhlIGluaXRpYWwgZXJyb3IgYW5kIHJhaXNlIGEg
bW9yZSBpbmZvcm1hdGl2ZSBlcnJvci4=" 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 10:02 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">That seems reasonable (but I don't know the svg backend super well).<div><br></div><div>One concern in the special keys in `svg_attribs`,  would reserving the keys 'defs' and 'extra_content' get in the way of users?  It may be better to do this as 4 parameters. </div><div><br></div><div>For 5 if you are not sure maybe just skip it for now?  </div><div><br></div><div>For 4 is it possible/reasonable to validate the xml before we write it?</div></div><div class="HOEnZb"><div class="h5"><br><div class="gmail_quote"><div dir="ltr">On Sat, Apr 1, 2017 at 8:57 PM Joshua Klein <<a href="mailto:mobiusklein@gmail.com" target="_blank">mobiusklein@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_-8610037770592702771gmail_msg"><div class="m_-8610037770592702771m_7635601684263464460markdown-here-wrapper m_-8610037770592702771gmail_msg"><p style="margin:0px 0px 1.2em!important" class="m_-8610037770592702771gmail_msg">Hello,</p>
<p style="margin:0px 0px 1.2em!important" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg"><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" class="m_-8610037770592702771gmail_msg"><defs></code> sections as described in <a href="http://matplotlib.org/examples/misc/svg_filter_line.html" class="m_-8610037770592702771gmail_msg" target="_blank">svg_filter_line</a>.</p>
<p style="margin:0px 0px 1.2em!important" class="m_-8610037770592702771gmail_msg">Proposed implementation would be:</p>
<ol style="margin:1.2em 0px;padding-left:2em" class="m_-8610037770592702771gmail_msg">
<li style="margin:0.5em 0px" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">Mapping</code>-like objects.</li>
<li style="margin:0.5em 0px" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">RendererSVG.__init__</code> and attributes by the same name.</li>
<li style="margin:0.5em 0px" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg"><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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">"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" class="m_-8610037770592702771gmail_msg">"extra_content"</code> keys.</li>
<li style="margin:0.5em 0px" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg"><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" class="m_-8610037770592702771gmail_msg">"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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">"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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">data-<name></code> attributes for adding semantic data to the graphical elements.</li>
</ol>
<p style="margin:0px 0px 1.2em!important" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">_print_svg</code>.</p>
<p style="margin:0px 0px 1.2em!important" class="m_-8610037770592702771gmail_msg">Thank you,<br class="m_-8610037770592702771gmail_msg">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" class="m_-8610037770592702771gmail_msg">​</div></div></div><div class="gmail_extra m_-8610037770592702771gmail_msg"><br class="m_-8610037770592702771gmail_msg"><div class="gmail_quote m_-8610037770592702771gmail_msg">On Sat, Apr 1, 2017 at 4:30 PM, Thomas Caswell <span dir="ltr" class="m_-8610037770592702771gmail_msg"><<a href="mailto:tcaswell@gmail.com" class="m_-8610037770592702771gmail_msg" target="_blank">tcaswell@gmail.com</a>></span> wrote:<br class="m_-8610037770592702771gmail_msg"><blockquote class="gmail_quote m_-8610037770592702771gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_-8610037770592702771gmail_msg">Joshua,<div class="m_-8610037770592702771gmail_msg"><br class="m_-8610037770592702771gmail_msg"></div><div class="m_-8610037770592702771gmail_msg">That is an interesting use case!</div><div class="m_-8610037770592702771gmail_msg"><br class="m_-8610037770592702771gmail_msg"></div><div class="m_-8610037770592702771gmail_msg">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 class="m_-8610037770592702771gmail_msg"><br class="m_-8610037770592702771gmail_msg"></div><div class="m_-8610037770592702771gmail_msg">Tom</div></div><br class="m_-8610037770592702771gmail_msg"><div class="gmail_quote m_-8610037770592702771gmail_msg"><div class="m_-8610037770592702771gmail_msg"><div class="m_-8610037770592702771m_7635601684263464460h5 m_-8610037770592702771gmail_msg"><div dir="ltr" class="m_-8610037770592702771gmail_msg">On Wed, Mar 22, 2017 at 4:42 PM Joshua Klein <<a href="mailto:mobiusklein@gmail.com" class="m_-8610037770592702771gmail_msg" target="_blank">mobiusklein@gmail.com</a>> wrote:<br class="m_-8610037770592702771gmail_msg"></div></div></div><blockquote class="gmail_quote m_-8610037770592702771gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="m_-8610037770592702771gmail_msg"><div class="m_-8610037770592702771m_7635601684263464460h5 m_-8610037770592702771gmail_msg"><div dir="ltr" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg"><div class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947markdown-here-wrapper m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg"><p style="margin:0px 0px 1.2em!important" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg">Hello,</p>
<p style="margin:0px 0px 1.2em!important" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg">
<li style="margin:0.5em 0px" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg"><p style="margin:0px 0px 1.2em!important;margin:0.5em 0px!important" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg"><p style="margin:0px 0px 1.2em!important;margin:0.5em 0px!important" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg">XMLID</code> to get an element id map and Element objects</p>
</li>
<li style="margin:0.5em 0px" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg"><p style="margin:0px 0px 1.2em!important;margin:0.5em 0px!important" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg">attrib</code> dictionary, using the id map from (2)</p>
</li>
<li style="margin:0.5em 0px" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg"><p style="margin:0px 0px 1.2em!important;margin:0.5em 0px!important" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg"><p style="margin:0px 0px 1.2em!important;margin:0.5em 0px!important" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg">Artist</code> instance created.</p>
<p style="margin:0px 0px 1.2em!important" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg">XMLWriter.element</code> when it processes individual artists.</p>
<p style="margin:0px 0px 1.2em!important" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg"><code class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947language-python m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-function m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(64,126,231)"><span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-keyword m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(102,102,234)">def</span> <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-title m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(118,110,107)">plot_with_extras_for_svg</span><span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-params m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(223,83,32)">(*<wbr>data, **kwargs)</span>:</span>
    <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-comment m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-comment m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(118,110,107)"># compute the total space used in both dimensions when dealing with</span>
    <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-comment m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-comment m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-number m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(223,83,32)">8.</span>
    canvas_y = canvas_x / aspect_ratio

    <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-comment m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-number m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(223,83,32)">0.2</span>)
    fig.patch.set_visible(<span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-keyword m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-keyword m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(102,102,234)">False</span>)

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

    <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-comment m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-string m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(90,183,56)">'class'</span>] = <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-string m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(90,183,56)">'plot-class-svg'</span>
    <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-keyword m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(102,102,234)">for</span> id, attributes <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-keyword m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(102,102,234)">in</span> id_mapper.items():
        element = ids[id]
        element.attrib.update({(<span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-string m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(90,183,56)">"data-<wbr>"</span> + k): str(v)
                               <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-keyword m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(102,102,234)">for</span> k, v <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-keyword m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(102,102,234)">in</span> attributes.items()})
        element.attrib[<span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-string m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(90,183,56)">'class'</span>] = id.rsplit(<span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-string m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(90,183,56)">'-'</span>)[<span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-number m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(223,83,32)">0</span>]

    <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-comment m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-string m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(90,183,56)">"viewBox"</span>].split(<span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-string m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(90,183,56)">" "</span>))
    min_x += <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-number m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(223,83,32)">100</span>
    max_x += <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-number m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(223,83,32)">200</span>
    view_box = <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-string m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(90,183,56)">' '</span>.join(map(str, (min_x, min_y, max_x, max_y)))
    root.attrib[<span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-string m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(90,183,56)">"viewBox"</span>] = view_box
    width = float(root.attrib[<span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-string m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(90,183,56)">"width"</span>][:-<span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-number m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(223,83,32)">2</span><wbr>]) * <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-number m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(223,83,32)">1.75</span>
    root.attrib[<span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-string m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(90,183,56)">"width"</span>] = <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-string m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(90,183,56)">"100%"</span>

    height = width / (aspect_ratio)

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

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

    <span class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708m_67930946521814947hljs-keyword m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" style="color:rgb(102,102,234)">return</span> svg
</code></pre>
<p style="margin:0px 0px 1.2em!important" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_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_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg">​</div></div></div></div></div>
______________________________<wbr>_________________<br class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg">
Matplotlib-users mailing list<br class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg">
<a href="mailto:Matplotlib-users@python.org" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" target="_blank">Matplotlib-users@python.org</a><br class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg">
<a href="https://mail.python.org/mailman/listinfo/matplotlib-users" rel="noreferrer" class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/matplotlib-<wbr>users</a><br class="m_-8610037770592702771m_7635601684263464460m_4789840580364361708gmail_msg m_-8610037770592702771gmail_msg">
</blockquote></div>
</blockquote></div><br class="m_-8610037770592702771gmail_msg"></div>
</blockquote></div>
</div></div></blockquote></div><br></div>