Matplotlib绘制numpy数组折线图如何为各线条指定自定义颜色
问题描述
现有2D numpy数组y_array包含3列待绘制数据,所有列共用的x轴值存储在列表x_list中。直接调用matplotlib.pyplot.plot(x_list, y_array)可正常将数组每一列绘制为独立折线,但自定义线条颜色时出现异常:
- 向
label关键字参数传入标签列表可正常生效,自动为每条折线匹配对应标签 - 向
color关键字参数传入自定义颜色列表时,程序抛出ValueError - 尝试过基于选定颜色创建自定义colormap,但不清楚绘图时如何调用该自定义色图
需求为不通过for循环遍历数组列的前提下,为一次性绘制出的多条折线分别指定独立自定义颜色。
最小复现代码
import matplotlib.pyplot as plt import numpy as np if __name__ == '__main__': x_list = np.linspace(0, 9, 10) y1 = np.random.uniform(10, 19, 10) y2 = np.random.uniform(20, 29, 10) y3 = np.random.uniform(30, 39, 10) y_array = np.column_stack([y1, y2, y3]) labels = ['A', 'B', 'C'] # plt.plot(x_list, y_array, label=labels) # 该写法可正常运行 my_colors = ['steelblue', 'seagreen', 'firebrick'] plt.plot(x_list, y_array, label=labels, color=my_colors) # 抛出ValueError plt.legend() plt.show()
报错原因
plt.plot()的color参数设计上仅接受单个合法颜色值,不支持直接传入颜色列表为多组折线分配颜色;而label参数从Matplotlib 3.3版本开始支持传入可迭代对象,自动为批量绘制的多条线匹配标签,两个参数的逻辑不一致才导致了“传label列表正常、传color列表报错”的差异。
无循环解决方案
通过Matplotlib的属性循环器(prop_cycle)提前配置绘图时的颜色序列,后续一次性调用plot绘制多列数据时,会自动按顺序从预设序列中取色,无需手动遍历列:
import matplotlib.pyplot as plt import numpy as np if __name__ == '__main__': x_list = np.linspace(0, 9, 10) y1 = np.random.uniform(10, 19, 10) y2 = np.random.uniform(20, 29, 10) y3 = np.random.uniform(30, 39, 10) y_array = np.column_stack([y1, y2, y3]) labels = ['A', 'B', 'C'] my_colors = ['steelblue', 'seagreen', 'firebrick'] # 提前设置颜色循环规则 plt.rcParams['axes.prop_cycle'] = plt.cycler(color=my_colors) # 一次性绘图即可自动匹配对应颜色、标签 plt.plot(x_list, y_array, label=labels) plt.legend() plt.show()
如果需要使用自定义colormap实现取色,可先从自定义colormap中提取对应线条数量的颜色值,再传入属性循环器即可:
from matplotlib.colors import ListedColormap # 基于目标颜色创建自定义离散colormap custom_cmap = ListedColormap(my_colors) # 按线条数量从colormap中均匀取色 line_colors = custom_cmap(np.linspace(0, 1, y_array.shape[1])) # 写入属性循环规则 plt.rcParams['axes.prop_cycle'] = plt.cycler(color=line_colors)
内容的提问来源于stack exchange,提问作者chrizz
相关产品推荐
相关产品推荐

