You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:39:22