Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting empty tick labels before showing a plot in Matplotlib

I'm experiencing a similar issue to the one reported here. I don't understand why the tick label text is an empty string:

import numpy as np import matplotlib.pyplot as plt  x = np.linspace(0,2*np.pi,100) y = np.sin(x)**2  fig, ax = plt.subplots() ax.plot(x,y)  labels = ax.get_xticklabels() for label in labels:     print(label)  plt.show() 

Output:

Text(0,0,'') Text(0,0,'') Text(0,0,'') Text(0,0,'') Text(0,0,'') Text(0,0,'') Text(0,0,'') Text(0,0,'') 

I get the same result with ax.xaxis.get_ticklabels() but the plotted graph shows eight labelled ticks on the x-axis when saved or shown. However, if I ask for the labels after I show the plot, then the labels list is properly populated. Of course, it's a bit late to do anything about changing them then.

fig, ax = plt.subplots() ax.plot(x,y) plt.show()  labels = ax.get_xticklabels() for label in labels:     print(label) 

Output:

Text(0,0,'0') Text(1,0,'1') Text(2,0,'2') Text(3,0,'3') Text(4,0,'4') Text(5,0,'5') Text(6,0,'6') Text(7,0,'7') 

Why does this happen (Mac OS X Yosemite, Matplotlib 1.5.1) and how can I get my labels before I show or save my plot?

like image 606
xnx Avatar asked Dec 13 '16 13:12

xnx


People also ask

How do I get rid of tick marks in matplotlib?

Matplotlib removes both labels and ticks by using xticks([]) and yticks([]) By using the method xticks() and yticks() you can disable the ticks and tick labels from both the x-axis and y-axis.

How do I show all tick labels in matplotlib?

MatPlotLib with Python To display all label values, we can use set_xticklabels() and set_yticklabels() methods.

Why is matplotlib not showing plot?

The issue actually stems from the matplotlib backend not being properly set, or from a missing dependency when compiling and installing matplotlib.

How do I get rid of Xtick?

Use clean, fine-tipped tweezers to grasp the tick as close to the skin's surface as possible. Pull upward with steady, even pressure. Don't twist or jerk the tick; this can cause the mouth-parts to break off and remain in the skin. If this happens, remove the mouth-parts with tweezers.


1 Answers

You've correctly identified the problem: before you call plt.show() nothing is explicitly set. This is because matplotlib avoids static positioning of the ticks unless it has to, because you're likely to want to interact with it: if you can ax.set_xlim() for example.

In your case, you can draw the figure canvas with fig.canvas.draw() to trigger tick positioning, so you can retrieve their value.

Alternatively, you can explicity set the xticks that will in turn set the the axis to FixedFormatter and FixedLocator and achieve the same result.

import numpy as np import matplotlib.pyplot as plt  x = np.linspace(0,2*np.pi,100) y = np.sin(x)**2  fig, ax = plt.subplots()  ax.plot(x,y) ax.set_xlim(0,6)  # Must draw the canvas to position the ticks fig.canvas.draw() # Or Alternatively #ax.set_xticklabels(ax.get_xticks())  labels = ax.get_xticklabels() for label in labels:     print(label.get_text())  plt.show()  Out: 0 1 2 3 4 5 6 
like image 67
Julien Marrec Avatar answered Sep 22 '22 05:09

Julien Marrec