Matplotlib showing x-tick labels overlapping

后端 未结 2 1616
自闭症患者
自闭症患者 2020-12-01 01:44

Have a look at the graph below: \"enter

It\'s a subplot of this larger figure:

相关标签:
2条回答
  • 2020-12-01 02:32

    Ok, finally got it working. The trick was to use plt.setp to manually rotate the tick labels. Using fig.autofmt_xdate() did not work as it does some unexpected things when you have multiple subplots in your figure. Here's the working code with its output:

    for i, d in enumerate([360, 30, 7, 1]):
        ax = axes.flatten()[i]
        earlycut = now - relativedelta(days=d)
        data = df.loc[df.index>=earlycut, :]
        ax.plot(data.index, data['value'])
    
        ax.get_xaxis().set_minor_locator(mpl.ticker.AutoMinorLocator())
        ax.get_yaxis().set_minor_locator(mpl.ticker.AutoMinorLocator())
    
        ax.grid(b=True, which='major', color='w', linewidth=1.5)
        ax.grid(b=True, which='minor', color='w', linewidth=0.75)
    
        plt.setp(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
    
    fig.tight_layout()
    

    enter image description here

    By the way, the comment earlier about some matplotlib things taking forever is very interesting here. I'm using a raspberry pi to act as a weather station at a remote location. It's collecting the data and serving the results via the web. And boy oh boy, it's really wheezing trying to put out these graphics.

    0 讨论(0)
  • 2020-12-01 02:41

    Due to the way text rendering is handled in matplotlib, auto-detecting overlapping text really slows things down. (The space that text takes up can't be accurately calculated until after it's been drawn.) For that reason, matplotlib doesn't try to do this automatically.

    Therefore, it's best to rotate long tick labels. Because dates most commonly have this problem, there's a figure method fig.autofmt_xdate() that will (among other things) rotate the tick labels to make them a bit more readable. (Note: If you're using a pandas plot method, it returns an axes object, so you'll need to use ax.figure.autofmt_xdate().)

    As a quick example:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    time = pd.date_range('01/01/2014', '4/01/2014', freq='H')
    values = np.random.normal(0, 1, time.size).cumsum()
    
    fig, ax = plt.subplots()
    ax.plot_date(time, values, marker='', linestyle='-')
    
    fig.autofmt_xdate()
    plt.show()
    

    If we were to leave fig.autofmt_xdate() out:

    enter image description here

    And if we use fig.autofmt_xdate():

    enter image description here

    0 讨论(0)
提交回复
热议问题