以不同的色调绘制点标记和线,但与 seaborn 的样式相同
Plot point markers and lines in different hues but the same style with 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))
})
我想使用 颜色并且只使用颜色 来区分线图中的 logic
,并在 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)
然后我尝试在代码中添加 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)
看来我必须指定 style
才能有标记。但是,这会导致不希望的绘图输出,因为我不想在一个数据维度上使用两个美学维度。这违反了美学映射的原则。
有什么方法可以让线条和点都具有相同的样式但颜色不同,并且具有 seaborn
或 Python 可视化效果? (首选 seaborn
- 我不喜欢 matplotlib
的循环方式。)
您需要将 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()
可以直接用pandas作图
pandas 通过 groupby
fig, ax = plt.subplots()
df.groupby("logic").plot(x="n_index", y="value", marker="o", ax=ax)
ax.legend(["False","True"])
这里的缺点是需要手动创建图例。
pandas 通过数据透视
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")
您可以在 sns.linePlot 中设置 marker='o' 以将标记绘制为所有不同色调的圆圈,并使用适当的颜色。
sns.lineplot(x="n_index", y="value", hue="logic", marker="o", data=df)
看到问题是人们对 'markers' 和 'marker' 感到困惑。要启用 'marker' 设置 'marker='o'' 而不是 markers.
sns.lineplot(x=range(1,100),y=err,marker='o')
给定以下数据框:
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
上标记点。具体来说,这是我想要的输出(由 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)
然后我尝试在代码中添加 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)
看来我必须指定 style
才能有标记。但是,这会导致不希望的绘图输出,因为我不想在一个数据维度上使用两个美学维度。这违反了美学映射的原则。
有什么方法可以让线条和点都具有相同的样式但颜色不同,并且具有 seaborn
或 Python 可视化效果? (首选 seaborn
- 我不喜欢 matplotlib
的循环方式。)
您需要将 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()
可以直接用pandas作图
pandas 通过 groupby
fig, ax = plt.subplots()
df.groupby("logic").plot(x="n_index", y="value", marker="o", ax=ax)
ax.legend(["False","True"])
这里的缺点是需要手动创建图例。
pandas 通过数据透视
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")
您可以在 sns.linePlot 中设置 marker='o' 以将标记绘制为所有不同色调的圆圈,并使用适当的颜色。
sns.lineplot(x="n_index", y="value", hue="logic", marker="o", data=df)
看到问题是人们对 'markers' 和 'marker' 感到困惑。要启用 'marker' 设置 'marker='o'' 而不是 markers.
sns.lineplot(x=range(1,100),y=err,marker='o')