带有标记和适当图例的多图网格

时间:2018-10-31 15:14:01

标签: python pandas matplotlib seaborn

我正在尝试构建一个既包含标记又包含图例的线图的2x2多图网格。我的第一次尝试使用FacetGridsns.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()

生成的情节:

Generated plot

这给了我一个带有标记的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)

生成的情节:

Generated plot(我不确定数据类别0是什么,但我的真实数据不是问题)

除了没有共享的x轴外,它与我想要的非常接近,并且还有更多:它也为不同的数据类别提供了不同的标记(很好!)。

我考虑过catplot,但是数据不是分类的,我希望绘制线图。

如何制作具有标记,不共享x轴且具有图例的线图的2x2多图网格?

0 个答案:

没有答案