Skip to content

SVG backend is assigning same id to clipPath elements #4349

Closed

Description

@moble originally reported the following bug in the ipython repository, but it is related to the manipulation of SVGs in matplotlib:

If you create a simple HTML file with a couple of SVG elements:

<svg width="120" height="120"
     viewPort="0 0 120 120" version="1.1"
     xmlns="http://www.w3.org/2000/svg">

    <defs>
        <clipPath id="myClip" >
            <rect x="0" y="0" width="97" height="97" />
        </clipPath>
    </defs>
    <g clip-path="url(#myClip)">
        <rect x="0" y="0" width="100" height="100" fill="blue" />
        <circle cx="97" cy="50" r="5" fill="red"/> 
    </g>
</svg>


<svg width="120" height="120"
     viewPort="0 0 120 120" version="1.1"
     xmlns="http://www.w3.org/2000/svg">

    <defs>
        <clipPath id="myClip" >
            <rect x="0" y="0" width="97" height="97" />
        </clipPath>
    </defs>
    <g clip-path="url(#myClip)">
        <rect x="0" y="0" width="100" height="100" fill="blue" />
        <circle cx="97" cy="50" r="5" fill="red"/> 
    </g>
</svg>

and then using the developer tools in Chrome, you delete one of the images and zoom in (or zoom out), the remaining image has a problem with the clipping paths:

Before deleting image:

alt text

After deleting image and zooming in:

alt text

The reason is that both figures share the same id attribute in their clipPath elements. This is the same issue that @moble found after plotting a couple of matplotlib figures and then removing or hiding one of them. Matplotlib currently assign the same id to their clipPath elements for figures that have the same content in its _make_id method and this causes tricky bugs in the browser.

Essentially, Firefox and Chrome behave differently depending on the complexity of the figure but this can be solved by assigning different ids to the clipPath elements in matplotlib (which is good practice anyway.)

I was suggesting to add a random value before generating ids (but maybe your tests are relying on the current behavior in some way).

Activity

  1. tacaswell commented on Apr 18, 2015

    @tacaswell
    Member

    Why is not re-using clip paths good practice? I would naively have thought that reusing them (which reduces file size) would be good practice. Never mind, I am confused.

  2. added this to the milestone on Apr 18, 2015
  3. WeatherGod commented on Apr 18, 2015

    @WeatherGod
    Member

    Isn't this more like a namespace collision issue? The files by themselves
    are fine, but when both appear in the same document, the ids collide?
    On Apr 18, 2015 1:44 AM, "Thomas A Caswell" [email protected]
    wrote:

    Why is not re-using clip paths good practice? I would naively have thought
    that reusing them (which reduces file size) would be good practice.

    —
    Reply to this email directly or view it on GitHub
    #4349 (comment)
    .

  4. added a commit that references this issue on Apr 28, 2015
    66e9fa2
  5. self-assigned this
    on Apr 28, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions