2014-10-21 23 views
5

Vorrei creare una trama con diversi marcatori e colori diversi in base ai valori di 2 vettori esterni.diagramma a dispersione matplotlib con diversi marcatori e colori

Ecco che cosa ho provato:

>>> s = [u'+', u'+', u'o'] 
>>> col = ['r','r','g'] 
>>> x = np.array([1,2,3]) 
>>> y = np.array([4,5,6]) 
>>> pl.scatter(x,y,marker=s,c=col) 
Traceback (most recent call last): 
    File "/usr/lib/python3/dist-packages/matplotlib/markers.py", line 233, in set_marker 
    Path(marker) 
    File "/usr/lib/python3/dist-packages/matplotlib/path.py", line 133, in __init__ 
    vertices = np.asarray(vertices, np.float_) 
    File "/usr/lib/python3/dist-packages/numpy/core/numeric.py", line 460, in asarray 
    return array(a, dtype, copy=False, order=order) 
ValueError: could not convert string to float: '+' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 3087, in scatter 
    linewidths=linewidths, verts=verts, **kwargs) 
    File "/usr/lib/python3/dist-packages/matplotlib/axes.py", line 6298, in scatter 
    marker_obj = mmarkers.MarkerStyle(marker) 
    File "/usr/lib/python3/dist-packages/matplotlib/markers.py", line 162, in __init__ 
    self.set_marker(marker) 
    File "/usr/lib/python3/dist-packages/matplotlib/markers.py", line 236, in set_marker 
    raise ValueError('Unrecognized marker style {}'.format(marker)) 
ValueError: Unrecognized marker style ['+', '+', 'o'] 
>>> 

EDIT: La proposta di lavoro soluzione sul esempio simulato ma non funziona sul mio vero problema. (Non so perché).

Ecco il mio codice completo:

import matplotlib.pyplot as pl 
import numpy as np 
locY = np.linspace(0, 1, 50) #in the real data locX and locY are coordinate of the points 
locX = np.linspace(0,1,50) 
p = 50 

C = {0: [0, 13, 14, 19, 22, 30], 16: [1, 16, 17], 20: [15, 18, 20, 24], 37: [4, 8, 9, 33, 37, 40, 47], 41: [5, 7, 28, 32, 34, 36, 39, 41, 42, 44, 46], 26: [6, 26, 27, 29, 31, 35], 45: [10, 11, 12, 38, 43, 45, 48, 49], 21: [2, 3, 21, 23, 25]} 
     index = C.keys() 

     def plot_cluster(C, index): 
      color_map = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'] 
      colors = [] 
      m_type = [] 


      for i in range(p): 
       for pos, k in enumerate(index): 
        if i in C[k]: 
         #colors.append(pos) 
         colors.append(color_map[pos]) 
         if i == k: 
          m_type.append(u'+') 
         else: 
          m_type.append(u'o') 


      fig = pl.scatter(locX, locY, c=colors, s=30, cmap='spectral') 
      fig = pl.locator_params(nbins=3) 
      fig = pl.xlim(-0.2, 1.2) 
      fig = pl.ylim(-0.2, 1.2) 
      fig = pl.locator_params(nbins=5, axis='y') 

      return fig 

    pl.show(plot_cluster(C, index)) 

Se io sostituire la parte tracciando con la risposta suggerita ottengo solo 2 punti nella trama (non so perché)

Come posso risolvere?

risposta

9

Questo funziona:

s = [u'+', u'+', u'o'] 
col = ['r','r','g'] 
x = np.array([1,2,3]) 
y = np.array([4,5,6]) 

for _s, c, _x, _y in zip(s, col, x, y): 
    plt.scatter(_x, _y, marker=_s, c=c) 

plt.xlim(0, 4) 
plt.ylim(0, 8) 

plt.show() 

rendering in questo modo:

Plot of above code

Aggiornamento

Sembra si può avere una varietà di colori e hanno una sola chiamata al funzione scatter: . La funzionalità a più colori è confermata su API ma non viene letto che è possibile specificare un iterabile per il marcatore kwarg. Il tuo codice funziona se rimuovi marker=s

+0

Questo lavoro sull'esempio simulato ma non nel codice reale. Ho aggiornato la domanda – Donbeo

+0

Se provo a eseguire quel codice, ottengo il messaggio "AttributeError: 'module' l'oggetto non ha attributo 'show'", cioè un problema con l'ultima riga. Puoi controllare di nuovo –

+0

funziona per me. Prestare attenzione al rientro e utilizzare import matplotlib.pyplot come pl e importare numpy come np all'inizio – Donbeo

Problemi correlati