Seaborn:创建带有渐变颜色的条形图

时间:2020-02-10 22:43:09

标签: plot bar-chart seaborn

我有一个列表,其中包含要使用条形图显示的不同方法的名称及其在测试集上的性能。好吧,事实上,我想得出它们相对于基准模型的相对改进/降低。因此,数据如下所示:

aggregate(month ~ XXX, data = df, mean)

我在seaborn中尝试了条形图,这给了我一个简单的,固定颜色的条形图。但是,我要寻找的条形图的颜色在system_1,+2.5 system_2,-0.8 system_3,+0.24 范围内,其中红色对应于red, white, green,白色对应于data['score'].min(),绿色代表{{1 }}。我想让颜色的暗度/明度表示它们与0的距离,这意味着深红色表示最差的系统,深绿色表示最佳性能的系统,中间的所有性能都由较浅的颜色表示。

我找到了一些解决方案来制作渐变色,但是它们并没有达到我的期望。这是我的代码和得到的图表。

0

enter image description here

如您所见,与其根据颜色数据点的值来确定颜色范围,还不如根据颜色数据点的索引来改变颜色。您对此有任何想法吗?

非常感谢您!

1 个答案:

答案 0 :(得分:1)

以下方法使用发散范数和红-黄-绿颜色图将最小值映射到红色极值,将零值映射到红色,最高值映射到绿色。

由于短条的颜色非常浅,因此添加了黑色边缘,使每个条都清晰可见。

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.colors import DivergingNorm
import numpy as np

sns.set(style='whitegrid', color_codes=True)
N = 11
data = pd.DataFrame({'System': [f'System {i}' for i in range(1, N + 1)],
                     'performance': np.random.uniform(-1.5, 2.5, N)})

norm = DivergingNorm(vmin=data.performance.min(), vcenter=0, vmax=data.performance.max())
colors = [plt.cm.RdYlGn(norm(c)) for c in data['performance']]
ax = sns.barplot(x='performance', y='System', data=data, palette=colors, edgecolor='black')
plt.tight_layout()
plt.show()

resulting plot

Seaborn的diverging_palette可用于创建具有两个色相值的调色板。色相0为红色,色相150为绿色。默认情况下,中心为白色。您可以尝试使用饱和度s=80和亮度l=55

red_green_pal = sns.diverging_palette(0, 150, n=256, as_cmap=True)
colors = [red_green_pal(norm(c)) for c in data['performance']]