49483


matplotlibのpyplotでsavefigをするとき、ｘ軸のラベルの数が多すぎるとラベルが重なってしまい困るので、自動的に目盛りの間隔を調整してくれる方法を探しています。  
グラフの生成サイズを大きくすることも考えましたが、それは他の実現したいこととの都合で不可能でした。

現在、グラフ生成に使っているコード（実際には、labelsとheightはより、要素数が大きくなります）

[code]

    labels = ['2018-10-01','2018-10-02','2018-10-03','2018-10-04','2018- 
    10-05','2018-10-06','2018-10-07','2018-10-08','2018-10-09','2018-10- 
    10','2018-10-11','2018-10-12','2018-10-13','2018-10-14','2018-10- 
    15','2018-10-16','2018-10-17','2018-10-18','2018-10-19','2018-10- 
    20','2018-10-21','2018-10-22','2018-10-23','2018-10-24','2018-10- 
    25','2018-10-26','2018-10-27','2018-10-28','2018-10-29','2018-10- 
    30','2018-10-31']
    height = []
    for i in range(31):
        height.append(i)
    plt.bar(labels, height, align="center")
    plt.xticks(left, labels, rotation='vertical')
    plt.xlabel('Date')
    plt.ylabel('times')
    plt.savefig('plot.png')
    plt.clf()
    
[/code]


CC BY-SA 4.0
2018-10-20T09:02:03.587
49478
2018-10-20T12:43:31.697
2018-10-20T12:43:31.697
15171
30601
question
python matplotlib
matplotlibのpyplotでsavefigをするとき、ｘ軸のラベルの数が多すぎるとラベルが重なってしまう。


`labels`が文字列なので、目盛りの間隔を調整するためには、`xticks`でラベルを表示したい場所の番号とラベルとして表示される文字の両方を指定する必要があるので、次のようなコードになります。

[code]

    import matplotlib.pyplot as plt
    
    labels = ['2018-10-01','2018-10-02','2018-10-03','2018-10-04','2018-10-05',
              '2018-10-06','2018-10-07','2018-10-08','2018-10-09','2018-10-10',
              '2018-10-11','2018-10-12','2018-10-13','2018-10-14','2018-10-15',
              '2018-10-16','2018-10-17','2018-10-18','2018-10-19','2018-10-20',
              '2018-10-21','2018-10-22','2018-10-23','2018-10-24','2018-10-25',
              '2018-10-26','2018-10-27','2018-10-28','2018-10-29','2018-10-30',
              '2018-10-31']
    height = range(31)
    plt.bar(labels, height)
    #間隔の日数を指定
    ticks = 10
    plt.xticks(range(0, len(labels), ticks), labels[::ticks])
    plt.xlabel('Date')
    plt.ylabel('times')
    
    plt.savefig('plot.png')
    plt.clf()
    
[/code]

日付については、文字列ではなくて`datetime`の連番にした方が扱いが楽で、目盛りの間隔も自動的に調整してくれます。

[code]

    import matplotlib.pyplot as plt
    import numpy as np
    
    labels = np.arange('2018-10-01', '2018-11-01', dtype='datetime64[D]')
    height = np.arange(31)
    plt.bar(labels, height)
    plt.xlabel('Date')
    plt.ylabel('times')
    
    plt.savefig('plot.png')
    plt.clf()
    
[/code]

その場合に、目盛りの間隔を自分で設定したい場合は次のようなコードになります。なお、`set_major_formatter`で日付のフォーマットを指定していますが、自分の環境ではそれを指定しないと別のフォーマットになってしまうためです。

[code]

    import matplotlib.pyplot as plt
    import matplotlib.dates as dates
    import numpy as np
    
    labels = np.arange('2018-10-01', '2018-11-01', dtype='datetime64[D]')
    height = np.arange(31)
    plt.bar(labels, height)    
    #間隔の日数を指定 要素数が多くなると np.arange('2018-08', '2018-12', dtype='datetime64[M]') のように月別になるように指定することも可能
    ticks = 10
    plt.xticks(labels[::ticks])
    plt.gca().xaxis.set_major_formatter(dates.DateFormatter('%Y-%m-%d')) 
    plt.xlabel('Date')
    plt.ylabel('times')
    
    plt.savefig('plot.png')
    plt.clf()
    
[/code]


CC BY-SA 4.0
2018-10-20T12:38:59.837
49483
2018-10-20T12:38:59.837
15171
49478
answer