2015-05-18 25 views
5

Ich versuche ein Streudiagramm mit Geschwindigkeit über Meter für jeden Punkt zu machen, wo Marker unterschiedliche Typen anzeigen, Größe unterschiedliche Gewichte und Farbe anzeigen wie alt ein Punkt über 10 ist Minutenskala. Bisher konnte ich jedoch nur nach Größe plotten.Scatterplot mit unterschiedlicher Größe, Markierung und Farbe aus Pandas Datenrahmen

Jede Hilfe wird sehr geschätzt.

x = {'speed': [10, 15, 20, 18, 19], 'meters' : [122, 150, 190, 230, 300], 'type': ['phone', 'phone', 'gps', 'gps', 'car'], 'weight': [0.2, 0.3, 0.1, 0.85, 0.0], 'old': [1, 2, 4, 5, 8]} 

m = pd.DataFrame(x) 

plt.scatter(m.meters, m.speed, s = 30* m.weight) 

mkr_dict = {'gps': 'x', 'phone': '+', 'car': 'o'} 

    meters speed type weight old 
0  122  10 phone 0.20 1 
1  150  15 phone 0.30 2 
2  190  20 gps 0.10 4 
3  230  18 gps 0.85 5 
4  300  19 car 0.00 8 

Aktualisiert Frage:

Ich versuche colorbar auf der Farbskala auf alten Basis hinzuzufügen. Es funktionierte, wenn ich gegen das gesamte Dataset zeichnete, aber nachdem ich versucht hatte, Marker für jede Teilmenge hinzuzufügen. Irgendeine Idee?

plt.scatter(m.meters, m.speed, s = 30* m.weight, c=m.old) 
cbar = plt.colorbar(ticks = [0, 5, 10]) 
cbar.ax.set_yticklabels(['New','5mins', '10mins']) 

Typeerror: Sie müssen sich zunächst für mappable

Antwort

9

scatter kann immer nur eine Art von Marker zu einer Zeit, so müssen Sie die verschiedenen Arten getrennt plotten. Zum Glück Pandas macht dies einfach:

import matplotlib.pyplot as plt 
import pandas as pd 
x = {'speed': [10, 15, 20, 18, 19], 
    'meters' : [122, 150, 190, 230, 300], 
    'type': ['phone', 'phone', 'gps', 'gps', 'car'], 
    'weight': [0.2, 0.3, 0.1, 0.85, 0.0], 
    'old': [1, 2, 4, 5, 8]} 

m = pd.DataFrame(x) 
mkr_dict = {'gps': 'x', 'phone': '+', 'car': 'o'} 
for kind in mkr_dict: 
    d = m[m.type==kind] 
    plt.scatter(d.meters, d.speed, 
       s = 100* d.weight, 
       c = d.old, 
       marker = mkr_dict[kind]) 
plt.show() 

enter image description here

.... Wo ist das Auto? Nun, das Gewicht ist 0.0 in den ursprünglichen Testdaten und wir verwenden Gewicht für Markergröße, also: kann es nicht sehen.

5

set_array Wenn Sie nur ein paar Punkte haben, wie hier, können Sie eine Liste von Schwimmern zum c Argument übergeben:

colors = ['r', 'b', 'k', 'g', 'm'] 
plt.scatter(m.meters, m.speed, s=30*m.weight, vmin=0, vmax=10, cmap=cm) 

zu Lassen Sie Ihre Punkte in der angegebenen Reihenfolge einfärben. Alternativ können Sie eine colormap verwenden:

cm = plt.cm.get_cmap('hot') # or your colormap of choice 
plt.scatter(m.meters, m.speed, s=30*m.weight, c=m.old, cmap=cm) 

Um die Marker Formen zu ändern, benötigen Sie entweder Ihre eigenen Patch es hinzuzufügen, oder zu einem Zeitpunkt einen Punkt hinzu: z

markers = ['^', 'o', 'v', 's', 'd'] 
for px, py, c, s, t in zip(m.meters, m.speed, m.old, m.weight, markers): 
    plt.scatter(px, py, marker=t, c=cm(c/10.), vmin=0, vmax=10, s=400*s+100) 
plt.show() 

enter image description here

(Ich habe die m.weight auf einen anderen Bereich skaliert, um den fünften Punkt, um zu sehen, die sonst Größe 0.0 haben würden).

Verwandte Themen