在多元回归图中使用更改每个回归线样式 Python

Change each regression line styling using in a multiple regressions plot Python

我目前正尝试为我的数据绘制两条回归线,按分类属性(自由或幸福分数)划分。我目前的疑虑是我需要颜色来编码图表中的另一个单独的分类属性(GNI/capita 括号)。混合颜色看起来很混乱,所以我决定使用不同的标记来区分数据点。但是,我无法将其中一条回归线更改为虚线,因为它们是相同的。我什至不想去想我将如何为这一切创造一个传奇。如果您认为这是一个丑陋的图表,我同意,但某些情况要求我在单个图表中编码四个属性。顺便说一下,如果有任何建议,请接受任何关于更好的方法的建议。下面是我当前图表的示例,非常感谢您的帮助!

sns.lmplot(data=combined_indicators, x='x', y='y', hue='Indicator', palette=["#000620"], markers=['x', '.'], ci=None)
plt.axvspan(0,1025, alpha=0.5, color='#de425b', zorder=-1)
plt.axvspan(1025,4035, alpha=0.5, color='#fbb862', zorder=-1)
plt.axvspan(4035,12475, alpha=0.5, color ='#afd17c', zorder=-1)
plt.axvspan(12475,100000, alpha=0.5, color='#00876c', zorder=-1)
plt.title("HFI & Happiness Regressed on GNI/capita")
plt.xlabel("GNI/Capita by Purchasing Power Parity (2017 International $)")
plt.ylabel("Standard Indicator Score (0-10)")

My current figure rears its ugly head

据我所知,没有简单的方法可以更改 lmplot 中回归线的样式。但是,如果您使用 regplot 而不是 lmplot,则可以实现您的目标,缺点是您必须“手动”实现 hue-拆分

x_col = 'total_bill'
y_col = 'tip'
hue_col = 'smoker'
df = sns.load_dataset('tips')

markers = ['x','.']
colors = ["#000620", "#000620"]
linestyles = ['-','--']

plt.figure()
for (hue,gr),m,c,ls in zip(df.groupby(hue_col),markers,colors,linestyles):
    sns.regplot(data=gr, x=x_col, y=y_col, marker=m, color=c, line_kws={'ls':ls}, ci=None, label=f'{hue_col}={hue}')
ax.legend()

只是想补充一下,如果以后有人偶然发现了这个 post,您可以使用 Line2D 手动为这个烂摊子创建一个图例。我的看起来像这样:

from matplotlib.patches import Patch
from matplotlib.lines import Line2D

legend_elements = [Line2D([0], [0], color='#000620', lw=2, label='Freedom', linestyle='--'),
                   Line2D([0],[0], color='#000620', lw=2, label='Happiness'),
                   Line2D([0], [0], marker='x', color='#000620', label='Freedom',
                          markerfacecolor='#000620', markersize=15),
                   Line2D([0], [0], marker='.', color='#000620', label='Happiness',
                          markerfacecolor='#000620', markersize=15),
                   Patch(facecolor='#de425b', label='Low-Income'),
                   Patch(facecolor='#fbb862', label='Lower Middle-Income'),
                   Patch(facecolor='#afd17c', label='Upper Middle-Income'),
                   Patch(facecolor='#00876c', label='High-Income')]

最终结果如下所示: Graph with custom legend