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()
…. ¿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()
(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).