同一画布多小提琴图:无法迭代cbars、cmins修改颜色
解决Matplotlib小提琴图cbars、cmins、cmaxes颜色单独设置问题
问题背景
在为同一画布内的多个小提琴图分别设置颜色时,仅能成功修改bodies(图的主体部分)的颜色,修改cbars(均值线)、cmins(最小值线)、cmaxes(最大值线)时触发TypeError: 'LineCollection' object is not iterable报错,原因是这三个对象并非可迭代的元素列表,而是单个LineCollection实例。
解决方案代码
import matplotlib.pyplot as plt mock_data= [ [0,1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9,10], [2,3,4,5,6,7,8,9,10,11], [3,4,5,6,7,8,9,10,11,12], [4,5,6,7,8,9,10,11,12,13], [5,6,7,8,9,10,11,12,13,14], [6,7,8,9,10,11,12,13,14,15], [7,8,9,10,11,12,13,14,15,16], [8,9,10,11,12,13,14,15,16,17], [9,10,11,12,13,14,15,16,17,18], ] pos = [0,1,2,3,4,5,6,7,8,9] colors = ["C0","C1","C2","C3","C4","C5","C6","C7","C8","C9"] fig, ax = plt.subplots(1,1) violin = ax.violinplot(mock_data,positions=pos) # 处理小提琴图主体颜色 for vp, co in zip(violin["bodies"], colors): vp.set_facecolor(co) vp.set_edgecolor(co) # 处理均值、最小、最大值线条颜色 for key in ["cbars", "cmins", "cmaxes"]: violin[key].set_color(colors) plt.show()
关键说明
violin["bodies"]是由多个PolyCollection对象组成的列表,对应每个小提琴图的主体,因此可以直接遍历并逐个设置颜色。cbars、cmins、cmaxes均为单个LineCollection对象,包含所有小提琴图的对应线条。调用set_color()并传入颜色列表时,Matplotlib会自动将列表中的颜色按顺序匹配到每个位置的线条上,实现逐个设置颜色的效果。
内容的提问来源于stack exchange,提问作者Redshoe
相关产品推荐
相关产品推荐

