Python 以不同的色调绘制点标记和线,但与seaborn的样式相同

Python 以不同的色调绘制点标记和线,但与seaborn的样式相同,python,data-visualization,seaborn,aesthetics,Python,Data Visualization,Seaborn,Aesthetics,鉴于以下数据框架: 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)) }) 我想使用颜色和唯一的颜色来区分线图中的逻辑,并在值s上标记点。具体来说,这是我想要的输出(由R绘制): 我尝试对做同样的事情,我指定了marke

鉴于以下数据框架:

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))
})
我想使用颜色和唯一的颜色来区分线图中的
逻辑
,并在
s上标记点。具体来说,这是我想要的输出(由R绘制):

我尝试对做同样的事情,我指定了
markers=True
,但没有标记:

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

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

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

此外,我还尝试强制标记采用相同的样式:

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

似乎我必须先指定
样式
,然后才能使用标记。但是,这会导致不需要的绘图输出,因为我不想在一个数据维度上使用两个美学维度。这违反了美学制图的原则


有没有什么方法可以让线和点在
seaborn
或Python可视化中使用相同的样式,但颜色不同?(
seaborn
是首选-我不喜欢
matplotlib
的循环方式)

您需要将
破折号
参数设置为
False
并将网格样式指定为
暗格网格“


您可以直接使用熊猫进行绘图

熊猫通过groupby

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

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

通过枢轴连接

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

seaborn线形图

df.pivot_table("value", "n_index", "logic").plot(marker="o")
对于seaborn测线图,似乎一个标记就足以获得所需的结果

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

您可以在sns.linePlot中设置marker='o',以适当的颜色将标记绘制为所有不同颜色的圆形

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

问题是人们把“标记”和“标记”搞混了。要启用“marker”,请将“marker='o'设置为not markers

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


由于在seaborn中这样做显然不那么直接有趣,所以在SoupMoting中,灰色背景网格/帧消失了。根据seaborn.lineplot文档,
标记应为布尔值、列表或字典,设置为True将使用默认标记。这可能是一个需要报告的bug吗?请注意,我使用的不是
标记
,而是
标记
,它是一个matplotlib参数,只需传递给matplotlib的
plot
函数。那么文档没有错,是吗?但是您的用例可能被认为是缺少的特性。另外,图例忽略了实际绘制的艺术家这一事实可能被认为是一个缺陷。我认为这是公认的答案中使用的。这是评论吗?一旦你有足够的声誉,你就可以发表评论。否则,请解释这与公认的答案有什么不同?公认的答案不会给出问题的症结所在。它没有解释用户在方法上哪里出了问题,从而产生了一种混乱,可能导致用户接受答案并直接使用它,而从来没有试图找出他/她的代码中的问题。
sns.lineplot(x=range(1,100),y=err,marker='o')