Given the data frame below:
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)) }) I'd like to use color and only color to distinguish logic in a line plot, and mark points on values. Specifically, this is my desired output (plotted by R ggplot2):
ggplot(aes(x = n_index, y = value, color = logic), data = df) + geom_line() + geom_point() I tried to do the same thing with seaborn.lineplot, and I specified markers=True but there was no marker:
import seaborn as sns sns.set() sns.lineplot(x="n_index", y="value", hue="logic", markers=True, data=df) I then tried adding style="logic" in the code, now the markers showed up:
sns.lineplot(x="n_index", y="value", hue="logic",, markers=True, data=df) Also I tried forcing the markers to be in the same style:
sns.lineplot(x="n_index", y="value", hue="logic",, markers=["o", "o"], data=df) It seems like that I have to specify style before I can have markers. However, that causes undesired plot output since I don't want to use two aesthetic dimensions on one data dimension. That violates the principles of aesthetic mapping.
Is there any way I can have the lines and points all in the same style but in different colors with seaborn or Python visualization? (seaborn is preferred - I don't like the looping way ofmatplotlib.)
4 Answers
You can directly use pandas for plotting.
pandas via groupby
fig, ax = plt.subplots() df.groupby("logic").plot(x="n_index", y="value", marker="o", ax=ax) ax.legend(["False","True"]) The drawback here would be that the legend needs to be created manually.
pandas via pivot
df.pivot_table("value", "n_index", "logic").plot(marker="o") seaborn lineplot
For seaborn lineplot it seems a single marker is enough to get the desired result.
sns.lineplot(x="n_index", y="value", hue="logic", data=df, marker="o") 2See the problem is that people are getting confused between 'markers' and 'marker'. To enable 'marker' set 'marker='o'' not markers.
sns.lineplot(x=range(1,100),y=err,marker='o') 2You need to set dashes parameter to False also specify the style of the grid to "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",, markers=["o", "o"], data=df) plt.show() 1You can set marker='o' in sns.linePlot to draw the marker as a circle for all the different hues, in the appropriate color.
sns.lineplot(x="n_index", y="value", hue="logic", marker="o", data=df) 



