如何修改Matplotlib的默认colormap?两种尝试方法未生效
解决Matplotlib柱状图默认配色修改问题
Matplotlib默认采用tab10配色方案,我希望将默认配色改为Set3这类方案,但尝试了plt.rcParams['image.cmap'] = 'Set3'和plt.set_cmap('Set3')两种方法均未生效,原代码及运行效果如下:
原代码
import matplotlib.pyplot as plt import numpy as np plt.rcParams['image.cmap']='Set3' plt.set_cmap('Set3') species = ('Adelie', 'Chinstrap', 'Gentoo') sex_counts = { 'Male': np.array([73, 34, 61]), 'Female': np.array([73, 34, 58]), } width = 0.6 # 柱子宽度 fig, ax = plt.subplots() bottom = np.zeros(3) for sex, sex_count in sex_counts.items(): p = ax.bar(species, sex_count, width, label=sex, bottom=bottom) bottom += sex_count ax.bar_label(p, label_type='center') ax.set_title('按性别统计企鹅数量') ax.legend() plt.show()
问题原因
image.cmap和set_cmap()是针对图像类绘图(如imshow)的配色设置,而柱状图、折线图这类元素的默认颜色循环,由axes.prop_cycle参数控制,因此之前的设置无法影响柱状图颜色。
解决方案
方法1:修改全局默认颜色循环
通过plt.rcParams['axes.prop_cycle']指定Set3配色的颜色循环:
import matplotlib.pyplot as plt import numpy as np # 获取Set3的颜色列表,生成全局颜色循环 set3_cmap = plt.get_cmap('Set3') plt.rcParams['axes.prop_cycle'] = plt.cycler(color=set3_cmap.colors) species = ('Adelie', 'Chinstrap', 'Gentoo') sex_counts = { 'Male': np.array([73, 34, 61]), 'Female': np.array([73, 34, 58]), } width = 0.6 fig, ax = plt.subplots() bottom = np.zeros(3) for sex, sex_count in sex_counts.items(): p = ax.bar(species, sex_count, width, label=sex, bottom=bottom) bottom += sex_count ax.bar_label(p, label_type='center') ax.set_title('按性别统计企鹅数量') ax.legend() plt.show()
方法2:手动给柱状图指定颜色
若不想修改全局设置,可直接在bar函数中指定color参数,从Set3配色中选取对应颜色:
import matplotlib.pyplot as plt import numpy as np species = ('Adelie', 'Chinstrap', 'Gentoo') sex_counts = { 'Male': np.array([73, 34, 61]), 'Female': np.array([73, 34, 58]), } width = 0.6 set3_cmap = plt.get_cmap('Set3') # 从Set3中取对应数量的颜色,匹配性别分类 colors = [set3_cmap(i) for i in range(len(sex_counts))] fig, ax = plt.subplots() bottom = np.zeros(3) for (sex, sex_count), color in zip(sex_counts.items(), colors): p = ax.bar(species, sex_count, width, label=sex, bottom=bottom, color=color) bottom += sex_count ax.bar_label(p, label_type='center') ax.set_title('按性别统计企鹅数量') ax.legend() plt.show()
以上两种方法均可让柱状图应用Set3配色方案。
内容的提问来源于stack exchange,提问作者Stücke
相关产品推荐
相关产品推荐

