2016-08-13 2 views
0

Ich versuche zu lernen, wie Radar-Diagramme in Matplotlib arbeiten. Ich verwende den Code in this Thread, aber die Handlung, die ich produziere, ist nicht richtig zentriert und es gibt Achse fehlt. Ich habe es mit matplotlib 1.3.1, 1.4.1 und 1.5.1 probiert, falls sich in den letzten Versionen etwas geändert hat.Radar-Diagramm nicht in Matplotlib zentriert

enter image description here

import numpy as np 
import pylab as pl 

class Radar(object): 

    def __init__(self, fig, titles, labels, rect=None): 
     if rect is None: 
      rect = [0.05, 0.05, 0.95, 0.95] 

     self.n = len(titles) 
     self.angles = np.arange(90, 90+360, 360.0/self.n) 
     self.axes = [fig.add_axes(rect, projection="polar", label="axes%d" % i) 
         for i in range(self.n)] 

     self.ax = self.axes[0] 
     self.ax.set_thetagrids(self.angles, labels=titles, fontsize=14) 

     for ax in self.axes[1:]: 
      ax.patch.set_visible(False) 
      ax.grid("off") 
      ax.xaxis.set_visible(False) 

     for ax, angle, label in zip(self.axes, self.angles, labels): 
      ax.set_rgrids(range(1, 6), angle=angle, labels=label) 
      ax.spines["polar"].set_visible(False) 
      ax.set_ylim(0, 5) 

    def plot(self, values, *args, **kw): 
     angle = np.deg2rad(np.r_[self.angles, self.angles[0]]) 
     values = np.r_[values, values[0]] 
     self.ax.plot(angle, values, *args, **kw) 



fig = pl.figure(figsize=(6, 6)) 

titles = list("ABCDE") 

labels = [ 
    list("abcde"), list("12345"), list("uvwxy"), 
    ["one", "two", "three", "four", "five"], 
    list("jklmn") 
] 

radar = Radar(fig, titles, labels) 
radar.plot([1, 3, 2, 5, 4], "-", lw=2, color="b", alpha=0.4, label="first") 
radar.plot([2.3, 2, 3, 3, 2],"-", lw=2, color="r", alpha=0.4, label="second") 
radar.plot([3, 4, 3, 4, 2], "-", lw=2, color="g", alpha=0.4, label="third") 
radar.ax.legend() 

Antwort

4

Ich hatte das gleiche Problem, aber ich fand, dass das Problem der folgende Teil war:

self.angles = np.arange(90, 90+360, 360.0/self.n)

So ist es self.angles = np.arange(0, 360, 360.0/self.n)

zu

ändern

und drehen Sie jede ax mit ax.set_theta_offset(np.deg2rad(90)) stattdessen.

Die modifizierte Klasse sieht wie folgt aus:

# Python 3.4 
# matplotlib 1.5.3 
class Radar(object): 
    def __init__(self, fig, titles, labels, rotation=0, rect=None): 
     if rect is None: 
      rect = [0.05, 0.05, 0.95, 0.95] 

     self.n = len(titles) 
     self.angles = np.arange(0, 360, 360.0/self.n) 
     self.axes = [fig.add_axes(rect, projection="polar", label="axes%d" % i) 
         for i in range(self.n)] 

     self.ax = self.axes[0] 
     self.ax.set_thetagrids(self.angles, labels=titles, fontsize=14) 

     for ax in self.axes[1:]: 
      ax.patch.set_visible(False) 
      ax.grid("off") 
      ax.xaxis.set_visible(False) 

     for ax, angle, label in zip(self.axes, self.angles, labels): 
      ax.set_rgrids(range(1, 6), angle=angle, labels=label) 
      ax.spines["polar"].set_visible(False) 
      ax.set_ylim(0, 6) 
      ax.set_theta_offset(np.deg2rad(rotation)) 

    def plot(self, values, *args, **kw): 
     angle = np.deg2rad(np.r_[self.angles, self.angles[0]]) 
     values = np.r_[values, values[0]] 
     self.ax.plot(angle, values, *args, **kw) 

Hinweis: Ich habe den Parameter rotation=0-__init__ und wenden Sie die Drehung auf alle ax in der letzten Schleife davon hinzugefügt.

Ich weiß, es ist eine Weile her, seit die Frage gestellt wurde, aber ich nehme an, dass jemand anderes darüber stolpern wird.

+1

Sehr gut erklärt Thomas, danke! – chriskvik

+0

Ich freue mich über Ihr Feedback. Ich nahm an, dass, obwohl es eine alte Post war, jemand später mitkommen würde. –

+1

Clean code, hat perfekt funktioniert! –