Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matplotlib: -- how to show all digits on ticks? [duplicate]

Possible Duplicate:
How to remove relative shift in matplotlib axis

I'm plotting numbers with five digits (210.10, 210.25, 211.35, etc) against dates and I'd like to have the y-axis ticks show all digits ('214.20' rather than '0.20 + 2.14e2') and have not been able to figure this out. I've attempted to set the ticklabel format to plain, but it appears to have no effect.

plt.ticklabel_format(style='plain', axis='y')

Any hints on the obvious I'm missing?

like image 250
kitsu3 Avatar asked Jan 21 '13 15:01

kitsu3


People also ask

How do I show all tick labels in MatPlotLib?

Use xticks() method to show all the X-coordinates in the plot. Use yticks() method to show all the Y-coordinates in the plot. To display the figure, use show() method.

How do I change the format of a tick in MatPlotLib?

Tick formatters can be set in one of two ways, either by passing a str or function to set_major_formatter or set_minor_formatter , or by creating an instance of one of the various Formatter classes and providing that to set_major_formatter or set_minor_formatter .

How do I change the number of ticks in MatPlotLib?

Method 2: Using locator_param() Locator_params() function that lets us change the tightness and number of ticks in the plots. This is made for customizing the subplots in matplotlib, where we need the ticks packed a little tighter and limited. So, we can use this function to control the number of ticks on the plots.

What does Xticks do in MatPlotLib?

pyplot. xticks. Get or set the current tick locations and labels of the x-axis.


1 Answers

The axis numbers are defined according to a given Formatter. Unfortunately (AFAIK), matplotlib does not expose a way to control the threshold to go from the numbers to a smaller number + offset. A brute force approach would be setting all the xtick strings:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(100, 100.1, 100)
y = np.arange(100)

fig = plt.figure()
plt.plot(x, y)
plt.show()  # original problem

enter image description here

# setting the xticks to have 3 decimal places
xx, locs = plt.xticks()
ll = ['%.3f' % a for a in xx]
plt.xticks(xx, ll)
plt.show()

enter image description here

This is actually the same as setting a FixedFormatter with the strings:

from matplotlib.ticker import FixedFormatter
plt.gca().xaxis.set_major_formatter(FixedFormatter(ll))

However, the problem of this approach is that the labels are fixed. If you want to resize/pan the plot, you have to start over again. A more flexible approach is using the FuncFormatter:

def form3(x, pos):
    """ This function returns a string with 3 decimal places, given the input x"""
    return '%.3f' % x

from matplotlib.ticker import FuncFormatter
formatter = FuncFormatter(form3)
gca().xaxis.set_major_formatter(FuncFormatter(formatter))

And now you can move the plot and still maintain the same precision. But sometimes this is not ideal. One doesn't always want a fixed precision. One would like to preserve the default Formatter behaviour, just increase the threshold to when it starts adding an offset. There is no exposed mechanism for this, so what I end up doing is to change the source code. It's pretty easy, just change one character in one line in ticker.py. If you look at that github version, it's on line 497:

if np.absolute(ave_oom - range_oom) >= 3:  # four sig-figs

I usually change it to:

if np.absolute(ave_oom - range_oom) >= 5:  # four sig-figs

and find that it works fine for my uses. Change that file in your matplotlib installation, and then remember to restart python before it takes effect.

like image 187
tiago Avatar answered Sep 30 '22 12:09

tiago