[PYTHON] [Matplotlib] Kippen Sie die Achsenbeschriftung nicht

Einführung

Hintergrund

Beispieldaten

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.ticker as ticker

#Beispieldaten
data = pd.DataFrame({'MAU':np.random.randint(5000, 8500,(10,))},
                     index=pd.date_range('2019/12/25', freq='d', periods=10))
MAU
2019-12-25 6831
2019-12-26 6829
2019-12-27 5477
2019-12-28 8204
2019-12-29 8227
2019-12-30 6257
2019-12-31 5828
2020-01-01 5868
2020-01-02 5355
2020-01-03 5548

Grafik wie gewohnt

fig = plt.figure(figsize=(4,3), dpi=144)
ax = fig.add_subplot(111)

ax.bar(data.index, data['MAU'])
ax.set_xticklabels(data.index, rotation=45)

plt.tight_layout()
plt.savefig('test01.svg')
plt.show()
test01.png

Gab es so eine Bequemlichkeit!

#Sieht gut aus mit Locator und Formatierer
fig = plt.figure(figsize=(4,3), dpi=144)
ax = fig.add_subplot(111)

locator = mdates.AutoDateLocator()
formatter = mdates.ConciseDateFormatter(locator)

ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)

ax.bar(data.index, data['MAU'])

plt.savefig('test02.svg')
plt.show()
test02.png
locator = mdates.AutoDateLocator()
formatter = mdates.ConciseDateFormatter(locator)

ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)

Ich möchte es ein bisschen mehr anpassen!

Erstellen Sie Ihre eigene Achsenbeschriftung

fmt = []
yy = ''
for x in data.index:
    years = x.year
    days = x.day
    if yy != x.year:
        fmt.append(str(days)+'\n'+str(years))
    else:
        fmt.append(str(days))
    yy = x.year

fig = plt.figure(figsize=(4,3), dpi=144)
ax = fig.add_subplot(111)

ax.set_xticklabels(fmt)
ax.bar(data.index, data['MAU'])

plt.savefig('test03.png')
plt.show()
test03.png

Versuchen Sie, "FixedFormatter" mit dem Matplotlib-Formatierer zu verwenden.

fig = plt.figure(figsize=(4,3), dpi=144)
ax = fig.add_subplot(111)

# positions = [0,1,2,3,4,5,6,7,8,9]
labels = ['Dec\n2019','26','27','28','29','30','31','Jan\n2020','2','3']
# ax.xaxis.set_major_locator(ticker.FixedLocator(positions))
ax.xaxis.set_major_formatter(ticker.FixedFormatter(labels))

ax.bar(data.index, data['MAU'])

plt.savefig('test04.png')
plt.show()
test04.png

Versuchen Sie, "FuncFormatter" mit dem Matplotlib-Formatierer zu verwenden.

#matplotlib verwendet den Gregorio-Kalender
fig = plt.figure(figsize=(4,3), dpi=144)
ax = fig.add_subplot(111)

YY = ''
@ticker.FuncFormatter
def major_fmt(x, pos):
    global YY
    y = mdates.num2date(int(x)).year
    d = mdates.num2date(int(x)).day
    if YY != y:
        t = '{}\n{}'.format(d, y)
    else:
        t = '{}'.format(d)
    YY = y
    return t

ax.xaxis.set_major_formatter(major_fmt)

ax.bar(data.index, data['MAU'])

plt.savefig('test05.png')
plt.show()
test05.png

Über Locator und Formatter

[Matplotlib] Offizielle Website

Zusammenfassung

Recommended Posts

[Matplotlib] Kippen Sie die Achsenbeschriftung nicht
Wenn sich Achse und Beschriftung in matplotlib überlappen
matplotlib: Ersetzen Sie die Achse selbst durch eine andere.
Übergeben Sie sich in der Klasse nicht an ProcessPoolExecutor
2-Achsen-Plot mit Matplotlib
Was tun, wenn das Bild nicht mit matplotlib usw. im Docker-Container angezeigt wird?
Lassen Sie __init__.py nicht aus
python> link> dir_util.copy_tree ()> update = 1> Kopieren Sie den erworbenen nicht?
Verfahren, die durchgeführt werden müssen, wenn Japanisch nicht in matplotlib angezeigt wird
Der Websocket von toio (nodejs) und python / websocket stellen keine Verbindung her.