Я пытаюсь построить 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
, но данные не являются категориальными, и я хочу нарисовать линейные графики.
Как создать многосюжетную сетку 2x2 из линейных графиков, которая имеет маркеры, не имеет общей оси X и имеет легенду?