Je veux afficher beaucoup de graphiques en utilisant matplotlib, mais par défaut je ne peux obtenir qu'un nombre fini de couleurs. Je voudrais vous présenter un moyen simple de résoudre ce problème. Dans ce cas, je veux souvent afficher beaucoup de légendes, ce qui était difficile avec l'ancien matplotlib, mais maintenant c'est très facile à faire, alors je vais vous montrer comment le faire en bonus.
Pour les deux fonctions y = arctan ((n + 1) x) et y = x ^ n, nous allons introduire un exemple de superposition d'un graphe avec n décalé de 20.
usercmap = plt.get_cmap('jet')
cNorm = colors.Normalize(vmin=0, vmax=num)
scalarMap = cm.ScalarMappable(norm=cNorm, cmap=usercmap)
Sélectionnez maintenant jet avec colormap, déclarez le code couleur avec des données de 0 à num (20) et générez scalarMap avec cm.ScalarMappable. Dans la boucle for Sélectionnez une couleur comme c = scalarMap.to_rgba (i).
python
plt.legend(bbox_to_anchor=(0., 1.01, 1., 0.01), loc='lower left',ncol=10, mode="expand", borderaxespad=0.,fontsize=8)
Spécifiez l'emplacement avec bbox_to_anchor = (coordonnée X, coordonnée Y, taille X, taille Y) et ajustez le nombre de colonnes à plier avec ncol.
python
#!/usr/bin/env python
import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'serif'
import optparse
import matplotlib.pylab as plab
from matplotlib.colors import LogNorm
import matplotlib.colors as colors
### plot 1D plot : shifted
F = plt.figure(figsize=(12,8.))
plt.subplots_adjust(wspace=0.3, hspace=0.6)
ax = plt.subplot(2,1,1)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
plt.figtext(0.02,0.02,"[matplotlib legend test]")
plt.xscale('linear')
plt.yscale('linear')
plt.grid(linestyle='dotted',alpha=0.5)
plt.xlabel(r'x-axis (a.u.)')
plt.ylabel(r'y-axis')
x = np.arange(-1,1,0.1)
num=20
y = []
for j in range(num):
y.append(np.arctan(x*(j+1)))
usercmap = plt.get_cmap('jet')
cNorm = colors.Normalize(vmin=0, vmax=num)
scalarMap = cm.ScalarMappable(norm=cNorm, cmap=usercmap)
for i,oney in enumerate(y):
c = scalarMap.to_rgba(i)
plt.errorbar(x, oney, fmt="o-", color = c, alpha = 0.8, linewidth = 1, label=str(i))
plt.legend(bbox_to_anchor=(0., 1.01, 1., 0.01), loc='lower left',ncol=10, mode="expand", borderaxespad=0.,fontsize=8)
ax = plt.subplot(2,1,2)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
plt.xscale('linear')
plt.yscale('linear')
plt.grid(linestyle='dotted',alpha=0.5)
plt.xlabel(r'x-axis (a.u.)')
plt.ylabel(r'y-axis')
x = np.arange(-1,1,0.1)
num=20
y = []
for j in range(num):
y.append(np.power(x,j+1))
usercmap = plt.get_cmap('jet')
cNorm = colors.Normalize(vmin=0, vmax=num)
scalarMap = cm.ScalarMappable(norm=cNorm, cmap=usercmap)
for i,oney in enumerate(y):
c = scalarMap.to_rgba(i)
plt.errorbar(x, oney, fmt="o-", color = c, alpha = 0.8, linewidth = 1, label=str(i))
plt.legend(bbox_to_anchor=(-0.1, 1.0, 1.2, 0.01), loc='lower left',ncol=10, mode="expand", borderaxespad=0.,fontsize=8)
plt.savefig("qiita_legend_sample.png ")
plt.show()
Cliquez ici pour la figure générée.
Il est désormais plus facile d'agrandir la légende horizontalement et de l'afficher en dehors du graphique, mais l'option Développer ne prend en charge que horizontalement et non verticalement (à partir du 1.8 janvier 2019). Je pense que le temps sera réglé.
Recommended Posts