Search code examples
matplotlibaxis-labels

How do I change the format of the axis label in matplotlib


If I plot a log scale graph, matplotlib gives me the nice looking entries 105, 106, ...

For readability I would however prefer the form 1e5, 1e6, ...

Can I directly set the axis properties to behave that way?

I rather ugly hack would be:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1, 40, 100);
y = np.linspace(1, 5, 100);

# Actually plot the exponential values
plt.plot(x, 10**y)
ax = plt.gca()
ax.set_yscale('log')

# Rewrite the y labels
y_labels = ax.get_yticks()
ax.set_yticklabels(['1e%i' % np.round(np.log(y)/np.log(10)) for y in y_labels])

plt.show()

enter image description here

But surely there must be a better way.


Solution

  • You use ticker.FormatStrFormatter('%0.0e'). This formats each number with the string format %0.0e which represents floats using exponential notation:

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.ticker as ticker
    
    x = np.linspace(1, 40, 100)
    y = np.linspace(1, 5, 100)
    
    # Actually plot the exponential values
    fig, ax = plt.subplots()
    ax.plot(x, 10**y)
    ax.set_yscale('log')
    
    # Rewrite the y labels
    ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%0.0e'))
    
    plt.show()
    

    yields

    enter image description here