#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')