我正在尝试构建一个既包含标记又包含图例的线图的2x2多图网格。我的第一次尝试使用FacetGrid
和sns.lineplot
。由于多图网格的第二行的x值范围略有不同,因此我也不需要共享的x轴。
样本数据:
def gen_data(xvalues):
return pd.DataFrame(dict(xvalues=xvalues*3,
datacategory=[1]*30+[2]*30+[3]*30,
yvalues=np.random.randn(90).cumsum()))
row1 = pd.concat([gen_data(list(range(30))), gen_data(list(range(30)))], keys=["col1","col2"], names=["mycol"])
row2 = pd.concat([gen_data(list(range(1,60,2))), gen_data(list(range(1,60,2)))], keys=["col1","col2"], names=["mycol"])
selected_df = pd.concat([row1, row2], keys=["row1", "row2"], names=["myrow"])
selected_df = selected_df.reset_index()
绘图代码
g = sns.FacetGrid(selected_df, col="mycol", row="myrow", hue="datacategory",
margin_titles=True, sharex=False)
g = g.map_dataframe(sns.lineplot, x="xvalues", y="yvalues",
style="datacategory", markers=True, dashes=False, ci="sd")
g.add_legend()
生成的情节:
这给了我一个带有标记的2x2多图网格,但是图例的颜色都是黑色。删除style="datacategory"
可以校正图例中的颜色,但可以删除标记。
我再次尝试relplot
,但发现它不支持禁用sharex
。
g = sns.relplot("xvalues", "yvalues", data=selected_df,
col="mycol", row="myrow",
kind="line", hue="datacategory", style="datacategory",
ci="sd", markers=True, dashes=False)
生成的情节:
(我不确定数据类别0是什么,但我的真实数据不是问题)
除了没有共享的x轴外,它与我想要的非常接近,并且还有更多:它也为不同的数据类别提供了不同的标记(很好!)。
我考虑过catplot
,但是数据不是分类的,我希望绘制线图。
如何制作具有标记,不共享x轴且具有图例的线图的2x2多图网格?