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"]})
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:
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:
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.
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()
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)
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