Color por valores de columna en Matplotlib

Uno de mis aspectos favoritos del uso de la biblioteca ggplot2 en R es la capacidad de especificar fácilmente la estética. Puedo hacer rápidamente un diagtwig de dispersión y aplicar el color asociado a una columna específica y me encantaría poder hacer esto con python / pandas / matplotlib. Me pregunto si hay alguna función de conveniencia que las personas usen para asignar colores a valores usando marcos de datos de pandas y Matplotlib.

 ##ggplot scatterplot example with R dataframe, `df`, colored by col3 ggplot(data = df, aes(x=col1, y=col2, color=col3)) + geom_point() ##ideal situation with pandas dataframe, 'df', where colors are chosen by col3 df.plot(x=col1,y=col2,color=col3) 

EDIT: Gracias por sus respuestas, pero quiero incluir un dataframe de muestra para aclarar lo que estoy preguntando. Dos columnas contienen datos numéricos y la tercera es una variable categórica. El guión en el que estoy pensando asignará colores basados ​​en este valor.

 import pandas as pd df = pd.DataFrame({'Height':np.random.normal(10), 'Weight':np.random.normal(10), 'Gender': ["Male","Male","Male","Male","Male", "Female","Female","Female","Female","Female"]}) 

Actualización octubre 2015

Seaborn maneja este caso de uso espléndidamente:

 import numpy import pandas from matplotlib import pyplot import seaborn seaborn.set(style='ticks') numpy.random.seed(0) N = 37 _genders= ['Female', 'Male', 'Non-binary', 'No Response'] df = pandas.DataFrame({ 'Height (cm)': numpy.random.uniform(low=130, high=200, size=N), 'Weight (kg)': numpy.random.uniform(low=30, high=100, size=N), 'Gender': numpy.random.choice(_genders, size=N) }) fg = seaborn.FacetGrid(data=df, hue='Gender', hue_order=_genders, aspect=1.61) fg.map(pyplot.scatter, 'Weight (kg)', 'Height (cm)').add_legend() 

Lo que produce inmediatamente:

introduzca la descripción de la imagen aquí

Respuesta antigua

En este caso, usaría matplotlib directamente.

 import numpy as np import matplotlib.pyplot as plt import pandas as pd def dfScatter(df, xcol='Height', ycol='Weight', catcol='Gender'): fig, ax = plt.subplots() categories = np.unique(df[catcol]) colors = np.linspace(0, 1, len(categories)) colordict = dict(zip(categories, colors)) df["Color"] = df[catcol].apply(lambda x: colordict[x]) ax.scatter(df[xcol], df[ycol], c=df.Color) return fig if 1: df = pd.DataFrame({'Height':np.random.normal(size=10), 'Weight':np.random.normal(size=10), 'Gender': ["Male","Male","Unknown","Male","Male", "Female","Did not respond","Unknown","Female","Female"]}) fig = dfScatter(df) fig.savefig('fig1.png') 

Y eso me da:

Parcela de scalle con colores categorizados. Que yo sepa, esa columna de color puede ser de cualquier color compatible con matplotlib (tuplas RBGA, nombres HTML, valores hexadecimales, etc.).

Estoy teniendo problemas para conseguir que los valores numéricos funcionen con los mapas de colores.

En realidad podrías usar ggplot para python :

 from ggplot import * import numpy as np import pandas as pd df = pd.DataFrame({'Height':np.random.randn(10), 'Weight':np.random.randn(10), 'Gender': ["Male","Male","Male","Male","Male", "Female","Female","Female","Female","Female"]}) ggplot(aes(x='Height', y='Weight', color='Gender'), data=df) + geom_point() 

ggplot en python

Puede usar el parámetro de color para el método de trazado para definir los colores que desea para cada columna. Por ejemplo:

 from pandas import DataFrame data = DataFrame({'a':range(5),'b':range(1,6),'c':range(2,7)}) colors = ['yellowgreen','cyan','magenta'] data.plot(color=colors) 

Tres líneas con colores personalizados.

Puede usar nombres de color o códigos hexadecimales de color como ‘# 000000’ para decir negro. Puede encontrar todos los nombres de colores definidos en el archivo color.py de matplotlib. A continuación se muestra el enlace para el archivo color.py en el repository github de matplotlib.

https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/colors.py