Skip to content

canvas.draw() does not render tick labels with pdf backend #13513

@baloe

Description

@baloe

Bug report

Bug summary

My issue is closely related to the one here.
I need to access the ticklabels before writing my plot to a file, but when being non interactive there appears to be no way of forcing the generation of ticklabels, or is there? Both fig.canvas.draw() and matplotlib.pyplot.draw() have no effect.

Of course I could generate my own ticklabels, using ax.set_xticklabels(ax.get_xticks()) but I very much like the default formatting of ticks so I would like to rely on matplotlib here.

In the code below method 0 is what I would label the clean solution whereas all other implementations are workarounds, necessary to compensate for the difference of the behaviors of interactive vs non interactive backends. I find the dependence on the interactiveness of the backend problematic. This is because what I often do is to develop a plotting code using an interactive backend and when it's ready I apply it to big data on a HPC were I'm not always provided interactive backends.

Code for reproduction

#!/usr/bin/env python3

import matplotlib
matplotlib.use('pdf')
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np

print('backend:',matplotlib.get_backend())

x = np.linspace(0,3,100)
y = np.sin(x)**2

method = 0
while True:
    fig, ax = plt.subplots()
    ax.plot(x,y)
    if method == 0:
        fig.canvas.draw()
        plt.draw()
    elif method == 1:
        ax.xaxis.set_major_locator(ticker.AutoLocator())
        ax.xaxis.set_major_formatter(ticker.ScalarFormatter())
    elif method == 2:
        ax.set_xticklabels(ax.get_xticks())
    elif method == 3:
        ax.set_xticklabels([ ticker.ScalarFormatter().format_data(tick) for tick in ax.get_xticks() ])
    elif method == 4:
        ax.set_xticklabels([ '{:g}'.format(tick) for tick in ax.get_xticks() ])
    else:
        break
    
    print('method {:d} :'.format(method), end='')
    print([ label.get_text() for label in ax.get_xticklabels() ] )
    method += 1

Actual outcome

backend: pdf
method 0 :['', '', '', '', '', '', '', '', '']
method 1 :['', '', '', '', '', '', '', '', '']
method 2 :['-0.5', '0.0', '0.5', '1.0', '1.5', '2.0', '2.5', '3.0', '3.5']
method 3 :['−5e−1', '0', '5e−1', '1', '1.5', '2', '2.5', '3', '3.5']
method 4 :['-0.5', '0', '0.5', '1', '1.5', '2', '2.5', '3', '3.5']

Expected outcome

backend: pdf
method 0 :['−0.5', '0.0', '0.5', '1.0', '1.5', '2.0', '2.5', '3.0', '3.5']
method 1 :['', '', '', '', '', '', '', '', '']
method 2 :['-0.5', '0.0', '0.5', '1.0', '1.5', '2.0', '2.5', '3.0', '3.5']
method 3 :['−5e−1', '0', '5e−1', '1', '1.5', '2', '2.5', '3', '3.5']
method 4 :['-0.5', '0', '0.5', '1', '1.5', '2', '2.5', '3', '3.5']

Which (apart from the first line of course) is obtained when using an interactive backend.

Matplotlib version

  • Operating system: Ubuntu 16.04.5 LTS 64-bit
  • Matplotlib version: 3.0.2 (conda, build: py36_1002, channel: conda-forge)
  • Matplotlib backend (print(matplotlib.get_backend())): pdf
  • Python version: 3.6.8 (conda, build: h0371630_0)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      pFad - Phonifier reborn

      Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

      Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


      Alternative Proxies:

      Alternative Proxy

      pFad Proxy

      pFad v3 Proxy

      pFad v4 Proxy