根据带有 lineplot 的 seaborn FacetGrid 的列设置线宽

Mr *_*x U 0 python pandas seaborn

我想在 FacetGrid 中的每个线图中挑选出某一行,以突出显示与其他选项相比的“默认”设置。

我尝试根据seaborn文档中的随机游走示例制作一个最小的示例


import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

rs = np.random.RandomState(2020)
pos = rs.randint(-1, 2, (20, 5)).cumsum(axis=1)
pos -= pos[:, 0, np.newaxis]
step = np.tile(range(5), 20)
walk = np.repeat(range(20), 5)
df = pd.DataFrame(np.c_[pos.flat, step, walk],
                  columns=["position", "step", "walk"])
df["family"] = df["walk"] % 5
df["top"] = df.groupby("walk")["position"].transform("max")
df["importance"] = df["top"]+1
grid = sns.FacetGrid(df, col="family", col_wrap=3,  hue="walk")
grid.map_dataframe(sns.lineplot, "step", "position", marker="o")
grid.add_legend()
Run Code Online (Sandbox Code Playgroud)

这给了我多面线图,所有线的宽度相同(当然):

第一次尝试

我创建了一个额外的列,名为importance; 我想根据此列设置线宽。我可以看到,通过一个简单的操作,seaborn.lineplot您可以“分配size语义以使用数字变量映射线的宽度”。我尝试size=在 FacetGrid() 调用和调用中使用map_dataframe(),但它不起作用。

例如,如果我用这个代替:

grid = sns.FacetGrid(df, col="family", col_wrap=3,  hue="walk")
grid.map_dataframe(sns.lineplot, "step", "position",
                   size="importance", marker="o")
grid.add_legend()
Run Code Online (Sandbox Code Playgroud)

我看不出线条粗细有什么不同,但现在图例也混乱了:

第二次尝试

Diz*_*ahi 5

你的问题是importance在给定的水平上是相同的hue,并且sizes似乎在 的水平上标准化hue,所以它们最终都是相同的。但是,您可以传递映射字典来将给定与特定的sizes=匹配sizelinewidth

sizes = {a:a for a in df['importance'].unique()}
Run Code Online (Sandbox Code Playgroud)
{1: 1, 4: 4, 2: 2, 3: 3}
Run Code Online (Sandbox Code Playgroud)
{1: 1, 4: 4, 2: 2, 3: 3}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述