Einführung
- In letzter Zeit werden viele Zeitreihendiagramme angezeigt, aber einige Achsenbeschriftungen sind geneigt.
- Vielleicht hattest du keine Zeit, mit dem Look zu spielen? Oder vielleicht konnte ich keine Problemumgehung finden.
- Ich selbst habe die Achsenbeschriftung gekippt oder Kompromisse mit einem horizontalen Diagramm eingegangen.
Hintergrund
- In "Data Visualization Design # 4" habe ich auf Twitter einen Artikel gesehen, der besagt, dass die Achsenbeschriftung nicht gekippt ist.
- In diesem Artikel gab es eine Einführung in die Forschung, dass das Kippen der Achsenbeschriftung die für die Zeichenerkennung erforderliche Zeit verlängert.
- Dann habe ich untersucht, wie verhindert werden kann, dass die Achsenbeschriftung kippt.
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()
- Sicherlich gibt es jemanden, der seinen Kopf gemäß dem geneigten Etikett neigt.
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()
- Wenn das Erscheinungsbild der Achsenbeschriftung im obigen Diagramm in Ordnung ist, fügen Sie die folgenden 4 Zeilen hinzu! Nur das!
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!
- Es reicht aus, dass die Achsenbeschriftung des obigen Diagramms alle Informationen zu Jahr, Monat und Tag enthält. Wenn Sie jedoch das Jahr überqueren möchten, müssen Sie diese in Ihrem Kopf abziehen.
- Zum Beispiel möchte ich Jahresinformationen am Anfang der Achsenbeschriftung! Wie geht's?
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()
- Ich denke, es ist geeignet, wenn es nur wenige einzelne Diagramme oder Achsenbeschriftungen gibt.
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()
- Zur Verwendung erstellen Sie einfach eine Achsenbeschriftung im Listenformat und legen Sie sie im Formatierer fest.
- Wenn Locator eingestellt ist, wird die Achsenbeschriftung nicht angezeigt und daher auskommentiert.
- Dies ist insofern dasselbe, als es unabhängig erstellt wird, aber ich denke, es ist für mehrere Diagramme geeignet.
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()
- Erstellen Sie Achsenbeschriftungen mit benutzerdefinierten Funktionen.
- Die Funktion wird automatisch von @ ticker.FuncFormatter ausgeführt.
- Bis ich diesen Artikel schrieb, wusste matplotlib nicht, dass der Gregorio-Kalender die Norm war. : heat_smile:
- Sie müssen also mit
num2date (int (x))
konvertieren.
Über Locator und Formatter
- Wie Locator Achsenbeschriftungen anordnet
- Welche Art von Anzeigeformat zeigt Formatter Achsenbeschriftungen an?
- Wenn Sie das unten stehende offizielle Handbuch lesen, verbessert sich die ** Achsenbeschriftungsleistung ** auf jede Stufe.
[Matplotlib] Offizielle Website
Zusammenfassung
- ** Passen Sie die nicht gekippte "Achsenbeschriftung" ** mit "Formatierer" von "Matplotlib" an.
-
- Erstellen Sie selbst eine Achsenbeschriftung. 2) Verwenden Sie automatische Einstellungen. 3) Verwenden Sie einen festen Formatierer. 4) Verwenden Sie FuncFormatter.
- Beim Schreiben dieses Artikels hatte ich das Gefühl, dass sich die Designkraft der Datenvisualisierung ein wenig verbessert hat.