在一个名为cont_col
的列和一个category列中,我有一个包含累积和的连续数字的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())
我只是想知道是否有一种更通用的方法-特别是一种不依赖于我创建的qtile数量的方法。
发布于 2019-06-12 20:39:40
如果您不是特别关心颜色,请使用其中一个海运调色板创建一个映射。这样,您只需要指定列,而不是类别或颜色的数量。如果您有许多有序的类别,请考虑切换到顺序调色板。
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()
发布于 2019-06-12 20:24:02
您可以定义颜色映射的字典。
color_map = {
0:'k',
1:'r',
2:'g'
}
然后,使用.map()
df['colour'] = df['quartile'].map(color_map).fillna('b')
https://stackoverflow.com/questions/56569458
复制相似问题