用不同的颜色绘制点标记和线条,但与Seaborn的样式相同

ytu*_*ytu 9 python data-visualization aesthetics seaborn

给定以下数据框:

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))
})
Run Code Online (Sandbox Code Playgroud)

我想只用颜色来区分logic线条图中的颜色,并在values 上标记点。具体来说,这是我想要的输出(由R ggplot2绘制):

ggplot(aes(x = n_index, y = value, color = logic), data = df) + geom_line() + geom_point()
Run Code Online (Sandbox Code Playgroud)

期望的输出

我尝试使用做相同的事情seaborn.lineplot,并且指定了markers=True但没有标记:

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

sns无标记

然后,我尝试添加style="logic"代码,现在标记出现了:

sns.lineplot(x="n_index", y="value", hue="logic", style="logic", markers=True, data=df)
Run Code Online (Sandbox Code Playgroud)

带有标记的sns 1

我也尝试将标记设置为相同样式:

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

带有标记的sns 2

看来我必须先指定style才能拥有标记。但是,由于我不想在一个数据维度上使用两个美学维度,因此会导致不希望的绘图输出。这违反了美学映射的原理。

是否可以通过seabornPython可视化使线条和点全部具有相同的样式,但是具有不同的颜色?(seaborn首选-我不喜欢的循环方式matplotlib。)

Imp*_*est 23

您可以直接使用 Pandas 进行绘图。

熊猫通过 groupby

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

在此处输入图片说明

这里的缺点是需要手动创建图例。

大熊猫通过枢轴

df.pivot_table("value", "n_index", "logic").plot(marker="o")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

seaborn 线图

对于seaborn lineplot,似乎一个标记就足以获得所需的结果。

sns.lineplot(x="n_index", y="value", hue="logic", data=df, marker="o")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 请注意,我没有使用 `markers`,而是使用 `marker`,它是一个 matplotlib 参数,它只是传递给 matplotlib 的 `plot` 函数。所以文档没有错,是吗?但是您的用例可能被视为缺失的功能。此外,图例忽略了绘制的实际艺术家的事实也可能被视为错误。 (2认同)

Ama*_*mar 7

看到的问题是人们在“标记”和“标记”之间感到困惑。要启用 'marker' 设置 'marker='o'' 不是标记。

sns.lineplot(x=range(1,100),y=err,marker='o')

Run Code Online (Sandbox Code Playgroud)

  • 接受的答案没有给出问题的问题所在。它没有解释用户在该方法中哪里出了问题,从而造成了混乱,可能导致用户接受答案并直接使用它,而无需尝试找出他/她的代码中的问题。 (2认同)

Dan*_*ejo 5

您需要设置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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述