Ich möchte viele Grafiken mit matplotlib anzeigen, aber standardmäßig kann ich nur eine begrenzte Anzahl von Farben erhalten. Ich möchte einen einfachen Weg vorstellen, um dies zu lösen. In diesem Fall möchte ich oft viele Legenden zeigen, was mit der alten Matplotlib schwierig war, aber jetzt ist es sehr einfach, also zeige ich Ihnen als Bonus, wie es geht.
Für die beiden Funktionen y = arctan ((n + 1) x) und y = x ^ n werden wir ein Beispiel für die Überlagerung eines Graphen mit um 20 verschobenem n vorstellen.
usercmap = plt.get_cmap('jet')
cNorm = colors.Normalize(vmin=0, vmax=num)
scalarMap = cm.ScalarMappable(norm=cNorm, cmap=usercmap)
Wählen Sie nun Jet mit Farbkarte aus, deklarieren Sie die Farbcodierung mit 0 bis num (20) Daten und generieren Sie eine skalare Karte mit cm.ScalarMappable. In der for-Schleife Wählen Sie eine Farbe als 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)
Geben Sie die Position mit bbox_to_anchor = (X-Koordinate, Y-Koordinate, X-Größe, Y-Größe) an und passen Sie die Anzahl der Spalten an, die mit ncol gefaltet werden sollen.
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()
Klicken Sie hier für die generierte Abbildung.
Dies erleichtert das horizontale Erweitern der Legende und das Anzeigen außerhalb des Diagramms. Die Option Erweitern unterstützt jedoch nur die horizontale Ausrichtung, nicht die vertikale Ausrichtung (Stand: 1.8. Januar 2019). Ich denke, die Zeit wird geregelt sein.
Recommended Posts