Hinzufügen einer Legende zu einem Radarchart in Python

Ich möchte ein Radarchart mit Legenden für jede Handlung erstellen, die erstellt wird, aber bis jetzt war es unmöglich. Dann können Sie den Code sehen, der verwendet wird, um das Plot zu erstellen (dank einem anderen Benutzer, der es entwickelt hat).

import numpy as np import matplotlib.pyplot as plt import seaborn as sns # improves plot aesthetics import pandas as pd def _invert(x, limits): """inverts a value x on a scale from limits[0] to limits[1]""" return limits[1] - (x - limits[0]) def _scale_data(data, ranges): """scales data[1:] to ranges[0], inverts if the scale is reversed""" for d, (y1, y2) in zip(data[1:], ranges[1:]): assert (y1 <= d <= y2) or (y2 <= d <= y1) x1, x2 = ranges[0] d = data[0] if x1 > x2: d = _invert(d, (x1, x2)) x1, x2 = x2, x1 sdata = [d] for d, (y1, y2) in zip(data[1:], ranges[1:]): if y1 > y2: d = _invert(d, (y1, y2)) y1, y2 = y2, y1 sdata.append((d-y1) / (y2-y1) * (x2 - x1) + x1) return sdata class ComplexRadar(): def __init__(self, fig, variables, ranges, n_ordinate_levels=6): angles = np.arange(0, 360, 360./len(variables)) axes = [fig.add_axes([0.1,0.1,0.9,0.9],polar=True, label = "axes{}".format(i)) for i in range(len(variables))] l, text = axes[0].set_thetagrids(angles, labels=variables) [txt.set_rotation(angle-90) for txt, angle in zip(text, angles)] for ax in axes[1:]: ax.patch.set_visible(False) ax.grid("off") ax.xaxis.set_visible(False) for i, ax in enumerate(axes): grid = np.linspace(*ranges[i], num=n_ordinate_levels) gridlabel = ["{}".format(round(x,2)) for x in grid] if ranges[i][0] > ranges[i][1]: grid = grid[::-1] # hack to invert grid # gridlabels aren't reversed gridlabel[0] = "" # clean up origin ax.set_rgrids(grid, labels=gridlabel, angle=angles[i]) #ax.spines["polar"].set_visible(False) ax.set_ylim(*ranges[i]) # variables for plotting self.angle = np.deg2rad(np.r_[angles, angles[0]]) self.ranges = ranges self.ax = axes[0] def plot(self, data, *args, **kw): sdata = _scale_data(data, self.ranges) self.ax.plot(self.angle, np.r_[sdata, sdata[0]], *args, **kw) def fill(self, data, *args, **kw): sdata = _scale_data(data, self.ranges) self.ax.fill(self.angle, np.r_[sdata, sdata[0]], *args, **kw) 

Jede Handlung steht für verschiedene Personen. Ich möchte eine Legende hinzufügen, die den Namen aller und die Farbe zeigt, die ihn in der Handlung darstellt. Ich habe versucht, Etiketten und dann die Legenden hinzuzufügen, aber es hat nicht funktioniert. Die Handlung ist so etwas wie das:

  • Annotation vieler Punkte mit Text in Mayavi mit mlab
  • Wie kann ich 3D-Histogramme in Python machen?
  • Wie kann ich Daten aus einer Bokeh ColumnDatasource extrahieren?
  • Seaborn Scatter Plot mit fehlenden Punkten in der Figur
  • Treemap Visualisierung in Python
  • Eine gewichtete USA-Karte basierend auf State-Level-Daten erstellen
  •  df = pd.DataFrame({ "Spe": pd.Series([89, 83, 70, 60, 30, 49, 28]), "Str": pd.Series([69, 53, 30, 20, 10, 29, 48]), "Det": pd.Series([82, 44, 79, 39, 20, 10, 85]), "Extr": pd.Series([59, 74, 29, 36, 18, 29, 18]), "Int": pd.Series([63, 11, 20, 36, 97, 58, 91]), "Est": pd.Series([12, 69, 89, 59, 19, 58, 98]), "Ape": pd.Series([29, 13, 94, 30, 20, 10, 67]), "ID": pd.Series(["Carl","Michael","Peter","Louis","Sarah", "Laura","Nicholas"]) }) dfo = df.drop('ID', 1) print(dfo) variables = ("1", "2", "3", "4", "5", "6", "7") ranges = [(1,100),(1,100),(1,100),(1,100),(1,100),(1,100),(1,100)] fig1 = plt.figure(figsize=(8, 8)) radar = ComplexRadar(fig1, variables, ranges) for i in range(len(dfo.index)-1): data=dfo.iloc[i,:] radar.plot(data) radar.fill(data,alpha=0.2) sns.plt.show() 

    Link zu Handlung produziert

    Danke für Ihre Hilfe.

  • Was ist eine effiziente Möglichkeit, Tausende von Datensätzen in eine SQLite-Tabelle mit Django einzufügen?
  • Wie python libs packen Ich benutze, damit ich sie mit meiner app verteilen kann und so wenig Abhängigkeiten wie möglich habe
  • Voreinstellung zu numpy Array
  • Eine einfache Möglichkeit, Django ohne Internetzugang einzusetzen?
  • Kann eine Python-Fabric-Aufgabe andere Aufgaben aufrufen und ihre Hosts-Listen respektieren?
  • Bereitstellung von Python-App auf Mac- und Windows-Benutzer
  • One Solution collect form web for “Hinzufügen einer Legende zu einem Radarchart in Python”

    Falls jemand interessiert ist, kommt der Code des ComplexRadar von hier .
    Die ComplexRadar Klasse nutzt viele Achsen und macht sie alle unsichtbar, also der beste Weg, um hier eine Legende zu kreieren, wäre es, eine neue Achse zu schaffen, um die Legende ComplexRadar . Dazu brauchen wir die Griffe der gezeichneten Linien, also brauchen wir ComplexRadar.plot() die ComplexRadar.plot() Methode zu ändern, um die Zeile zurückzugeben. Wir müssen dann diese Zeilen in einer Liste sammeln (nennen Sie es lax ) und liefern sie der neuen Legende.

    Ich habe einige Änderungen an dem Code vorgenommen, um es in python 2.7 zu arbeiten und es auch für mich selbst verständlicher zu machen. Hier ist was was funktionieren soll

     import numpy as np import matplotlib.pyplot as plt import seaborn as sns import pandas as pd def _scale_data(data, ranges): """scales data[1:] to ranges[0], """ for d, (y1, y2) in zip(data[1:], ranges[1:]): assert (y1 <= d <= y2) or (y2 <= d <= y1) x1, x2 = ranges[0] d = data[0] sdata = [d] for d, (y1, y2) in zip(data[1:], ranges[1:]): sdata.append((d-y1) / (y2-y1) * (x2 - x1) + x1) return sdata class ComplexRadar(): def __init__(self, fig, variables, ranges, n_ordinate_levels=6): angles = np.arange(0, 360, 360./len(variables)) axes = [fig.add_axes([0.1,0.1,0.9,0.9],polar=True, label = "axes{}".format(i)) for i in range(len(variables))] l, text = axes[0].set_thetagrids(angles, labels=variables) [txt.set_rotation(angle-90) for txt, angle in zip(text, angles)] for ax in axes[1:]: ax.patch.set_visible(False) ax.grid("off") ax.xaxis.set_visible(False) for i, ax in enumerate(axes): grid = np.linspace(*ranges[i], num=n_ordinate_levels) gridlabel = ["{}".format(round(x,2)) for x in grid] if ranges[i][0] > ranges[i][1]: grid = grid[::-1] # hack to invert grid # gridlabels aren't reversed gridlabel[0] = "" # clean up origin ax.set_rgrids(grid, labels=gridlabel, angle=angles[i]) #ax.spines["polar"].set_visible(False) ax.set_ylim(*ranges[i]) # variables for plotting self.angle = np.deg2rad(np.r_[angles, angles[0]]) self.ranges = ranges self.ax = axes[0] def plot(self, data, *args, **kw): sdata = _scale_data(data, self.ranges) l = self.ax.plot(self.angle, np.r_[sdata, sdata[0]], *args, **kw) return l def fill(self, data, *args, **kw): sdata = _scale_data(data, self.ranges) self.ax.fill(self.angle, np.r_[sdata, sdata[0]], *args, **kw) index = ["Carl","Michael","Peter","Louis","Sarah", "Laura","Nicholas"] df = pd.DataFrame({ "Spe": pd.Series([89, 83, 70, 60, 30, 49, 28]), "Str": pd.Series([69, 53, 30, 20, 10, 29, 48]), "Det": pd.Series([82, 44, 79, 39, 20, 10, 85]), "Extr": pd.Series([59, 74, 29, 36, 18, 29, 18]), "Int": pd.Series([63, 11, 20, 36, 97, 58, 91]), "Est": pd.Series([12, 69, 89, 59, 19, 58, 98]), "Ape": pd.Series([29, 13, 94, 30, 20, 10, 67]), }) variables = [k[0] for k in df.iteritems()] ranges = [(1.,100.),(1.,100.),(1.,100.),(1.,100.),(1.,100.),(1.,100.),(1.,100.)] fig1 = plt.figure(figsize=(8, 8)) radar = ComplexRadar(fig1, variables, ranges) lax = [] for i, name in enumerate(index): data=df.iloc[i].values l, = radar.plot(data, label=name) lax.append(l) radar.fill(data,alpha=0.2) legendax = fig1.add_axes([0.8,0.8,0.1,.1]) legendax.legend(handles = lax, labels=index, loc=3, bbox_to_anchor=(0,0,1,1), bbox_transform=fig1.transFigure ) legendax.axis('off') sns.plt.show() 

    Die Herstellung der folgenden Handlung Bildbeschreibung hier eingeben

    Python ist die beste Programmiersprache der Welt.