parcelle de différentes couleurs pour différents catégorique niveaux à l'aide de matplotlib
J'ai cette trame de données diamonds
qui est composé de variables comme (carat, price, color)
, et je veux dessiner un diagramme de dispersion de price
à carat
pour chaque color
, ce qui signifie que les différents color
a couleur différente dans l'intrigue.
C'est facile à R
avec ggplot
:
ggplot(aes(x=carat, y=price, color=color), #by setting color=color, ggplot automatically draw in different colors
data=diamonds) + geom_point(stat='summary', fun.y=median)
Je me demande comment cela pourrait-il être fait en Python à l'aide de matplotlib
?
PS:
Je sais à propos de auxiliaire de traçage de paquets, comme seaborn
et ggplot for python
, et je donot préfèrent veux juste savoir si il est possible de faire le travail à l'aide de matplotlib
seul, ;P
- Il serait vraiment agréable d'avoir quelque chose comme ceci construit dans de matplotlib, mais il semble que ce ne sera pas facile. La Discussion ici: github.com/matplotlib/matplotlib/issues/6214
Vous devez vous connecter pour publier un commentaire.
Vous pouvez passer
plt.scatter
unc
argument qui vous permettra de sélectionner les couleurs. Le code ci-dessous définit uncolors
dictionnaire de la carte de votre diamant de couleurs pour le traçage des couleurs.df['color'].apply(lambda x: colors[x])
efficacement des cartes aux couleurs de "diamant" de "complot".(Pardonnez-moi de ne pas en mettre une autre image par exemple, je pense que 2 est assez :P)
Avec
seaborn
Vous pouvez utiliser
seaborn
qui est un wrapper autour dematplotlib
qui le rend plus joli par défaut (et non par opinion, je sais :P) mais ajoute également quelques fonctions de traçage.Pour cela, vous pouvez utiliser
seaborn.lmplot
avecfit_reg=False
(ce qui l'empêche d'effectuer automatiquement certaines de régression).Le code ci-dessous utilise un exemple de jeu de données. En sélectionnant
hue='color'
vous dire seaborn diviser votre dataframe en fonction de vos couleurs et de l'intrigue de chacun.Sans
seaborn
à l'aide depandas.groupby
Si vous ne souhaitez pas utiliser seaborn, alors vous pouvez utiliser
pandas.groupby
pour obtenir les couleurs seul et puis tracez à l'aide seulement de matplotlib, mais vous aurez à attribuer manuellement les couleurs que vous allez, j'ai ajouté un exemple ci-dessous:Ce code suppose que le même DataFrame comme ci-dessus et ensuite les groupes sur la base
color
. Ensuite, il parcourt ces groupes, en les traçant pour chacun. Pour sélectionner une couleur, j'ai créé uncolors
dictionnaire qui peut mapper la couleur du diamant (par exempleD
) à une couleur réelle (par exemplered
).groupby
je pouvais le faire, donc il y est une telle fonctionnalité dansmatplotlib
qui peut automatiquement au tirage au sort pour les différents niveaux de la catégorie à l'aide de différentes couleurs, à droite?groupby
exemple.ax.scatter
, comment feriez-vous ajouter des légendes à elle? Je suis en train d'utiliserlabel=df['color']
et puisplt.legend()
, sans succès.ax.scatter(...label=some_var)
mais il doit être une chaîne de caractères, je pense. Je ne sais pas cedf['color']
est, mais je doute que c'est une chaîne.ax.scatter(df['carat'], df['price'], c=df['color'].apply(lambda x: colors[x]))
àax.scatter(df['carat'], df['price'], c=df['color'].map(colors)
Voici une présentation succincte et solution générique à utiliser un seaborn palette de couleurs.
Première trouver une palette de couleurs que vous aimez et éventuellement de les visualiser:
Ensuite, vous pouvez l'utiliser avec
matplotlib
faire:8
danssns.color_palette("Set2", 8)
parlen(color_labels)
.À l'aide de Altair.
Ici d'une combinaison de marqueurs et de couleurs à partir d'une palette qualitative dans
matplotlib
:mpl.cm.Dark2.colors
-mpl
ne semble pas être défini dans votre code, etDark2
n'a pas d'attributcolors
.matplotlib
commempl
, j'ai corrigé mon code en utilisantplt
qui contient égalementcm
. Au moins dans lematplotlib
version que j'utilise la version 2.0.0Dark2
n'ont attributcolors
J'ai eu la même question, et ont passé toute la journée à essayer de paquets différents.
J'avais initialement utilisé matlibplot: et n'était pas heureux avec soit de la cartographie de couleurs prédéfinies; ou un groupement/de l'agrégation puis en itérant par les groupes (et les avoir toujours à des couleurs de la carte). J'ai juste senti qu'il était de mauvaise mise en œuvre du paquet.
Seaborn ne fonctionne pas sur mon cas, et Altair ne fonctionne qu'à l'intérieur d'un Jupyter Portable.
La meilleure solution pour moi a été PlotNine, qui "est une mise en œuvre d'une grammaire graphique en Python, et sur la base ggplot2".
Ci-dessous est la plotnine code de reproduire votre R exemple en Python:
Si propre et simple 🙂
J'ai l'habitude de le faire à l'aide de Seaborn qui est construit au-dessus de matplotlib