seaborn.lineplot带hue参数时返回的Line2D对象中后三个代表什么?
关于seaborn lineplot生成的额外Line2D对象的疑问
测试代码
import seaborn as sns import matplotlib.pyplot as plt import numpy as np import pandas as pd # 生成数据 rng = np.random.default_rng(12) x = np.linspace(0, np.pi, 50) y1, y2 = np.sin(x[:25]), np.cos(x[25:]) cat = rng.choice(["a", "b", "c"], 50) data = pd.DataFrame({"x": x , "y" : y1.tolist() + y2.tolist(), "cat": cat}) # 生成图像 fig, ax = plt.subplots(figsize=(8, 5), ncols=2) g0 = sns.lineplot(x="x", y="y", data=data, hue='cat', ls="--", ax=ax[0]) g1 = sns.lineplot(x="x", y="y", data=data, hue='cat', ls="--", ax=ax[1]) g1.get_lines()[0].set_color('black') print(ax[0].get_lines()) for line in ax[0].get_lines(): print(line.get_label()) plt.tight_layout() plt.show()
问题现象
执行代码后:
ax[0].get_lines()返回包含6个Line2D对象的列表,其中前三个是左子图中可见的彩色虚线(已通过修改右子图对应线条颜色验证);- 调用
[line.get_label() for line in ax[0].get_lines()]得到标签列表:['_child0', '_child1', '_child2', 'b', 'a', 'c']; - 对最后三个无
_child前缀的Line2D对象操作时出现异常:- 执行
ax[0].get_lines()[-1].set_lw(0.2),图中无任何可感知变化; - 执行
ax[0].get_lines()[-1].remove(),左子图的图例绿色线条并未被移除。
- 执行
解答
这三个带'b'/'a'/'c'标签的Line2D对象是seaborn为图例创建的代理艺术家(proxy artist),它们并非绘图区域中实际显示的线条,只是用来定义图例样式的“占位符”。
在你使用的seaborn v0.11.2结合matplotlib v3.5.1版本中,lineplot处理hue参数生成图例时,会额外生成这些代理对象。它们的可见性默认是False,不会被渲染到画布上,因此修改它们的属性(如线宽)或者移除它们,都不会影响主图中的实际线条,也无法直接修改图例——因为图例实际关联的是前三个带_child标签的真实线条。
你可以通过打印ax[0].get_lines()[-1].get_visible()来验证,结果会返回False,证明这些对象不会被绘制出来。
内容的提问来源于stack exchange,提问作者medium-dimensional
相关产品推荐
相关产品推荐

