Plotten eines Wörterbuchs mit mehreren Werten pro Schlüssel

Ich habe ein Wörterbuch, das so aussieht:

1: ['4026', '4024', '1940', '2912', '2916], 2: ['3139', '2464'], 3:['212']... 

Für ein paar hundert Tasten möchte ich sie mit dem Schlüssel als y für seine Menge von x-Werten plotten, ich habe versucht, dieses Bit von Code, die den Fehler darunter gibt:

 for rank, structs in b.iteritems(): y = b.keys() x = b.values() ax.plot(x, y, 'ro') plt.show() ValueError: setting an array element with a sequence 

Ich bin ein bisschen wie ein Verlust auf, wie es weiter geht, so dass jede Hilfe sehr geschätzt werden würde!

  • Matplotlib: Füge twin y Achse hinzu, ohne seine Werte in den Plots zu verwenden
  • Matplotlib benutzerdefinierte Marker / Symbol
  • Plot Histogramm mit Farben aus Farbkarte
  • Wie man eine 4d Handlung mit matplotlib mit beliebigen Daten zu machen
  • Pandas: Bar-Plot mit zwei Stäben und zwei y-Achse
  • Matplotlib generierte PDF kann nicht im Acrobat Reader eingesehen werden
  • 3 Solutions collect form web for “Plotten eines Wörterbuchs mit mehreren Werten pro Schlüssel”

    Sie müssen Ihre Liste von Xs und Ys manuell konstruieren:

     In [258]: b={1: ['4026', '4024', '1940', '2912', '2916'], 2: ['3139', '2464'], 3:['212']} In [259]: xs, ys=zip(*((int(x), k) for k in b for x in b[k])) In [260]: xs, ys Out[260]: ((4026, 4024, 1940, 2912, 2916, 3139, 2464, 212), (1, 1, 1, 1, 1, 2, 2, 3)) In [261]: plt.plot(xs, ys, 'ro') ...: plt.show() 

    Resultierend: Bildbeschreibung hier eingeben

    1) Wiederholen Sie Ihre x-Werte

    plot erwartet eine Liste von x-Werten und eine Liste von y-Werten, die die gleiche Länge haben müssen. Deshalb musst du den rank mehrmals wiederholen. itertools.repeat() kann das für dich tun.

    2) ändere deinen Iterator

    iteritems() bereits ein Tupel (key,value) . Sie müssen keine keys() und items() .

    Hier ist der Code:

     import itertools for rank, structs in b.iteritems(): x = list(itertools.repeat(rank, len(structs))) plt.plot(x,structs,'ro') 

    3) die plots kombinieren

    Mit Ihrem Code, würden Sie eine Handlung pro Element im Wörterbuch zu produzieren. Ich denke, du willst sie lieber in einem einzigen Graphen plotten. Wenn ja, ändern Sie Ihren Code accrodingly:

     import itertools x = [] y = [] for rank, structs in b.iteritems(): x.extend(list(itertools.repeat(rank, len(structs)))) y.extend(structs) plt.plot(x,y,'ro') 

    4) Beispiel

    Hier ist ein Beispiel mit Ihren Daten:

     import itertools import matplotlib.pyplot as plt d = {1: ['4026', '4024', '1940', '2912', '2916'], 2: ['3139', '2464'], 3:['212']} x= [] y= [] for k, v in d.iteritems(): x.extend(list(itertools.repeat(k, len(v)))) y.extend(v) plt.xlim(0,5) plt.plot(x,y,'ro') 

    Bildbeschreibung hier eingeben

    Dies liegt daran, dass Sie Ihre Dateneinträge nicht übereinstimmen.

    Derzeit haben Sie

     1: ['4026', '4024', '1940', '2912', '2916'] 2: ['3139', '2464'], ... 

    daher

     x = [1,2,...] y = [['4026', '4024', '1940', '2912', '2916'],['3139', '2464'],... 

    Wenn du wirklich brauchst

     x = [1, 1, 1, 1, 1, 2, 2, ...] y = ['4026', '4024', '1940', '2912', '2916', '3139', '2464',...] 

    Versuchen

     for rank, structs in b.iteritems(): # This matches each value for a given key with the appropriate # of copies of the # value and flattens the list # Produces x = [1, 1, 1, 1, 1, 2, 2, ...] x = [key for (key,values) in b.items() for _ in xrange(len(values))] # Flatten keys list # Produces y = ['4026', '4024', '1940', '2912', '2916, '3139', '2464',...] y = [val for subl in b.values() for val in subl] ax.plot(x, y, 'ro') plt.show() 
    Python ist die beste Programmiersprache der Welt.