无法更改Seaborn.FacetGrid中的线型

时间:2019-01-06 12:22:51

标签: python plot seaborn

我正在尝试创建一个带有in this comment之类的实线和虚线的FacetGrid。根据注释中的代码和FacetGrid doc,这应该可以工作,但是,我只得到了实线,没有破折号。

有人可以帮我吗?

最低工作示例:

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')

Result

1 个答案:

答案 0 :(得分:2)

Seaborn lineplot覆盖线型,例如将其与其style参数一起使用。在这里,您似乎不想使用style。而且,似乎根本没有理由使用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')

enter image description here

为完整起见,这是将style的{​​{1}}参数与lineplot一起使用的方式。

FacetGrid

enter image description here

请注意,为了确保g = sns.FacetGrid(df, col='method', sharey='row', margin_titles=True) g.map_dataframe(sns.lineplot, 'x', 'y', style="mode", style_order=list("ABC")) 列中的项目到样式的一致映射,需要设置样式顺序。