如何枚举 margin_titles 并将其添加到 seaborn lmplot facetgrid 中的每个子图?

How can I enumerate and add margin_titles to each subplot in a seaborn lmplot facetgrid?

我有以下附件 lmplot facetgrid

首先,我想简化每个子图的标题,只有 corpus = {corpus name}。

我根据

使用 lmplot 生成这些图
g=sns.lmplot('x', 'y', data=test_plot, col='corpus', hue = 'monotonicity', row='measure', sharey=True, sharex=True, height=2.5,aspect=1.25, truncate=False, scatter_kws={"marker": "D", "s": 20})

g=(g.set_axis_labels("Max-Min (measure)", "Max-Min (comp measure)")
        .set(xlim=(0, 1), ylim=(-.1, 1))
        .fig.subplots_adjust(wspace=.02))

我想使用 facetgrid margin_title 选项将度量值放在右边 y-axis,但得到 lmplot() got an unexpected keyword argument 'margin_titles'

然后我尝试使用 facetgrid,按照:

p = sns.FacetGrid(data = test_plot,
                           col = 'corpus',
                           hue = 'monotonicity',
                           row = 'measure',
                           margin_titles=True)
    

p.map(sns.lmplot, 'diff_', 'score_diff',  data=test_plot, he='monotonicity', truncate=False, scatter_kws={"marker": "D", "s": 20})

但随后我收到有关 lmplot() got an unexpected keyword argument 'color' 的错误(无法弄清楚为什么会抛出该错误?)。

我的第二个问题是,我想在每个子图的标题中添加一个 letter/enumeration,如 (a), ..., (i) 中所示,但我一直不知道该怎么做。

由于您的自定义需求,请考虑在 运行 您的 lmplot 之后迭代 FacetGrid 的所有轴。关于您的具体错误,seaborn.lmplot 是一个 FacetGrid,因此如果嵌套在您第二次尝试时尝试的另一个 FacetGrid 中,将会发生冲突。此外,在下面的解决方案中,不要将 g 重新分配给 returns NoneType:

的轴设置
#... SAME lmplot ...

(
  g.set_axis_labels("Max-Min (measure)", "Max-Min (comp measure)")
   .set(xlim=(0, 1), ylim=(-.1, 1))
   .fig.subplots_adjust(wspace=.02)
)

alpha = list('abcdefghijklmnopqrstuvwxyz')
axes = g.axes.flatten()

# ADJUST ALL AXES TITLES
for ax, letter in zip(axes, alpha[:len(axes)]):
    ttl = ax.get_title().split("|")[1].strip()   # GET CURRENT TITLE
    ax.set_title(f"({letter}) {ttl}")            # SET NEW TITLE

# ADJUST SELECT AXES Y LABELS
for i, m in zip(range(0, len(axes), 3), test_plot["measure"].unique()):
    axes[i].set_ylabel(m)

输入 (纯随机数据演示)

import numpy as np
import pandas as pd

np.random.seed(1172021)

test_plot = pd.DataFrame({
    'measure': np.random.choice(["precision", "recall", "F1-score"], 500),
    'corpus': np.random.choice(["Fairview", "i2b2", "MiPACQ"], 500),
    'monotonicity': np.random.choice(["increasing", "non", "decreasing"], 500),
    'x': np.random.uniform(0, 1, 500),
    'y': np.random.uniform(0, 1, 500)
})

输出