Pandas DataFrame绘制堆叠柱状图颜色重复,如何实现类别颜色唯一?
问题描述
根据Pandas官方手册,colormap参数可用于从matplotlib的colormap对象中选择颜色,但绘制柱状图时,若未手动设置每个柱子的颜色,默认仅提供10种独特颜色,当类别(列)数量较多时颜色会重复,手动设置工作量极大。期望让图表中每个类别都拥有唯一颜色。
复现代码
import matplotlib.pyplot as plt import pandas as pd import numpy as np df = pd.DataFrame(np.random.randint(0,100,size=(100, 25)), columns=list('ABCDEFGHIJKLMNOPQRSTUVWXY')) df.set_index('A', inplace=True) df.plot(kind='bar', stacked=True, figsize=(20, 10)) plt.title("some_name") plt.savefig("some_name" + '.png')
解决方案
核心思路是从matplotlib的colormap中生成与类别数量匹配的唯一颜色列表,传给df.plot()的color参数即可。
方法1:基于连续colormap生成颜色
选择连续型colormap(如viridis、plasma等),生成对应数量的颜色:
import matplotlib.pyplot as plt import pandas as pd import numpy as np from matplotlib import cm df = pd.DataFrame(np.random.randint(0,100,size=(100, 25)), columns=list('ABCDEFGHIJKLMNOPQRSTUVWXY')) df.set_index('A', inplace=True) # 获取列数并生成对应数量的颜色 num_categories = len(df.columns) # 指定colormap并设置生成颜色的数量 cmap = cm.get_cmap('viridis', num_categories) # 提取颜色列表 colors = [cmap(i) for i in range(num_categories)] # 绘图时传入color参数 df.plot(kind='bar', stacked=True, figsize=(20, 10), color=colors) plt.title("some_name") plt.savefig("some_name" + '.png') plt.show()
方法2:使用离散型colormap
如果需要更高区分度的离散颜色,可选择离散型colormap(如tab20c、gist_ncar等),这类colormap包含更多预设离散颜色:
import matplotlib.pyplot as plt import pandas as pd import numpy as np from matplotlib import cm df = pd.DataFrame(np.random.randint(0,100,size=(100, 25)), columns=list('ABCDEFGHIJKLMNOPQRSTUVWXY')) df.set_index('A', inplace=True) num_categories = len(df.columns) # 选择离散colormap并适配颜色数量 cmap = cm.get_cmap('tab20c', num_categories) colors = [cmap(i) for i in range(num_categories)] df.plot(kind='bar', stacked=True, figsize=(20, 10), color=colors) plt.title("some_name") plt.savefig("some_name" + '.png') plt.show()
说明
Pandas默认使用matplotlib的默认颜色循环(仅10种颜色),因此类别数量超过10时会重复颜色。通过上述方法从colormap生成足够数量的唯一颜色,即可解决该问题。你可根据需求选择不同的内置colormap。
内容的提问来源于stack exchange,提问作者Jürgen K.
相关产品推荐
相关产品推荐

