如何在Matplotlib的单个Axes中为每个小提琴图设置不同中位数线颜色?
为小提琴图的每条中位数线设置不同颜色
原始代码
fig, ax = plt.subplots() parts = ax.violinplot([df1_1['Height'], df1_2['Height'], df1_3['Height']], showmedians=True, vert=False, points=1000, widths=1, showextrema=False) ax.set_title('Height Distributions (2000 - 2016 Olympics)') ax.set_yticks([1, 2, 3]) ax.set_yticklabels(['Gymnastics', 'Cycling', 'Basketball']) parts['bodies'][0].set_color('purple') parts['bodies'][1].set_color('green') parts['bodies'][2].set_color('blue') parts['bodies'][0].set_linewidth(1.25) parts['bodies'][1].set_linewidth(1.25) parts['bodies'][2].set_linewidth(1.25) # set the medians color for each violin parts['cmedians'].set_color('blue') parts['cmedians'].set_linewidth(1.25) plt.show()
问题描述
当前输出的所有中位数线均为蓝色,希望为每个小提琴图的中位数线设置不同颜色,但无法通过parts['cmedians'][0]这类索引方式单独访问每条中位数线,该如何实现?
解决方案
方法1:使用set_colors()快速设置
parts['cmedians']是一个单个Line2D对象,而非可索引的列表,它包含了所有小提琴图的中位数线段。直接调用set_colors()方法并传入颜色列表,列表颜色顺序与小提琴图的顺序一一对应:
# 替换原中位数颜色设置代码 parts['cmedians'].set_colors(['purple', 'green', 'blue']) parts['cmedians'].set_linewidth(1.25)
这样就能让三个小提琴图的中位数线分别匹配各自琴身的颜色。
方法2:重新绘制中位数线(精细控制)
如果需要对单条中位数线做特殊样式调整(比如不同线宽、线型),可以先提取原中位数的坐标数据,再逐个重新绘制:
# 获取原中位数的坐标数据 median_x = parts['cmedians'].get_xdata() median_y = parts['cmedians'].get_ydata() # 定义每个中位数对应的颜色 colors = ['purple', 'green', 'blue'] # 逐个绘制中位数线 for i in range(3): # 拆分出第i个中位数的两个端点坐标 seg_x = median_x[i*2 : (i+1)*2] seg_y = median_y[i*2 : (i+1)*2] # 绘制自定义样式的中位数线 ax.plot(seg_x, seg_y, color=colors[i], linewidth=1.25) # 隐藏原有的中位数线 parts['cmedians'].set_visible(False)
内容的提问来源于stack exchange,提问作者Jee Bluetru
相关产品推荐
相关产品推荐

