12 votes

Comment synchroniser les couleurs sur des sous-points de types différents Seaborne / Matplotlib

J'essaie de créer un sous-plot avec deux parcelles. Le premier graphique est essentiellement un nuage de points (j'utilise regplot) et le second est un histogramme.

mon code est le suivant :

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

data = {'source':['B1','B1','B1','C2','C2','C2'],
        'depth':[1,4,9,1,3,10],
        'value':[10,4,23,78,24,45]}

df = pd.DataFrame(data)

f, (ax1, ax2) = plt.subplots(1,2)

for source in df['source'].unique():

    x = df.loc[df['source'] == source, 'value']
    y = df.loc[df['source'] == source, 'depth']

    sns.regplot(x,
                y,
                scatter = True,
                fit_reg = False,
                label = source,
                ax = ax1)
    ax1.legend()

    sns.distplot(x,
                 bins = 'auto',
                 norm_hist =True,
                 kde = True,
                 rug = True,
                 ax = ax2,
                 label = source)
    ax2.legend()
    ax2.relim()
    ax2.autoscale_view()
plt.show()

Le résultat est présenté ci-dessous.

enter image description here

Comme vous pouvez le voir, les couleurs entre le scatter et l'histogramme sont différentes. Maintenant, j'ai joué avec les palettes de couleurs et tout, ce qui n'a pas fonctionné. Quelqu'un peut-il m'éclairer sur la façon dont je peux synchroniser les couleurs ?

Merci.

7voto

Serenity Points 16825

Utilice color des fonctions de traçage. Dans cet exemple, à partir de la palette de couleurs actuelle de seaborn dans votre pour cycle avec itertools.cycle Les couleurs à tracer sont sélectionnées une par une :

import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import itertools

data = {'source':['B1','B1','B1','C2','C2','C2'],
        'depth':[1,4,9,1,3,10],
        'value':[10,4,23,78,24,45]}

df = pd.DataFrame(data)

f, (ax1, ax2) = plt.subplots(1,2)

# set palette 
palette = itertools.cycle(sns.color_palette())

# plotting 
for source in df['source'].unique():

    x = df.loc[df['source'] == source, 'value']
    y = df.loc[df['source'] == source, 'depth']

    # color
    c = next(palette)
    sns.regplot(x,
                y,
                scatter = True,
                fit_reg = False,
                label = source,
                ax = ax1,
                color=c)
    ax1.legend()

    sns.distplot(x,
                 bins = 'auto',
                 norm_hist =True,
                 kde = True,
                 rug = True,
                 ax = ax2,
                 label = source,
                 color=c)
    ax2.legend()
    ax2.relim()
    ax2.autoscale_view()

plt.show()

enter image description here

Vous pouvez définir votre propre palette de couleurs comme dans cette réponse

1voto

spenceryue Points 171

J'ai eu un problème très similaire.

Voici une alternative à la réponse de Serenity (les nouvelles parties par rapport au code original sont mises en évidence) :

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

data = {'source':['B1','B1','B1','C2','C2','C2'],
        'depth':[1,4,9,1,3,10],
        'value':[10,4,23,78,24,45]}

df = pd.DataFrame(data)

f, (ax1, ax2) = plt.subplots(1,2)
palette = sns.color_palette()
for color,source in zip(palette,df['source'].unique()):
      x = df.loc[df['source'] == source, 'value']
      y = df.loc[df['source'] == source, 'depth']

      sns.regplot(x,
                  y,
                  scatter = True,
                  fit_reg = False,
                  label = source,
                  ax = ax1,
                color=color)
      ax1.legend()

      sns.distplot(x,
                   bins = 'auto',
                   norm_hist =True,
                   kde = True,
                   rug = True,
                   ax = ax2,
                   label = source,
                 color=color)
      ax2.legend()
      ax2.relim()
      ax2.autoscale_view()
plt.show()

En gros, obtenez la liste des couleurs que matplotlib utilise avec sns.color_palette() .

Boucle sur la liste des zip() -paires d'échelles (color, source)color est dans la liste retournée par sns.color_palette() et préciser color comme paramètre dans l'appel à sns.xxxplot() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X