根据一系列 x 值 (Python) 在 seaborn 中更改 barpolot 颜色

Change barpolot color in seaborn based on a range of x values (Python)

我正在尝试制作一个 seaborn 条形图,绘制不同年份的值(棒球队 ERA),然后根据不同管理下的年份范围突出显示条形图。

我的数据框如下所示:

import pandas as pd
import pybaseball as pyb
import seaborn as sns
from matplotlib import pyplot
import numpy as np

cards_pitching_df = pyb.team_pitching(start_season=1996,end_season=2020)
cards_pitching_df = cards_pitching_df.loc[(cards_pitching_df['Team'] == "STL"), :"Pitches"]
cards_pitching_df = cards_pitching_df.sort_values(by='Season', ascending=False)

era = list(cards_pitching_df['ERA'])
season = list(cards_pitching_df['Season'])

df_season_era = list(zip(era,season))
df_season_era = pd.DataFrame(df_season_era, columns=['ERA','Season'])
df_season_era
        ERA    Season
    0   3.92    2020
    1   3.82    2019
    2   3.85    2018
    3   4.01    2017
    4   4.08    2016
    5   2.94    2015
    6   3.50    2014
    7   3.43    2013
    8   3.71    2012
    9   3.79    2011

截至目前,我已经根据 ERA 值突出显示了我的 seaborn 条形图,请参见下文。但我想要的是 1996-2011 年间 ERA 的一种颜色(比如蓝色),2012-2017 年的绿色,2018-2020 年的橙色,它们是 x 值。

era_chart_2 = sns.barplot(x=season, y=era, data=df_season_era)
for bar in era_chart2.patches:
    if bar.get_height() > 3.5:
        bar.set_color('grey')    
    else:
        bar.set_color('green')

See the chart it is now producing here

关于如何使条形图以这种方式着色有什么建议吗?谢谢!

import numpy as np, matplotlib.pyplot as plt, seaborn as sns
sns.set(style="whitegrid", color_codes=True)

titanic = sns.load_dataset("titanic")
data = titanic.groupby("deck").size()   # data underlying bar plot in question

pal = sns.color_palette("Greens_d", len(data))
rank = data.argsort().argsort()   # 
sns.barplot(x=data.index, y=data, palette=np.array(pal[::-1])[rank])

plt.show()

这应该有效!

您可以使用 palette 在 seaborn 中添加首选颜色范围。

使用这个:

palette=['blue' if val in range(1996,2012) else 'green' if val in range(2012,2018) else 'orange' for val in sorted(df_season_era['Season'].tolist())]

sns.barplot('Season', 'ERA', data=df_season_era, palette=palette)

注意:在range()函数中上限总是upper_limit - 1。所以这就是为什么我使用 range(1996,2012)range(2012,2018) 而不是 range(1996,2011)range(2012,2017)