Маркеры точек и линии в разных оттенках, но в одном стиле с морской волной - PullRequest
0 голосов
/ 18 сентября 2018

Учитывая приведенный ниже кадр данных:

import pandas as pd
df = pd.DataFrame({
    "n_index": list(range(5)) * 2,
    "logic": [True] * 5 + [False] * 5,
    "value": list(range(5)) + list(range(5, 10))
})

Я бы хотел использовать цвет и только цвет , чтобы различать logic на линейном графике и отмечать точки на value s.В частности, это мой желаемый вывод (график R ggplot2 ):

ggplot(aes(x = n_index, y = value, color = logic), data = df) + geom_line() + geom_point()

desired output

Я пытался сделать то же самоевещь с seaborn.lineplot, и я указал markers=True, но маркера не было:

import seaborn as sns
sns.set()
sns.lineplot(x="n_index", y="value", hue="logic", markers=True, data=df)

sns no markers

I тогдапопытался добавить style="logic" в код, теперь маркеры появились:

sns.lineplot(x="n_index", y="value", hue="logic", style="logic", markers=True, data=df)

sns with markers 1

Также я попытался заставить маркеры быть в том жестиль:

sns.lineplot(x="n_index", y="value", hue="logic", style="logic", markers=["o", "o"], data=df)

sns with markers 2

Похоже, мне нужно указать style, чтобы получить маркеры.Однако это вызывает нежелательный вывод графика, поскольку я не хочу использовать два эстетических измерения в одном измерении данных.Это нарушает принципы эстетического картирования.

Можно ли как-нибудь иметь линии и точки в одном стиле, но в разных цветах с seaborn или визуализацией Python?(seaborn предпочтительнее - мне не нравится циклический способ matplotlib.)

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Вы можете напрямую использовать панд для построения.

Панды через группу

fig, ax = plt.subplots()
df.groupby("logic").plot(x="n_index", y="value", marker="o", ax=ax)
ax.legend(["False","True"])

enter image description here

Недостатком здесь является то, что легенда должна быть создана вручную.

Панды через пивот

df.pivot_table("value", "n_index", "logic").plot(marker="o")

enter image description here

участок морской линии

Для линии морского побережья кажется, что для получения желаемого результата достаточно одного маркера.

sns.lineplot(x="n_index", y="value", hue="logic", data=df, marker="o")

enter image description here

0 голосов
/ 18 сентября 2018

Необходимо установить для параметра dashes значение False, а для стиля сетки задать значение "darkgrid":

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

df = pd.DataFrame({
    "n_index": list(range(5)) * 2,
    "logic": [True] * 5 + [False] * 5,
    "value": list(range(5)) + list(range(5, 10))
})

sns.set_style("darkgrid")
sns.lineplot(x="n_index", dashes=False, y="value", hue="logic", style="logic", markers=["o", "o"], data=df)
plt.show()

enter image description here

...