J'ai cette trame de données diamonds
qui est composé de variables telles que (carat, price, color)
, et je veux dessiner un diagramme de dispersion price
à carat
chaque color
, ce qui signifie différent color
a une couleur différente dans la parcelle.
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 être fait en Python en utilisant matplotlib
?
PS:
Je connais les packages de traçage auxiliaires, tels que seaborn
et ggplot for python
, et je ne les préfère pas, je veux juste savoir s'il est possible de faire le travail en utilisant matplotlib
seul,; P
matplotlib
pandas
visualization
Avocat
la source
la source
Réponses:
Vous pouvez passer
plt.scatter
unc
argument qui vous permettra de sélectionner les couleurs. Le code ci-dessous définit uncolors
dictionnaire pour mapper vos couleurs de diamant aux couleurs de traçage.df['color'].apply(lambda x: colors[x])
mappe efficacement les couleurs du «diamant» au «tracé».(Pardonnez-moi de ne pas mettre une autre image d'exemple, je pense que 2 suffit: P)
Avec
seaborn
Vous pouvez utiliser
seaborn
un wrappermatplotlib
qui le rend plus joli par défaut (plutôt basé sur l'opinion, je sais: P) mais ajoute également des fonctions de traçage.Pour cela, vous pouvez utiliser
seaborn.lmplot
avecfit_reg=False
(ce qui l'empêche de faire automatiquement une régression).Le code ci-dessous utilise un exemple de jeu de données. En sélectionnant,
hue='color'
vous dites à seaborn de diviser votre trame de données en fonction de vos couleurs, puis de tracer chacune d'elles.Sans
seaborn
utiliserpandas.groupby
Si vous ne souhaitez pas utiliser seaborn, vous pouvez utiliser
pandas.groupby
pour obtenir les couleurs seules, puis les tracer en utilisant uniquement matplotlib, mais vous devrez attribuer manuellement les couleurs au fur et à mesure, j'ai ajouté un exemple ci-dessous:Ce code suppose le même DataFrame que ci-dessus, puis le regroupe en fonction de
color
. Il itère ensuite sur ces groupes, en traçant pour chacun d'eux. 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
).la source
groupby
je pourrais le faire, donc il y a une telle fonctionnalitématplotlib
qui peut automatiquement dessiner pour différents niveaux d'un catégoriel en utilisant une couleur différente, non?groupby
exemple.ax.scatter
, comment y ajouteriez-vous des légendes? J'essaye d'utiliserlabel=df['color']
et puisplt.legend()
sans succès.ax.scatter(df['carat'], df['price'], c=df['color'].apply(lambda x: colors[x]))
pourax.scatter(df['carat'], df['price'], c=df['color'].map(colors)
Voici une solution succincte et générique pour utiliser une palette de couleurs marine.
Trouvez d' abord une palette de couleurs que vous aimez et visualisez-la éventuellement:
Ensuite, vous pouvez l'utiliser pour
matplotlib
faire ceci:la source
8
insns.color_palette("Set2", 8)
parlen(color_labels)
.J'ai eu la même question et j'ai passé toute la journée à essayer différents packages.
J'avais utilisé à l'origine matlibplot: et je n'étais pas satisfait de la correspondance des catégories avec des couleurs prédéfinies; ou regroupement / agrégation puis itération à travers les groupes (et toujours à mapper les couleurs). Je pensais juste que c'était une mauvaise mise en œuvre du package.
Seaborn ne fonctionnerait pas sur mon cas, et Altair fonctionne UNIQUEMENT à l'intérieur d'un Jupyter Notebook.
La meilleure solution pour moi était PlotNine, qui "est une implémentation d'une grammaire graphique en Python, et basée sur ggplot2".
Vous trouverez ci-dessous le code plotnine pour répliquer votre exemple R en Python:
Si propre et simple :)
la source
Utilisation d' Altair .
la source
Voici une combinaison de marqueurs et de couleurs à partir d'une palette de couleurs qualitative en
matplotlib
:la source
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 lamatplotlib
version que j'utilise 2.0.0Dark2
a un attributcolors
Avec df.plot ()
Normalement, lorsque je trace rapidement un DataFrame, j'utilise
pd.DataFrame.plot()
. Cela prend l'indice comme valeur x, la valeur comme valeur y et trace chaque colonne séparément avec une couleur différente. Un DataFrame sous cette forme peut être réalisé en utilisantset_index
etunstack
.Avec cette méthode, vous n'avez pas à spécifier manuellement les couleurs.
Cette procédure peut avoir plus de sens pour d'autres séries de données. Dans mon cas, j'ai des données de séries temporelles, donc le MultiIndex se compose de datetime et de catégories. Il est également possible d'utiliser cette approche pour colorier plus d'une colonne, mais la légende se dégrade.
la source
Je le fais généralement en utilisant Seaborn qui est construit sur matplotlib
la source