如何枚举 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)
})
输出
我有以下附件 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)
})
输出