Разрешить изменение оттенка цвета маркера в пределах категории в соответствии со столбцом диаграммы рассеяния Seaborn

#python #seaborn #scatter-plot #color-shade

#python #seaborn #диаграмма рассеяния #цвет-оттенок

Вопрос:

Возможно ли в диаграмме рассеяния Seaborn, которая используется hue для определения категорий, и в определенном столбце для определения размера маркера, разрешить изменение «оттенка» цвета маркера в пределах категории (как определено hue ) в соответствии с третьим столбцом?

Следующий пример используется hue для определения категорий (в соответствии с df['cat'] ) и df['p'] изменения размера маркера. Однако это не позволяет изменять оттенок цвета маркера в пределах категории (как определено hue ). Я хотел бы сделать это с помощью df['q'] .

 import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set() 
    
df = pd.DataFrame({'x': np.random.normal(size=50),
                   'y': np.random.normal(size=50),
                   'cat': np.random.randint(1,4,size=50),
                   'p':  np.random.uniform(size=50),
                   'q': np.random.uniform(size=50)})
    
df.head()
    
fig, ax = plt.subplots(figsize=(8,8), tight_layout=True)
ax = sns.scatterplot(data = df, x='x',y='y', hue = 'cat', size='p')
plt.show()
  

Ответ №1:

Самое сложное — подобрать правильные цветовые палитры. Вы должны выбирать палитры, в которых самые светлые и самые темные цвета достаточно отличаются от других, чтобы отличать их друг от друга. Для этого примера я выбрал подход cubehelix, но у вас возникнут проблемы с большим количеством категорий.

Вероятно, вам потребуется определить свой собственный набор цветовых палитр и убедиться, что вы можете отличить их друг от друга в любой точке цветовой полосы.

Это просто перебирает каждую категорию и отображает одну над другой, меняя цветовую схему по ходу.

 plt.figure(figsize=(15,15))
sns.set_style("white")
edge_color = ['blue','brown','green']

for i, x in enumerate(df.cat.unique()):

    t = df[df['cat']==x]
    p = sns.cubehelix_palette(start=i, rot=0, dark=.1, light=.7, as_cmap=True)
    g = sns.scatterplot(data = t, x='x',y='y', hue = 'q', size='p', palette=p, legend=None, edgecolor=edge_color[i])
    
plt.legend(title='Category', loc='upper left', labels=df.cat.unique())
leg = g.get_legend()

leg.legendHandles[0].set_color('Blue')
leg.legendHandles[1].set_color('Brown')
leg.legendHandles[2].set_color('Green')
  

введите описание изображения здесь