在多元回归图中使用更改每个回归线样式 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
我目前正尝试为我的数据绘制两条回归线,按分类属性(自由或幸福分数)划分。我目前的疑虑是我需要颜色来编码图表中的另一个单独的分类属性(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