2012-05-24 18 views
8

Ich möchte die Radiant Einheiten der Achsen als proportional zu \pi schreiben: so etwas wieWie kann ich die y-Achse in Bogenmaß in einem Python-Diagramm festlegen?

$\frac{\pi}{4}$, $\frac{\pi}{2}$, ... 

anstelle von

0.785, 1.5707 ... 

Gibt es eine Standardmethode? Als Beispiel, was soll ich dem folgenden Code hinzufügen?

from pylab import * 

x=arange(-10.0,10.0,0.1) 
y= arctan(x) 

plot(x,y,'b.') 
show() 

fand ich dieses Beispiel http://matplotlib.sourceforge.net/examples/units/radian_demo.html aber es funktioniert nicht, weil ich nicht basic_units Modul.

Vielen Dank!

+1

"Ich habe dieses Beispiel http://matplotlib.sourceforge.net/examples/units/radian_demo.html gefunden, aber es funktioniert nicht, da ich das Modul basic_units nicht habe." Ja, das tust du. Es ist im Ordner Beispiele von Matplotlib. – endolith

Antwort

11

harten Code sie in Fraktionen oder akzeptieren Gleitkommazahlen

import matplotlib.pyplot as plt 
import numpy as np 

x=np.arange(-10.0,10.0,0.1) 
y=np.arctan(x) 

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

ax.plot(x,y,'b.') 

y_pi = y/np.pi 
unit = 0.25 
y_tick = np.arange(-0.5, 0.5+unit, unit) 

y_label = [r"$-\frac{\pi}{2}$", r"$-\frac{\pi}{4}$", r"$0$", r"$+\frac{\pi}{4}$", r"$+\frac{\pi}{2}$"] 
ax.set_yticks(y_tick*np.pi) 
ax.set_yticklabels(y_label, fontsize=20) 

y_label2 = [r"$" + format(r, ".2g")+ r"\pi$" for r in y_tick] 
ax2 = ax.twinx() 
ax2.set_yticks(y_tick*np.pi) 
ax2.set_yticklabels(y_label2, fontsize=20) 

plt.show() 

das Ergebnis ist

enter image description here

+0

Vielen Dank! – DdD

1

Ich schrieb eine kleine Funktion, die Sie zurück eine Liste von Etiketten gibt:

import numpy as np 
from fractions import Fraction 

def create_pi_labels(a, b, step): 

    max_denominator = int(1/step) 
    # i added this line and the .limit_denominator to solve an 
    # issue with floating point precision 
    # because of floataing point precision Fraction(1/3) would be 
    # Fraction(6004799503160661, 18014398509481984) 

    values = np.arange(a, b+step/10, step) 
    fracs = [Fraction(x).limit_denominator(max_denominator) for x in values] 
    ticks = values*np.pi 

    labels = [] 

    for frac in fracs: 
     if frac.numerator==0: 
      labels.append(r"$0$") 
     elif frac.numerator<0: 
      if frac.denominator==1 and abs(frac.numerator)==1: 
       labels.append(r"$-\pi$") 
      elif frac.denominator==1: 
       labels.append(r"$-{}\pi$".format(abs(frac.numerator))) 
      else: 
       labels.append(r"$-\frac{{{}}}{{{}}} \pi$".format(abs(frac.numerator), frac.denominator)) 
     else: 
      if frac.denominator==1 and frac.numerator==1: 
       labels.append(r"$\pi$") 
      elif frac.denominator==1: 
       labels.append(r"${}\pi$".format(frac.numerator)) 
      else: 
       labels.append(r"$\frac{{{}}}{{{}}} \pi$".format(frac.numerator, frac.denominator)) 

    return ticks, labels 

https://github.com/MaxNoe/python-plotting/blob/master/source/create_pi_labels.py

1

Sie können die Datei basic_units.py here:

Nachdem es sollte wie folgt funktionieren:

from pylab import * 
from basic_units import radians 

x = arange(-10.0,10.0,0.1) 
y = map(lambda y: y*radians,arctan(x)) 
x = map(lambda x: x*radians,x) 

plot(x,y,'b.',xunits=radians,yunits=radians) 
show() 

Alternativ könnten Sie die arctan-Funktion die Art und Weise implementieren sie die cos in basic_units.py umgesetzt funktionieren