web-dev-qa-db-fra.com

Couleur par valeurs de colonne dans Matplotlib

L'un de mes aspects préférés de l'utilisation de ggplot2 bibliothèque en R est la possibilité de spécifier facilement l'esthétique. Je peux rapidement créer un nuage de points et appliquer la couleur associée à une colonne spécifique et j'aimerais pouvoir le faire avec python/pandas/matplotlib. Je me demande s'il existe des fonctions pratiques que les gens utilisent pour mapper les couleurs aux valeurs en utilisant pandas dataframes et 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: Merci pour vos réponses mais je veux inclure un exemple de trame de données pour clarifier ce que je demande. Deux colonnes contiennent des données numériques et la troisième est une variable catégorielle. Le script auquel je pense attribuera des couleurs en fonction de cette valeur.

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"]})
28
zach

Mise à jour d'octobre 2015

Seaborn gère parfaitement ce cas d'utilisation:

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

Qui génère immédiatement:

enter image description here

Ancienne réponse

Dans ce cas, j'utiliserais directement matplotlib.

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

Et cela me donne:

scalle plot with categorized colors Pour autant que je sache, cette colonne de couleur peut être n'importe quelle couleur compatible matplotlib (tuples RBGA, noms HTML, valeurs hexadécimales, etc.).

J'ai du mal à obtenir autre chose que des valeurs numériques pour travailler avec les cartes de couleurs.

45
Paul H

En fait, vous pouvez utiliser ggplot pour 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 in python

7
Anton Protopopov

Vous pouvez utiliser le paramètre color pour la méthode de tracé pour définir les couleurs souhaitées pour chaque colonne. Par exemple:

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)

Three lines with custom colors

Vous pouvez utiliser des noms de couleurs ou des codes hexadécimaux de couleur comme '# 000000' pour le noir par exemple. Vous pouvez trouver tous les noms de couleurs définis dans le fichier color.py de matplotlib. Ci-dessous le lien pour le fichier color.py dans le repo github de matplotlib.

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

4
tarotcard