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

如何自定义Matplotlib图例的句柄与标签?Surpyval绘图适配问题

解决Surpyval绘图图例匹配问题

方法1:捕获绘图句柄,手动指定图例配对

Surpyval的plot()方法会返回本次绘图生成的所有Matplotlib Artist对象(如线条、散点等),我们可以捕获这些返回值,按需挑选句柄与对应标签匹配:

import surpyval as surv 
import matplotlib.pyplot as plt 
import numpy as np  # 补充缺失的numpy导入

y_a = np.array([181, 183, 190,190, 195, 195, 198, 198, 198, 201,202, 202, 202, 
       204, 205, 205, 206,206, 206, 206,207, 209 , 213, 214, 218, 219])

y_s = np.array([161, 179, 196,196, 197, 198, 204, 205, 209, 211,215, 218, 227, 
       230, 231, 232, 232 ,236, 237, 237,240, 243, 244, 246, 252, 255])

model_1 = surv.Weibull.fit(y_a)
model_2 = surv.Weibull.fit(y_s)

ax = plt.gca()

# 捕获每个模型绘图返回的句柄列表
handles_a = model_1.plot(ax=ax)
handles_s = model_2.plot(ax=ax)

# 定义对应标签,按绘图返回的句柄顺序匹配
labels_a = ['A', 'a_u_CI','a_l_CI', 'a_fit']
labels_s = ['S', 's_u_CI','s_l_CI', 's_fit']

# 合并句柄和标签生成完整图例
all_handles = handles_a + handles_s
all_labels = labels_a + labels_s
ax.legend(all_handles, all_labels)

plt.show()

如果仅需显示两个模型的主拟合线,可筛选每个模型返回句柄的第一个元素:

# 仅保留主拟合线的句柄与标签
selected_handles = [handles_a[0], handles_s[0]]
selected_labels = ['A', 'S']
ax.legend(selected_handles, selected_labels)

方法2:修改绘图元素的label属性

若不想捕获返回值,可在绘图后遍历Axes内的线条,手动设置label后调用图例:

ax = plt.gca()
model_1.plot(ax=ax)
model_2.plot(ax=ax)

# 获取Axes中所有线条对象
lines = ax.get_lines()

# 按绘图顺序对应设置标签
labels = ['A', 'a_u_CI','a_l_CI', 'a_fit', 'S', 's_u_CI','s_l_CI', 's_fit']
for line, label in zip(lines, labels):
    line.set_label(label)

ax.legend()
plt.show()

注意:此方法依赖绘图元素的生成顺序,需确保线条顺序与预期的模型绘图顺序一致。

内容的提问来源于stack exchange,提问作者A.E

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:35:23