introduction
- Récemment, je vois de nombreux graphiques de séries chronologiques, mais certaines étiquettes d'axe sont inclinées.
- Peut-être que vous n'avez pas eu le temps de jouer avec le look? Ou peut-être que je n'ai pas trouvé de solution.
- J'avais moi-même l'habitude d'incliner l'étiquette de l'axe ou de faire un compromis avec un graphique horizontal.
Contexte
- Dans "Data Visualization Design # 4", j'ai vu un article sur Twitter disant que ** l'étiquette de l'axe n'est pas inclinée **.
- Dans cet article, il y avait une introduction de la recherche que l'inclinaison de l'étiquette de l'axe augmente le temps requis pour la reconnaissance des caractères.
- Ensuite, j'ai étudié comment empêcher l'étiquette d'axe de s'incliner.
Exemple de données
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.ticker as ticker
#Exemple de données
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 |
Graphique comme d'habitude
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()
- Certes, j'incline la tête selon l'étiquette inclinée.
Y avait-il une telle commodité!
#A l'air bien avec le localisateur et le formateur
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()
- Si l'apparence de l'étiquette d'axe dans le graphique ci-dessus est correcte, ajoutez les 4 lignes suivantes! Seulement ça!
locator = mdates.AutoDateLocator()
formatter = mdates.ConciseDateFormatter(locator)
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)
Je veux le personnaliser un peu plus!
- Il suffit que l'étiquette d'axe du graphique ci-dessus contienne toutes les informations sur l'année, le mois et le jour, mais si vous voulez traverser l'année, vous devez la soustraire dans votre tête.
- Par exemple, je veux des informations sur l'année au début de l'étiquette de l'axe! Que faire?
Créez votre propre étiquette d'axe
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()
- Je pense que cela convient lorsqu'il y a peu de graphiques uniques ou d'étiquettes d'axe.
Essayez d'utiliser FixedFormatter avec le formateur matplotlib.
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()
- Pour l'utiliser, créez simplement une étiquette d'axe au format liste et définissez-la dans le formateur.
- Lorsque Locator est défini, l'étiquette de l'axe n'est pas affichée, donc elle est commentée.
- C'est la même chose en ce sens qu'il est créé indépendamment, mais je pense qu'il convient à plusieurs graphiques.
Essayez d'utiliser FuncFormatter avec le formateur matplotlib.
#matplotlib utilise le calendrier Gregorio
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()
- Créez des étiquettes d'axe en utilisant des fonctions définies par l'utilisateur.
- La fonction est automatiquement exécutée à partir de @ ticker.FuncFormatter.
- Jusqu'à ce que j'écrive cet article, matplotlib ne savait pas que le calendrier Gregorio était la norme. : sweat_smile:
- Donc, vous devez convertir avec
num2date (int (x)).
À propos du localisateur et du formateur
- Comment Locator organise les étiquettes des axes
- Quel type de format d'affichage le formateur affiche-t-il les étiquettes des axes?
- Si vous lisez le manuel officiel ci-dessous, ** Axis Labeling Power ** s'améliorera à chaque niveau.
[Matplotlib] Site Web officiel
Résumé
- ** Personnalisez le "libellé de l'axe" non incliné ** en utilisant "Formatter" de "Matplotlib".
-
- Créez vous-même une étiquette d'axe. 2) Utilisez les paramètres automatiques. 3) Utilisez Fixed Formatter. 4) Utilisez FuncFormatter.
- La rédaction de cet article m'a fait sentir que ** la puissance de conception de la visualisation de données ** s'est un peu améliorée.