在Seaborn的联合图上添加任意线条

8

我可以使用 jointplot 绘制两个变量的联合分布。然而,我找不到一种方法来添加显示两个维度上特定值的任意直线。

例如,以下代码能够很好地展示联合和边缘分布:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

sns.set(color_codes=True)

tips = sns.load_dataset("iris")
plot = sns.jointplot(x="sepal_length", y="sepal_width", data=tips, 
kind="kde")

然而,我无法找到一种方法在预先指定的值处包含特定的垂直和水平线。例如,包括

plt.plot([6, 1.5], [6, 5], color="skyblue", lw=5, linestyle='solid', label="_not in legend")

生成了一个边缘上的线,但是在联合图上没有。是否有一种方法可以添加例如垂直和水平线到指定的sepal_length和sepal_width值?(比如,在6处添加垂直线,在3处添加水平线)并且,更一般地说,是否可能根据数据的特定统计信息制作这些线?(不同变量的平均值、中位数)
谢谢。
1个回答

20

您可以使用ax_joint修改jointplot的主轴。通过这种方式,您可以使用标准的matplotlib.pyplot命令,例如axvline和axhline:

import seaborn as sns

sns.set(color_codes=True)

tips = sns.load_dataset("iris")
plot = sns.jointplot(x="sepal_length",y="sepal_width",data=tips,kind="kde")
plot.ax_joint.axvline(x=6)
plot.ax_joint.axhline(y=3)
plot.ax_joint.set_xlim(4,8)
plot.ax_joint.set_ylim(2,4.5)

实际上,您也可以绘制一条通用的线而不仅仅是一条常量:

plot.ax_joint.plot([4,8], [2,5], 'b-', linewidth = 2)

对于使用统计量的常数线,您可以使用pandas数据帧属性:

plot.ax_joint.axvline(x=tips.sepal_length.median(),linestyle='--')
plot.ax_joint.axhline(y=tips.sepal_width.mean(),linestyle='--')
你也可以使用 marg_x 和 marg_y 添加边际分布的线条。
plot.ax_marg_x.axvline(x=6)
plot.ax_marg_y.axhline(y=3)

它看起来像这样:

在此输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接