在名为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数量的方法。
答案 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()