2015-05-18 15 views
5

Sto provando a fare un grafico a dispersione con velocità su metri per ogni punto in cui il marker indica diversi tipi, dimensioni indicano pesi diversi e colore indicano quanti anni ha un punto oltre 10 scala dei minuti. Tuttavia, sono stato in grado di tracciare solo le dimensioni finora.Grafico a dispersione con dimensioni, pennarello e colore diversi da pandas dataframe

Qualsiasi aiuto è molto apprezzato.

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 

domanda Aggiornato:

sto cercando di aggiungere barra colorata alla scala colore in base alla vecchia. ha funzionato quando ho tracciato l'intero set di dati, ma non sono riuscito dopo aver tentato di aggiungere un marcatore per ogni sottoinsieme. Qualche idea?

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: È necessario prima set_array per mappabili

risposta

9

scatter può eseguire solo un tipo di marcatore alla volta, quindi è necessario tracciare i diversi tipi separatamente. Fortunatamente panda rende questo facile:

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

.... Dov'è la macchina? Bene, il peso è 0.0 nei dati del test originale, e stiamo usando il peso per la dimensione dell'indicatore, quindi: non posso vederlo.

5

Se si dispone di pochi punti, come in questo caso, è possibile passare un elenco di carri al c argomento:

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

a avere i tuoi punti colorati nell'ordine indicato. In alternativa, per usare una colormap:

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) 

Per modificare le forme marcatore, si sia bisogno di aggiungere i propri Patch ES, o aggiungere un punto alla volta: per esempio

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

(ho scalato il m.weight ad una serie diversa di vedere il quinto punto, che altrimenti avrebbero formato 0.0).

Problemi correlati