Python 使用数据框更改打印网格中同一行的线样式
我想创造一个像这样的情节 其中,线样式在预定的x值之后改变。我使用Seaborn FaceGrid,并以整洁的格式输入熊猫数据帧 我的输入数据框如下所示:Python 使用数据框更改打印网格中同一行的线样式,python,pandas,seaborn,facet-grid,Python,Pandas,Seaborn,Facet Grid,我想创造一个像这样的情节 其中,线样式在预定的x值之后改变。我使用Seaborn FaceGrid,并以整洁的格式输入熊猫数据帧 我的输入数据框如下所示: >>> print(plot_df) dataset x y style dogs 1 2 solid dogs 2 3 solid dogs 3 1 solid dogs 5 6 dashed cats .... 我试着使用下面的hue_kws,但没有效果 styl
>>> print(plot_df)
dataset x y style
dogs 1 2 solid
dogs 2 3 solid
dogs 3 1 solid
dogs 5 6 dashed
cats ....
我试着使用下面的hue_kws
,但没有效果
style_list = plot_df[style].tolist()
g = sns.FacetGrid(plot_df, hue="dataset", hue_kws={"ls":style_list})
g.map(plt.plot, "x", "y").add_legend()
我怎样才能成功地做到这一点
编辑:谢谢你的建议,我还没有找到。但是,它没有回答我的问题,因为该问题依赖于使用hue
参数来更改线型。这不仅会导致线的虚线部分出现不同的颜色(我不希望出现这种情况),而且还会与我使用色调部分按数据集进行区分相冲突
注意:我也在使用Facetgrid的行和列功能,但为了简单起见,我排除了这些功能。我认为您的问题是,当您至少需要2个点来绘制直线时,您只有一个标记为“虚线”的点。 我建议如下:
cutoff_x = 3
d = '''
dataset x y
dogs 1 2
dogs 2 3
dogs 3 1
dogs 5 6'''
df1 = pd.read_csv(StringIO(d), sep='\\s+', header=0)
我认为你的问题在于,当你至少需要2个点来画一条线时,你只有一个标记为“虚线”的点。 我建议如下:
cutoff_x = 3
d = '''
dataset x y
dogs 1 2
dogs 2 3
dogs 3 1
dogs 5 6'''
df1 = pd.read_csv(StringIO(d), sep='\\s+', header=0)
虚线段需要一条单独的线。请参阅答案。虚线部分需要单独的一条线。见答案。
df2 = df1.loc[df1['x']>=cutoff_x].assign(style='dashed')
dataset x y style
2 dogs 3 1 dashed
3 dogs 5 6 dashed
df = df1.drop(df1.loc[df1['x']>cutoff_x].index).assign(style='solid').append(df2, ignore_index=True)
dataset x y style
0 dogs 1 2 solid
1 dogs 2 3 solid
2 dogs 3 1 solid
3 dogs 3 1 dashed
4 dogs 5 6 dashed
g = sns.FacetGrid(df, hue="dataset")
g.map_dataframe(sns.lineplot, "x", "y", style="style")