22

给定以下数据框:

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,并在 s 上标记点value。具体来说,这是我想要的输出(由 R ggplot2绘制):

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

期望的输出

我试图用 做同样的事情seaborn.lineplot,我指定markers=True但没有标记:

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

sns没有标记

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

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

带标记的 sns 1

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

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

带标记的 sns 2

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

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

4

4 回答 4

27

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

大熊猫通过 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 线图

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

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

在此处输入图像描述

于 2018-09-18T11:44:23.653 回答
11

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

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

于 2020-08-08T15:54:24.133 回答
3

您需要设置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()

在此处输入图像描述

于 2018-09-18T11:32:38.520 回答
1

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

sns.lineplot(x="n_index", y="value", hue="logic", marker="o", data=df)
于 2020-04-10T23:40:08.523 回答