在熊猫图中按类别着色

时间:2019-06-12 19:49:42

标签: python pandas

在名为cont_col的列和类别列中,我有一个DataFrame,其中包含一个用于累计总和的连续数字:

import pandas as pd
import numpy as np

cont = np.random.rand(100)

df = pd.DataFrame(data=cont)

df = df.sort_values(by=0)

df['quartile'] = pd.qcut(df[0], 4, labels=False)

cumsum = df[0].cumsum()
cumsum = cumsum.to_frame()
cumsum[0].plot(kind='bar', color='k')

我想绘制相同的数据,但是这次用四分位数列着色。

我可以使用以下代码进行操作:

def colourise(x):
    if x == 0:
        return 'k'
    elif x == 1:
        return 'r'
    elif x == 2:
        return 'g'
    else:
        return 'b'

df['colour'] = df['quartile'].apply(colourise)
cumsum = df[0].cumsum()
cumsum = cumsum.to_frame()
cumsum[0].plot(kind='bar', color=df['colour'].tolist())

我只是想知道是否还有一种更通用的方法-特别是一种不依赖于我创建的qtiles数量的方法。

2 个答案:

答案 0 :(得分:1)

您可以定义颜色映射的字典。

color_map = {
    0:'k',
    1:'r',
    2:'g'
}

然后,使用.map()

df['colour'] = df['quartile'].map(color_map).fillna('b')

答案 1 :(得分:1)

如果您不太在意颜色,请使用一种深蓝色调色板创建映射。这样,您只需要指定列,而不是类别或颜色的数量即可。如果您有许多排序的类别,请考虑切换到顺序调色板。

import seaborn as sns
import matplotlib.pyplot as plt

def map_color(df, col):
    color_d = dict(zip(df[col].unique(), sns.color_palette("hls", df[col].nunique())))
    df['color'] = df[col].map(color_d)
    return df

df  = map_color(df, 'quartile')

fig, ax = plt.subplots(figsize=(10, 5))
df.assign(y=df[0].cumsum()).plot(kind='bar', y='y', ax=ax, color=df.color.tolist(),
                                 legend=False)
plt.show()

enter image description here