Saltar al contenido

Color por valores de columna en Matplotlib

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:

ingrese 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:

diagrama de escala con colores categorizados
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()

ggplot en python

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)

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 repositorio de github de matplotlib.

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *