使用我从this question获得的提示,我能够在海啸关节图上放置一条回归线。
以下代码段创建了以下图表:
代码1
import numpy as np
import pandas as pd
import seaborn as sns
sns.set(style="white")
# Generate a random correlated bivariate dataset
rs = np.random.RandomState(5)
mean = [0, 0]
cov = [(1, .5), (.5, 1)]
x1, x2 = rs.multivariate_normal(mean, cov, 500).T
x1 = pd.Series(x1, name="$X_1$")
x2 = pd.Series(x2, name="$X_2$")
# Show the joint distribution using kernel density estimation
g = sns.jointplot(x1, x2, kind="kde", size=7, space=0)
sns.regplot(x1,x2, scatter=False, ax=g.ax_joint)
图1a
在混合中添加sns.regplot(x1,x2, scatter=False, ax=g.ax_joint)
将呈现此图:
情节1b
这正是我想要完成的事情。
但是,当我在某些现实世界数据中使用相同的代码时,我在右边距的分布图中得到了一些非常奇怪的结果。我们只打电话给A和B两个系列。
代码2 :
A = pd.Series([2197.0,2207.0,2016.0,1993.0,2126.0,2507.0,3123.0,3632.0,3504.0,3515.0,3394.0,3222.0,3167.0,3071.0,2847.0,2776.0,2878.0,2946.0,3051.0,3021.0,2983.0,3044.0,2951.0,2781.0,2434.0])
B = pd.Series([34.0,159.0,-48.0,-134.0,-229.0,-73.0,31.0,-65.0,261.0,616.0,481.0,544.0,360.0,414.0,359.0,142.0,117.0,173.0,115.0,-36.0,-15.0,105.0,316.0,-30.0,-137.0])
g = sns.jointplot(A, B, kind="kde", size=7, space=0)
sns.regplot(A,B, scatter=False, ax=g.ax_joint)
Plot 2
我认为这本身就很奇怪,因为B系列的属性无法解释这个结果。您可以通过更改系列的顺序来验证这一点:
代码3 :
g = sns.jointplot(B, A, kind="kde", size=7, space=0)
sns.regplot(B, A, scatter=False, ax=g.ax_joint)
剧情3 :
正如您所看到的,它仍然是右边缘的分布图,这是问题,而不是数据本身。只需仔细检查,您就可以看到通过注释sns.regplot(B, A, scatter=False, ax=g.ax_joint)
并再次运行它仍然可以获得正确的边距图:
代码4:
g = sns.jointplot(B, A, kind="kde", size=7, space=0)
# sns.regplot(B, A, scatter=False, ax=g.ax_joint)
剧情4:
奇怪,对吗?但如果再次运行整个事情,它会变得更加奇怪,但这次将kind = 'kde'
替换为kind = 'reg'
。
代码5:
g = sns.jointplot(B, A, kind="reg", size=7, space=0)
sns.regplot(B, A, scatter=False, ax=g.ax_joint)
情节5:
正如您所看到的,现在正确的边距图正好在它应该是的位置。 我也在讨论其他可能的解决方案,但我认为这些解决方案的问题非常清楚。那么,有关如何解决此问题的任何建议吗?
谢谢!
修改:
系统信息:
Windows 7,64位
Python 3.6.0
Matplotlib 2.0.0
Seaborn 0.7.1
IPython 5.1.0