避免使用Seaborn条形图时颜色的减淡

7

我正在使用几个不同的Python库(bokehseabornmatplotlib)制作图表,但要保持相同的颜色方案。 我已经从bokeh中选择了分类调色板:
from bokeh.palettes import Category10 as palette
然后也在seabornmatplotlib中使用它。 我的问题是,尽管在matplotlib中,颜色似乎与bokeh (在调色板中定义)非常相似,但seaborn 显示出比应该更暗的颜色(即较不饱和或脱色)。 我想知道它是否默认通过某种方式使任何颜色方案变暗,以及是否有任何方法可以避免这种情况。 以下是使用不同库制作相同条形图的代码
使用bokeh

source = pd.DataFrame({'names': ['exp_1', 'exp_2'], 'data':[3, 5], 'color':palette[10][:2]})
p = bokeh.plotting.figure(x_range=['exp_1', 'exp_2'], y_range=(0,6), plot_height=500, title="test")
p.vbar(x='names', top='data', width=0.9,  legend_field="names", source=source, color='color')
p.xgrid.grid_line_color = None
p.legend.orientation = "horizontal"
p.legend.location = "top_center"
p.xaxis.major_label_text_font_size = '22pt'
p.yaxis.major_label_text_font_size = '22pt'
bokeh.io.show(p)

使用 matplotlib:

# same palette both for seaborn and matplotlib (taken from bokeh palette)
sns_palette=sns.color_palette(palette[10]) 
fig, ax = plt.subplots()
plt.style.use('seaborn')
ax.set_xlabel('experiment', fontsize=20)
ax.tick_params(axis='both', which='major', labelsize=22)
ax.set_xticks([0, 1])
ax.set_xticklabels(['exp_1', 'exp_2'], fontsize=18)
ax.bar([0, 1], source['data'], align='center', color=sns_palette[:2])

使用 bokeh 进行数据可视化:

plt.figure()
ax = sns.barplot(x="names", y="data", data=source, palette=sns_palette[0:2])
ax.set_xlabel('experiment', fontsize=20)
ax.tick_params(axis='both', which='major', labelsize=18)
plt.tight_layout()


bokeh 条形图:
bokeh
matplotlib 条形图:
matplotlib
seaborn 条形图:
seaborn


@JohanC 似乎不是原因:我检查了一下,使用白色背景并明确设置 alpha=1 也不会改变条形图的颜色:sns.set_style('white'); kwargs = {'alpha':1}; ax = sns.barplot(x="names", y="data", data=source, palette=sns_palette[0:2], **kwargs) - Antonio
3
barplot有一个名为saturation的选项,默认值为0.75。将其设置为1可以避免所有饱和度:sns.barplot(..., saturation=1)(不过,出于美学原因,文档建议进行一些去饱和处理)。 - JohanC
@JohanC 是的,可以!谢谢!(有趣的是,这个“去饱和度”的选项默认似乎只存在于条形图和箱线图中,而不是折线图)。如果您将您的评论发布为答案,我可以接受它。 - Antonio
链接的文档解释了去饱和度建议用于大面积,而不是线条。 - JohanC
1
这个回答是否解决了你的问题?Seaborn图表颜色与调色板中指定的不同 - My Work
1个回答

7

Seaborn的条形图默认将条形颜色饱和度设置为0.75。可以通过在调用条形图时添加saturation=1来覆盖该设置。

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

source = pd.DataFrame({'names': ['exp_1', 'exp_2'], 'data':[3, 5]})
fig, ax = plt.subplots(1, 2)

# default saruration setting
sns.barplot(x="names", y="data", data=source, ax=ax[0])
ax[0].set_title('default saturation')

# additional parameter `saturation=1` passed to barplot
sns.barplot(x="names", y="data", data=source, saturation=1, ax=ax[1])
ax[1].set_title('saturation=1')

(这个回答是直接从@JohanC的评论中提取的,我只是将其升级为一个答案...很高兴所有权归那个用户。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接