Python 无法更改Seaborn.FacetGrid中的线型
我正在尝试创建一个FaceGrid,其中包含完整的虚线,如。根据注释中的代码和注释,这应该可以工作,但是,我只得到完整的行,没有破折号 有人能帮我吗 最小工作示例:Python 无法更改Seaborn.FacetGrid中的线型,python,plot,seaborn,Python,Plot,Seaborn,我正在尝试创建一个FaceGrid,其中包含完整的虚线,如。根据注释中的代码和注释,这应该可以工作,但是,我只得到完整的行,没有破折号 有人能帮我吗 最小工作示例: import matplotlib import pandas as pd import seaborn as sns # toy data x = [i for i in range(10)]*3 y = [0.5*i for i in range(10)] y.extend([0.7*i for i in range(10)]
import matplotlib
import pandas as pd
import seaborn as sns
# toy data
x = [i for i in range(10)]*3
y = [0.5*i for i in range(10)]
y.extend([0.7*i for i in range(10)])
y.extend([0.3*i for i in range(10)])
mode = ["A" for i in range(10)]
mode.extend(["B" for i in range(10)])
mode.extend(["C" for i in range(10)])
method = ["X" for i in range(5)]
method.extend(["Y" for i in range(5)])
method = method*3
df = pd.DataFrame({'x' : x, 'y' : y, 'mode' : mode, 'method' : method})
sns.set_context("paper")
sns.set(style="whitegrid")
blue = matplotlib.colors.hex2color('#5862f4')
pink = matplotlib.colors.hex2color('#e059c3')
kw = {'color': [pink, pink, blue], 'linestyle' : ["-","--","-"]}
p = sns.FacetGrid(df, col='method', hue='mode', sharey='row', margin_titles=True, hue_kws=kw)
p.map(sns.lineplot, 'x', 'y')
p.axes[0,0].set_xlim(0,10)
p.add_legend()
plt.savefig("test.png", bbox_inches='tight')
Seaborn
lineplot
覆盖线条样式,以便将其与样式
参数一起使用。在这里,您似乎不想使用样式
。但是,似乎根本没有理由使用lineplot
。因此,正常的plt.plot()
将正常工作
kw = {'color': [pink, pink, blue], 'linestyle' : ["-","--","-"]}
g = sns.FacetGrid(df, col='method', hue='mode', sharey='row', margin_titles=True, hue_kws=kw)
g.map(plt.plot, 'x', 'y')
为了完整起见,下面是如何将style
参数用于lineplot
和FacetGrid
g = sns.FacetGrid(df, col='method', sharey='row', margin_titles=True)
g.map_dataframe(sns.lineplot, 'x', 'y', style="mode", style_order=list("ABC"))
请注意,为了保证
“mode”
列的项目与样式的一致映射,需要设置样式顺序。非常感谢!我认为您的第二个版本更适合,但我需要为线条指定不同的颜色,并希望控制哪种模式具有哪种线条样式和颜色。这可能吗?问题的答案是第一部分。在这里不使用建议的解决方案的具体原因是什么?第二部分只是说明了原则。如果第二部分太混乱的话,我可能会删除它。问题是,由于多次观测,每个(x,y)坐标的每个模式都有几个数据点。plt.plot()只为每个观察值绘制一条直线,而sns.lineplot()绘制一个置信区间(参见第一个示例)。我想要置信区间,所以我需要使用sns.lineplot。好的,我找到了一个有效的解决方案。也许你可以把它添加到你的答案中,然后我会接受它:我拒绝了编辑,因为我目前不确定破折号
是否介意给定的样式顺序。此外,没有定义hue\u顺序
。如果您验证了它对所有情况都有效(需要使用加扰数据帧),您可以提供自己的答案。