color parameter isn't changing the plot color

185 Views Asked by At

Following is the code that doesn't work.

import numpy as np
import pandas as pd
import seaborn as sns

sns.displot(pd.DataFrame(res), color='red', edgecolor=None, binwidth=.5, binrange=(3, 18+1));

res is a list type.

I was expecting the bars to be red, but they are the default color.

I had no problem before with this code.

1

There are 1 best solutions below

0
On BEST ANSWER
  • The correct approach to setting the color of a single group, depends on how, or if, data= is specified, and if x=, or y=, is specified.
  • The same issue applies to g = sns.histplot(data=df, color='r', legend=False), as shown in this plot.
    • The following implementations also apply to histplot.
  • See How to modify the kernel density estimate line in a sns.histplot for changing the line color for kde=True.
  • Tested in python 3.11.3, matplotlib 3.7.1, seaborn 0.12.2

Imports and Data

import numpy as np
import seaborn as sns

# random normal data as a list
np.random.seed(2023)
res = np.random.normal(loc=75, scale=5, size=1000).tolist()

# create a dataframe
df = pd.DataFrame(res)

# df.head() - the column header is the number 0, not string '0'

           0
0  78.558368
1  73.377575
2  69.990647
3  76.181254
4  74.489201

Plot Implementation

  • Pass df, and do not specify a column name for x=, requires passing a dict or a list to palette.
    • palette will also accept a string, but the string must be a valid palette name, ValueError: 'r' is not a valid palette name
  • The color saturation is different when using palette, compared to color, so pass alpha= (number 0 - 1) to adjust as needed.
g = sns.displot(data=df, palette={0: 'r'})  # from v0.13.0 this does not work, because hue must also be specified
g = sns.displot(data=df, palette=['r'])  # from v0.13.0 this does not work, because hue must also be specified
  • Pass df, and specify a column name for x=
g = sns.displot(data=df, x=0, color='r')
  • Pass the column to x=
g = sns.displot(x=df[0], color='r')
  • Pass res directly to data=
g = sns.displot(data=res, color='r')
  • Pass res directly to x=
g = sns.displot(x=res, color='r')

enter image description here

enter image description here