Seaborn/Python/Matplotlib 的循环自定义调色板

Recurring Custom Color Palette for Seaborn/Python/Matplotlib

我想看看是否有一种方法可以设置调色板,以确保每次绘制图表时,条形图的颜色都与 x 轴上的值一致。

我正在使用 Seaborn

我确定这是在线某个地方,但已经搜索了一个多小时但没有成功

例如,我想要:

"Thursday" 总是映射到紫色, "Friday" 总是映射到红色, "Saturday" 始终映射到绿色, "Sunday" 始终映射到蓝色,

我会将其用于各种不同的图表,使用不同的标准 - 有时会包括所有 4 天,有时不会

如果您查看下面的示例,颜色效果很好

示例 1:

%matplotlib inline
import pandas as pd
import seaborn as sns
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-   book/master/ch08/tips.csv", sep=',')
df=df[(df['sex']=='Female')&(df['smoker']=='No')&(df['time']=='Dinner')&(df['size']==2)]

但是示例 2,基于星期日的过滤:

%matplotlib inline
import pandas as pd
import seaborn as sns
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-   book/master/ch08/tips.csv", sep=',')
df=df[(df['sex']=='Female')&(df['smoker']=='No')&(df['time']=='Dinner')&(df['size']==2)]
df=df[df['day']!='Sun']

好吧,请注意所有颜色是如何变化的

如何设置映射到主值列表(即星期一 = 红色、星期二 = 绿色、星期三 = 蓝色等)的自定义调色板。动态会很棒,但静态列表也可以

我知道我可以做类似的事情:

pal = dict(Sat="k", Thur="b", Fri="y", Sun="#9b59b6")

x=sns.barplot(x="day",y="tip",data=df, palette=pal)

它设置了一个调色板,然后将其应用于每个栏,但我更希望能够使用现有的调色板,比如

sns.color_palette("Set1", n_colors=30, desat=.5)

然后遍历调色板并将每种颜色分配给一个值(即第一个值是星期一、第二个星期二等)

非常感谢任何帮助!

谢谢!

杰夫

照你说的做:"iterate through the palette and assign each color to a value"。在这里,我将使用 zip,但 for 循环或 list/dict 理解也可以。

df = pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')
df1 = df[(df['sex']=='Female')&(df['smoker']=='No')&(df['time']=='Dinner')&(df['size']==2)]
df2 = df1[df1['day']!='Sun']

days = df['day'].unique()
pal = dict(zip(days, sns.color_palette("Set1", n_colors=len(days))))

sns.barplot(x="day",y="tip",data=df1, palette=pal)

sns.barplot(x="day",y="tip",data=df2, palette=pal)