根据图中未包含的值设置Seaborn条形颜色

时间:2018-12-04 19:08:26

标签: python matplotlib seaborn

我有一个熊猫数据框df,其列为x(类别),yz(均为浮动)。

这是我的条形图。

sns.barplot(data=df, x=x, y=y)

如何根据z列的值为条形设置调色板?我想设置Matplotlib样式调色板,例如magmaRdYlBu。基本上,就像设置hue参数一样,但具有标量变量。

谢谢!

2 个答案:

答案 0 :(得分:1)

我不确定在seaborn中是否有办法做到这一点。但是通常直接使用matplotlib也可以。

import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({"x" : list("ABCDEFGH"),
                   "y" : [3,4,5,2,1,6,3,4],
                   "z" : [4,5,7,1,4,5,3,4]})

norm = plt.Normalize(df.z.min(), df.z.max())
cmap = plt.get_cmap("magma")

plt.bar(x="x", height="y", data=df, color=cmap(norm(df.z.values)))

plt.show()

enter image description here

如果“类别”列包含熊猫类别,而不是简单的字符串,则首先需要将其转换为df["x"] = df["x"].astype(str)

答案 1 :(得分:1)

只需使用与 hue 变量相对应的palette参数:

sns.barplot(data=df, x=x, y=y, hue=z, palette='magma')

使用随机数据进行演示:

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

data_tools = ['sas', 'stata', 'spss', 'python', 'r', 'julia']

np.random.seed(11212018)
rand_df = pd.DataFrame({'GROUP': np.random.choice(data_tools, 500),
                        'INT': np.random.randint(1, 10, 500),
                        'NUM': np.random.randn(500),
                       })

fig, ax = plt.subplots(figsize=(15,5))
sns.barplot(data=rand_df, x='GROUP', y='NUM', hue='INT', palette='magma', ax=ax, ci=None)

plt.legend(bbox_to_anchor=(1,0.5), loc="center right",)
plt.show()

Plot Output