适用于Seaborn / Python / Matplotlib的定制调色板

时间:2016-11-18 21:11:58

标签: python matplotlib colors seaborn color-palette

我希望看看是否有办法设置调色板以确保在我绘图的任何时候,条形的颜色将与x轴上的值一致。

我正在使用Seaborn

我确定这是在网上的某个地方,但一直在寻找一个多小时没有运气

例如,我想要:

"周四"总是映射到紫色,    "周五"总是映射到红色,    "星期六"总是映射到绿色,    "周日"总是映射到蓝色,

我将使用不同的图表,使用不同的标准 - 有时会包括所有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)]

Looks as follows

但是示例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']

Looks as Follows

好吧,请注意所有颜色是如何移动的

如何设置映射到主值列表的自定义Palette(即Monday = Red,Tuesday = Green,Wednesday = Blue等)。动态地会很棒,但静态列表也可以

我知道我可以这样做:

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)

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

非常感谢任何帮助!

谢谢!

杰夫

1 个答案:

答案 0 :(得分:2)

就像你说的那样:"遍历调色板并将每种颜色分配给一个值"。在这里,我将使用zip,但for循环或列表/字典理解也可以。

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)

df1

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

df2