2016-03-22 17 views
0

Hier ist ein Skript, das ich in Python leite:benutzerdefinierte Etiketten pyplot matplotlib

import numpy as np 
import matplotlib.pyplot as plt 

t = np.linspace(0, 2*np.pi, 150) 
plt.figure() 
theGrid = np.outer(np.sin(t), np.sin(t)) 
plt.xlim(0, 2*np.pi) #forces an exact fit! 
plt.ylim(0, 2*np.pi) #ditto! 
plt.xticks(np.linspace(0, 2*np.pi, 5)) 
plt.yticks(np.linspace(0, 2*np.pi, 5)) 
plt.pcolormesh(t, t, theGrid) 

Es ist ein schönes Grundstück, und sowohl der x- und y-Etiketten sind eindeutig ein Vielfaches von pi/2. Aber wie würde ich die x- und y-Bezeichnungen lesen, sagen wir, 0, pi/2, pi, 3 * pi/2 bzw. 2 * pi, insbesondere die Einführung von Text? (Das Mapping von sagen, die Zahl np.pi/2 auf den Text "pi/2" sollte nicht schwer sein, aber das Erhalten von Text-Etiketten ist im Grunde, was ich hier bin.)

+0

http://matplotlib.org/examples/ticks_and_spines/spines_demo_bounds.html –

Antwort

2

Eigentlich bist du fast Dort. Der folgende Code basiert auf dieser post. Die erste Eingabe für xticks und yticks ist die Liste der Speicherorte, während die zweite Eingabe die Liste der Etiketten ist, die Zeichenfolgen sein können.

Ich benutzte auch Latex-Notation, um den griechischen Buchstaben für Pi zu erhalten.

import numpy as np 
import matplotlib.pyplot as plt 

t = np.linspace(0, 2*np.pi, 150) 
plt.figure() 
theGrid = np.outer(np.sin(t), np.sin(t)) 
plt.xlim(0, 2*np.pi) #forces an exact fit! 
plt.ylim(0, 2*np.pi) #ditto! 
plt.xticks(np.linspace(0, 2*np.pi, 5),['0','$\pi/2$','$\pi$','$3\pi/2$','$2\pi$']) 
plt.yticks(np.linspace(0, 2*np.pi, 5),['0','$\pi/2$','$\pi$','$3\pi/2$','$2\pi$']) 
plt.pcolormesh(t, t, theGrid) 
0

Um @ leal26 Antwort in etwas flexibler (das heißt für, wenn wir rund um das Grundstück vergrößern/pan wollen) erweitern, können wir das matplotlib.ticker Modul verwenden.

Die Orte der Zecken mit einem ticker.MultipleLocator Verwendung ax.xaxis.set_major_locator (und ax.yaxis.set_major_locator) eingestellt werden, eine base = pi/2 verwenden. Siehe

Wir können dann ein ticker.FuncFormatter verwenden das Format der Strichbeschriftungen zu setzen (diesmal ax.xaxis.set_major_formatter verwenden. Es gibt einige spezielle Fälle, die wir für (zB 1 im Zähler und/oder Nenner, etc.) berücksichtigen müssen. die fracformat Funktion unten.

Beachten Sie auch, dass wir einen rohen string (r Präfix) und Doppel-Klammern für die LaTeX-Formatierung verwenden.

der wirkliche Vorteil hier ist, dass wir einfach die entsprechenden Kontrollstellen ändern können, die Plot Limits, etc., ohne die Tick-Labels jedes Mal manuell neu definieren zu müssen

Schließlich Ich habe auch etwas Skript Verwendung von matplotlib ‚s objektorientierte approact zu machen, so dass wir eine Figure Instanz mit plt.figure, eine Axes Instanz (ax) mit fig.add_subplot und dann alles andere schaffen, nennen wir die relevanten Funktionen von ax.

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.ticker as ticker 
from fractions import Fraction 

t = np.linspace(0, 4*np.pi, 150) 

fig = plt.figure() 
ax = fig.add_subplot(111) 

theGrid = np.outer(np.sin(t), np.sin(t)) 

ax.set_xlim(0, 4*np.pi) #forces an exact fit! 
ax.set_ylim(0, 4*np.pi) #ditto! 

def fracformat(x,pos): 
    frac = Fraction(x/np.pi) 
    if frac.numerator == 0: 
     return 0 
    elif frac.numerator == frac.denominator: 
     return r"$\pi$" 
    elif frac.numerator == 1: 
     return r"$\frac{{ \pi }}{{ {:2d} }}$".format(frac.denominator) 
    elif frac.denominator == 1: 
     return r"${:2d} \pi$".format(frac.numerator) 
    else: 
     return r"$\frac{{ {:2d} \pi }}{{ {:2d} }}$".format(frac.numerator,frac.denominator) 

ax.xaxis.set_major_locator(ticker.MultipleLocator(np.pi/2.)) 
ax.yaxis.set_major_locator(ticker.MultipleLocator(np.pi/2.)) 

ax.xaxis.set_major_formatter(ticker.FuncFormatter(fracformat)) 
ax.yaxis.set_major_formatter(ticker.FuncFormatter(fracformat)) 

ax.pcolormesh(t, t, theGrid) 

plt.show() 

I erhöhte die Handlung Grenzen gesetzt 4*pi zu zeigen, wie einfach es ist, dies zu unterschiedlichen Bereichen, mit minimalem Aufwand zu erweitern ist.

enter image description here

Verwandte Themen