根据一系列 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)
我正在尝试制作一个 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)