0

I simply cannot find a way to make seaborn.histplot show the correct colors of a custom palette I've created. It works just fine with other functions like seaborn.countplot, but in seaborn.histplot it desaturates all the colors. I've also tried to use seaborn.color_palette with desat = 1 and as_cmap = True, but it is useless for histplot.

An example:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

df_plot = pd.DataFrame(
    {
        "pl_letter": ['b', 'b', 'b', 'b', 'b', 'b', 'b', 'd', 'd', 'c', 'b', 'c', 'b', 'c', 'c', 'b', 'c', 'b', 'b', 'b'],
        "discoverymethod": ['Astrometry', 'Disk Kinematics', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations', 'Eclipse Timing Variations']
    }
)

cat_var1 = "pl_letter"
cat_var2 = "discoverymethod"

n_groups = len(set(df_plot[cat_var1].values.tolist()))
cmap = LinearSegmentedColormap.from_list("my_palette", ["#111539", "#97A1D9"])
my_palette = [cmap(i/n_groups) for i in np.array(range(n_groups))]

levels_var1 = pd.crosstab(df_plot[cat_var1], df_plot[cat_var2]).sort_values(by = cat_var1).index.tolist()
levels_var2 = list(set(df_plot[cat_var2]))

fig = plt.figure(
    figsize = (20, 10),
    tight_layout = True
)
# ax = sns.countplot(
#     data = df_plot, 
#     x = cat_var2, 
#     hue = cat_var1,
#     hue_order = levels_var1,
#     dodge = False,
#     ec = "white",
#     palette = my_palette
# )
ax = sns.histplot(
    data = df_plot,
    x = cat_var2,
    hue = cat_var1,
    hue_order = levels_var1,
    stat = "probability",
    multiple = "fill",
    shrink = 0.8,
    palette = sns.color_palette(
        palette = my_palette, 
        as_cmap = True, 
        desat = 1
    )
)

histplot with desaturated colors countplot with correct colors

0 Answers0