首页 > 解决方案 > 更改 Seaborn 应用调色板的轴

问题描述

我正在尝试使用 Seaborn 将一维数据框呈现为水平条形图。我想使用冷暖调色板对条形进行着色以反映它们的大小和方向。

换句话说,我希望生成类似于此处显示的第二个示例的内容(来自Seaborn 站点),但我想将其水平定向:

在此处输入图像描述

我已经成功地将图形侧向转动,但我似乎无法使调色板也沿水平轴应用。我的代码:

import pandas as pd, seaborn as sns

sns.set()
df = pd.DataFrame([7,-5,-2,1.5,-3],
                  index=['question 1','question 2','question 3','question 4','question 5'],
                  columns=['t'])
sns.barplot(data=    df,
            x=       't', 
            y=       df.index,
            palette= 'coolwarm') 

输出:

输出

当您从左到右(而不是从上到下)移动时,我希望它从蓝色变为红色。

标签: pythonpandasseaborn

解决方案


Seaborn 不执行任何真正的颜色映射。因此,如果需要这样做,则需要在外部进行。在下文中,每个条形图根据其大小从颜色图中获取其颜色。

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

sns.set()
df = pd.DataFrame([7,-5,-2,1.5,-3],
                  index=['question 1','question 2','question 3','question 4','question 5'],
                  columns=['t'])

absmax = np.abs(df["t"].values).max()
norm = plt.Normalize(-absmax, absmax)
cmap = plt.get_cmap("coolwarm")
colors = cmap(norm(df["t"].values))
plt.barh("index", "t", data=df.reset_index(), color=colors)

plt.colorbar(plt.cm.ScalarMappable(norm, cmap))

plt.gca().invert_yaxis()
plt.tight_layout()
plt.show()

在此处输入图像描述


推荐阅读