8000 Pass figure gid to renderer · matplotlib/matplotlib@2291561 · GitHub
[go: up one dir, main page]

Skip to content

Commit 2291561

Browse files
Pass figure gid to renderer
1 parent 0290a7e commit 2291561

File tree

10 files changed

+89
-12
lines changed

10 files changed

+89
-12
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
The ``gid`` is now correctly passed to svg output
2+
`````````````````````````````````````````````````
3+
4+
Previously, if a figure, axis, legend or some other artists had a custom
5+
``gid`` set (e.g. via ``.set_gid()``), this would not be reflected in
6+
the svg output. Instead a default gid, like ``figure_1`` would be shown.
7+
This is now fixed, such that e.g. ``fig.set_gid("myfigure")`` correctly
8+
shows up as ``<g id="myfigure">`` in the svg file. If you relied on the
9+
gid having the default format, you now need to make sure not to set the
10+
``gid`` parameter of the artists.

lib/matplotlib/axes/_base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2560,7 +2560,7 @@ def draw(self, renderer=None, inframe=False):
25602560
return
25612561
self._unstale_viewLim()
25622562

2563-
renderer.open_group('axes')
2563+
renderer.open_group('axes', gid=self.get_gid())
25642564

25652565
# prevent triggering call backs during the draw process
25662566
self._stale = True

lib/matplotlib/axis.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ def draw(self, renderer):
291291
if not self.get_visible():
292292
self.stale = False
293293
return
294-
renderer.open_group(self.__name__)
294+
renderer.open_group(self.__name__, gid=self.get_gid())
295295
for artist in [self.gridline, self.tick1line, self.tick2line,
296296
self.label1, self.label2]:
297297
artist.draw(renderer)
@@ -1222,7 +1222,7 @@ def draw(self, renderer, *args, **kwargs):
12221222

12231223
if not self.get_visible():
12241224
return
1225-
renderer.open_group(__name__)
1225+
renderer.open_group(__name__, gid=self.get_gid())
12261226

12271227
ticks_to_draw = self._update_ticks()
12281228
ticklabelBoxes, ticklabelBoxes2 = self._get_tick_bboxes(ticks_to_draw,

lib/matplotlib/collections.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1882,7 +1882,7 @@ def convert_mesh_to_paths(tri):
18821882
def draw(self, renderer):
18831883
if not self.get_visible():
18841884
return
1885-
renderer.open_group(self.__class__.__name__)
1885+
renderer.open_group(self.__class__.__name__, gid=self.get_gid())
18861886
transform = self.get_transform()
18871887

18881888
# Get a list of triangles and the color at each vertex.

lib/matplotlib/figure.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1724,7 +1724,7 @@ def draw(self, renderer):
17241724
child.apply_aspect()
17251725

17261726
try:
1727-
renderer.open_group('figure')
1727+
renderer.open_group('figure', gid=self.get_gid())
17281728
if self.get_constrained_layout() and self.axes:
17291729
self.execute_constrained_layout(renderer)
17301730
if self.get_tight_layout() and self.axes:

lib/matplotlib/legend.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ def draw(self, renderer):
633633
if not self.get_visible():
634634
return
635635

636-
renderer.open_group('legend')
636+
renderer.open_group('legend', gid=self.get_gid())
637637

638638
fontsize = renderer.points_to_pixels(self._fontsize)
639639

lib/matplotlib/table.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ def draw(self, renderer):
411411

412412
if not self.get_visible():
413413
return
414-
renderer.open_group('table')
414+
renderer.open_group('table', gid=self.get_gid())
415415
self._update_positions(renderer)
416416

417417
for key in sorted(self._cells):

lib/matplotlib/tests/test_backend_svg.py

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import numpy as np
22
from io import BytesIO
3-
import os
43
import re
54
import tempfile
65
import warnings
@@ -145,3 +144,71 @@ def test_svgnone_with_data_coordinates():
145144
buf = fd.read().decode()
146145

147146
assert expected in buf
147+
148+
149+
def test_gid():
150+
"""Test that object gid appears in output svg."""
151+
from matplotlib.offsetbox import OffsetBox
152+
from matplotlib.axis import Tick
153+
154+
fig = plt.figure()
155+
156+
ax1 = fig.add_subplot(131)
157+
ax1.imshow([[1., 2.], [2., 3.]], aspect="auto")
158+
ax1.scatter([1, 2, 3], [1, 2, 3], label="myscatter")
159+
ax1.plot([2, 3, 1], label="myplot")
160+
ax1.legend()
161+
ax1a = ax1.twinx()
162+
ax1a.bar([1, 2, 3], [1, 2, 3])
163+
164+
ax2 = fig.add_subplot(132, projection="polar")
165+
ax2.plot([0, 1.5, 3], [1, 2, 3])
166+
167+
ax3 = fig.add_subplot(133, projection="3d")
168+
ax3.plot([1, 2], [1, 2], [1, 2])
169+
170+
fig.canvas.draw()
171+
172+
counter = [0]
173+
174+
def assign_gid(obj):
175+
gid = f"test123{obj.__class__.__name__}_{counter[0]}"
176+
obj.set_gid(gid)
177+
counter[0] += 1
178+
return gid
179+
180+
gdic = {assign_gid(obj) : obj for obj in fig.findobj(include_self=True)
181+
if obj.get_visible()}
182+
183+
fd = BytesIO()
184+
fig.savefig(fd, format='svg')
185+
fd.seek(0)
186+
buf = fd.read().decode()
187+
fd.close()
188+
189+
def include(gid, obj):
190+
# we need to exclude certain objects which will not appear in the svg
191+
if isinstance(obj, OffsetBox):
192+
return False
193+
if isinstance(obj, plt.Text):
194+
if obj.get_text() == "":
195+
return False
196+
elif not hasattr(obj, "axes") or obj.axes is None:
197+
return False
198+
if isinstance(obj, plt.Line2D):
199+
if np.array(obj.get_data()).shape == (2, 1):
200+
return False
201+
elif not hasattr(obj, "axes") or obj.axes is None:
202+
return False
203+
if isinstance(obj, Tick):
204+
loc = obj.get_loc()
205+
if loc == 0:
206+
return False
207+
vi = obj.get_view_interval()
208+
if loc < min(vi) or loc > max(vi):
209+
return False
210+
return True
211+
212+
for gid, obj in gdic.items():
213+
if include(gid, obj):
214+
assert gid in buf

lib/mpl_toolkits/axisartist/axis_artist.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ def draw(self, renderer):
127127

128128
if not self._visible:
129129
return
130-
renderer.open_group('line2d')
130+
renderer.open_group('line2d', gid=self F42D .get_gid())
131131

132132
gc = renderer.new_gc()
133133
self._set_gc_clip(gc)
@@ -1230,7 +1230,7 @@ def draw(self, renderer):
12301230
if not self.get_visible():
12311231
return
12321232

1233-
renderer.open_group(__name__)
1233+
renderer.open_group(__name__, gid=self.get_gid())
12341234

12351235
self._axis_artist_helper.update_lim(self.axes)
12361236

lib/mpl_toolkits/mplot3d/axis3d.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ def _get_coord_info(self, renderer):
190190
return mins, maxs, centers, deltas, tc, highs
191191

192192
def draw_pane(self, renderer):
193-
renderer.open_group('pane3d')
193+
renderer.open_group('pane3d', gid=self.get_gid())
194194

195195
mins, maxs, centers, deltas, tc, highs = self._get_coord_info(renderer)
196196

@@ -209,7 +209,7 @@ def draw_pane(self, renderer):
209209
@artist.allow_rasterization
210210
def draw(self, renderer):
211211
self.label._transform = self.axes.transData
212-
renderer.open_group('axis3d')
212+
renderer.open_group('axis3d', gid=self.get_gid())
213213

214214
ticks = self._update_ticks()
215215

0 commit comments

Comments
 (0)
0