2017-08-22 2 views
3

J'essaye de créer une sous-parcelle avec deux parcelles. Le premier graphique est essentiellement un diagramme de dispersion (j'utilise regplot) et le second est un histogramme.Comment synchroniser les couleurs à travers des sous-types de différents types Seaborne/Matplotlib

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 illustré ci-dessous.

enter image description here

Comme vous pouvez le voir, les couleurs entre la dispersion et l'histogramme sont différents. Maintenant, j'ai eu un jeu avec des palettes de couleurs et tout, ce qui n'a pas fonctionné. Quelqu'un peut-il faire la lumière sur la façon dont je peux synchroniser les couleurs?

Merci.

Répondre

2

Utilisez color argument de fonctions de traçage. Dans cet exemple de la palette de couleurs de Seaborn actuelle dans votre pour le cycle avec itertools.cycle couleurs pour tracer sont sélectionnés un par un:

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 color palette comme dans this answer

+0

C'est parfait. Merci beaucoup pour votre réponse. –

0

j'avais un problème très similaire.

est ici une alternative à la réponse de Serenity (nouveau code d'origine de pièces en surbrillance):

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

Fondamentalement, obtenir la liste des couleurs matplotlib utilise avec sns.color_palette().

Boucle sur la liste des paires zip() -ped (color, source)color se trouve dans la liste renvoyée par sns.color_palette(), et spécifier color en tant que paramètre dans l'appel à sns.xxxplot().