Diagtwig de dispersión de matplotlib con diferentes marcadores y colores

Me gustaría hacer una gráfica con diferentes marcadores y diferentes colores de acuerdo con los valores de 2 vectores externos.

Aquí lo que he intentado:

>>> 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 "", line 1, in  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'] >>> 

EDITAR: La solución propuesta funciona en el ejemplo simulado pero no funciona en mi problema real. (No se por que).

Aquí mi código 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)) 

Si sustituyo la parte de la ttwig con la respuesta sugerida, obtengo solo 2 puntos en la ttwig (no sé por qué)

¿Cómo puedo resolver?

Esto funciona:

 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() 

Representación como esta:

Parcela de código anterior

Actualizar

Parece que puede tener una variedad de colores y una sola llamada a la función de dispersión: ejemplo . La función de varios colores se confirma en la API, pero no indica que pueda especificar una iterable para el marcador kwarg. Tu código funciona si eliminas marker=s