Solución:
Actualización de octubre de 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()
Que inmediatamente da como resultado:
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:
Hasta donde yo sé, esa columna de color puede ser cualquier color compatible con matplotlib (tuplas RBGA, nombres HTML, valores hexadecimales, etc.).
Tengo problemas para hacer que todo lo que no sea valores numéricos funcione con los mapas de color.
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()
Puedes usar el color parámetro al 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)
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 repositorio de github de matplotlib.
https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/colors.py