如何使用pandas绘制无重复颜色的堆叠(复合)柱状图?
堆叠柱状图(复合柱状图)生成及颜色重复问题解决方案
pandas内置的柱状图接口原生支持堆叠模式,你代码中用stacked=True的写法本身没有问题,颜色重复是因为默认配色循环的颜色数量少于你数据里的州/地区(State/UTs)总数,配色循环用完之后就会复用之前的颜色,导致不同州颜色撞色。
修复方案
你只需要在绘图前给每个州/地区分配唯一固定的配色,再传入绘图接口即可,修改后的绘图部分代码如下:
import matplotlib.cm as cm import numpy as np # 先获取所有州的唯一值 states = data2['State/UTs'].unique() n_states = len(states) # 生成足够多的唯一配色,州数量少于20用tab20,超过的话可以拼接多个配色盘 if n_states <= 20: color_palette = cm.get_cmap('tab20', n_states).colors else: # 超过20个州的话拼接tab20和tab20b两个配色盘,最多支持40种颜色 cmap1 = cm.get_cmap('tab20', 20) cmap2 = cm.get_cmap('tab20b', 20) color_palette = np.vstack((cmap1.colors, cmap2.colors))[:n_states] # 建立州和颜色的对应映射,保证每个州颜色固定 color_map = dict(zip(states, color_palette)) # 绘图时传入color参数 pivot_df = data2.pivot_table(index='Level', columns = 'State/UTs', values = 'Total Cases') ax = pivot_df.plot(kind='bar', stacked=True, figsize=(15,15), fontsize=25, color=[color_map[col] for col in pivot_df.columns]) # 后续的样式调整代码保持不变即可 plt.grid() ax.axhline(0, color='black', lw=1) ax.legend(fontsize=8, loc=(1.0,0.2)) ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.spines['bottom'].set_linewidth(3) ax.spines['left'].set_linewidth(3) ax.set_xlabel('Level',fontsize=20,color='r') ax.set_ylabel('Total Cases',fontsize=20,color='r') plt.xticks(rotation=0) plt.show()
效果说明
- 修复后每个州/地区都会对应唯一的颜色,不会再出现颜色重复混淆的问题
- 配色映射是固定的,即使后续数据里州的顺序变化,同一个州的颜色也不会变,便于跨图表对比
效果参考
目标效果

原始错误效果

修复后参考效果

内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

