很多人诟病matplotlib
配色老套,那matplotlib
默认的配色方案是什么?为什么没有设置颜色,图表数据系列显示的还有颜色?这也可能是最容易忽视的地方!
默认色彩循环
《matplotlib色彩(colors)之色彩基础知识》提到,默认色彩循环,Cn彩色定义
:由字符串C和1个非负整数构成
,数字为默认色彩循环rcParams["axes.prop_cycle"]
的索引,
rcParams["axes.prop_cycle"] (default: cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf']))
,数字超过9,对应的颜色索引为数字个位数索引,例如C101
和C1
的取值相同。注意C
必须为大写。
matplotlib
大部分绘图函数、方法的颜色属性默认指向默认色彩循环,不同数据系列有不同颜色,超过10个数据系列,颜色则在这个10种颜色中循环使用。我们常常绘制的图表只有一个数据系列,因此,图表中的数据系列往往是蓝色。
下面以plot
方法为例做几个实验来进行验证:
实验1
绘制了一条直线,根据直线的属性可知线条颜色为#1f77b4
。
import matplotlib.pyplot as plt
line = plt.plot([1, 1])
c = line[0].get_color()
plt.annotate(c, (0, 1))
plt.show()
实验2
绘制了20条直线,输出了直线的颜色,根据输出可知:前10条直线和后面10条直线的颜色是循环重复的。
import matplotlib.pyplot as plt
for i in range(20):
line = plt.plot([i, i])
c = line[0].get_color()
plt.annotate(repr(i) + ":"+c, (0, i+0.1))
plt.show()
实验3
输出TABLEAU_COLORS
可知,其颜色的取值与rcParams["axes.prop_cycle"]
、上面实验中线条的默认颜色是一一致的。
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
tab10 = mcolors.TABLEAU_COLORS
for i,j in enumerate(tab10):
plt.plot([i, i], c=j)
plt.annotate(j+":"+tab10[j], (0, i+0.1))
plt.show()