Diagtwig de dispersión con diferente tamaño, marcador y color a partir del dataframe de pandas

Estoy tratando de hacer un diagtwig de dispersión con velocidad sobre metros para cada punto donde el marcador indica diferentes tipos, el tamaño indica diferentes pesos y el color indica la antigüedad de un punto en una escala de más de 10 minutos. Sin embargo, solo pude trazar por tamaño hasta ahora.

Cualquier ayuda es muy apreciada.

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 

Pregunta actualizada:

Estoy tratando de agregar barra de colores a la escala de colores basada en antiguo. funcionó cuando graficaba contra todo el conjunto de datos, pero falló al intentar agregar un marcador para cada subconjunto. ¿Alguna 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: primero debe set_array para mappable

scatter solo puede hacer un tipo de marcador a la vez, por lo que debe trazar los diferentes tipos por separado. Afortunadamente los pandas hacen esto fácil:

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

introduzca la descripción de la imagen aquí

…. ¿Dónde está el auto? Bueno, el peso es 0.0 en los datos de la prueba original, y estamos usando el peso para el tamaño del marcador, así que: no puedo verlo.

Si tiene solo algunos puntos, como aquí, puede pasar una lista de flotantes al argumento c :

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

Tener tus puntos coloreados en el orden indicado. Alternativamente, para utilizar un mapa de colores:

 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) 

Para cambiar las formas de los marcadores, debe agregar sus propios Patch o agregar un punto a la vez: por ejemplo,

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

introduzca la descripción de la imagen aquí

(He escalado el m.weight a un rango diferente para ver el quinto punto, que de lo contrario tendría un tamaño de 0.0).