Python 用趋势线重新定向直方图和散点图

Python 用趋势线重新定向直方图和散点图,python,matplotlib,seaborn,Python,Matplotlib,Seaborn,我有一个类似于下面代码中模拟的数据集。有两组观测值,一组用于X=0时的观测值,另一组用于X>0时的观测值 import numpy as np import seaborn as sns; sns.set() import matplotlib.pyplot as plt X1 = np.random.normal(0, 1, 100) X1 = X1 - np.min(X1) Y1 = X1 + np.random.normal(0, 1, 100) X0 = np.zeros(100)

我有一个类似于下面代码中模拟的数据集。有两组观测值,一组用于X=0时的观测值,另一组用于X>0时的观测值

import numpy as np
import seaborn as sns; sns.set()
import matplotlib.pyplot as plt

X1 = np.random.normal(0, 1, 100)
X1 = X1 - np.min(X1)
Y1 = X1 + np.random.normal(0, 1, 100)

X0 = np.zeros(100)
Y0 = np.random.normal(0, 1.2, 100) + 2

X = np.concatenate((X1, X0))
Y = np.concatenate((Y1, Y0))

sns.distplot(Y0, color="orange")
plt.show()

sns.scatterplot(X, Y, hue = (X == 0), legend=False)
plt.show()
有两个图:带有KDE的直方图和散点图

我想用KDE获取直方图,旋转它,并根据散点图适当地确定方向。我还想为每一组观察结果添加一条趋势线

理想的结果如下所示:


在python中如何使用seaborn或matplotlib实现这一点?

这可以通过将
plt.subplot
与共享y轴相结合来实现,以保持比例和
sns
绘图。对于趋势线,您需要一些额外的计算,但可以使用
np
进行快速拟合。下面是一个如何实现你的目标的例子,这里是玩

将numpy导入为np
作为sns导入seaborn;sns.set()
将matplotlib.pyplot作为plt导入
#准备一些数据
np.随机种子(2020年)
平均值_Y1=0
标准_Y1=1
尺寸_Y1=100
X1=np.随机.正常(平均值为1,标准值为1,尺寸为1)
X1=X1-np.min(X1)
Y1=X1+np.随机.正常(平均值为Y1,标准值为Y1,尺寸为Y1)
#这是用来计算趋势线的
Z=np.多边形拟合(X1,Y1,1)
Y_u1;=np.poly1d(Z)(X1)
平均值_Y0=2
标准_Y0=1.2
尺寸_Y0=100
X0=np.零(100)
Y0=np.随机.正常(平均值、标准值、大小)
X=np.连接((X1,X0))
Y=np.连接((Y1,Y0))
#现在是策划的时候了
图,axs=plt子批次(1,2,,
sharey=True,
figsize=(10,5),
gridspec_kw={'width_ratio':(1,2)}
)
#控制地块之间的间距
图子批次调整(wspace=0.1)
#设置y轴的刻度:
axs[0].yaxis.set_tick_参数(left=False,labelleft=False,labelright=True)
#如果您愿意,可以使用以下工具旋转直方图上的XTICK:
axs[0].xaxis.set_tick_参数(旋转=90)
#柱状图
dist=sns.distplot(Y0,color=“橙色”,vertical=True,ax=axs[0])
#现在我们需要得到峰的坐标,我们需要这条平均线
line_data=dist.get_line()[0]。get_data()
max_Y0=np.max(行数据[0])
#绘制平均线
axs[0]。绘图([0,max_Y0],[mean_Y0,mean_Y0],'--',c='orange')
#反转X轴
axs[0]。反转X轴()
#绘制散射点
sns.scatterplot(X,Y,色调=(X==0),图例=False,ax=axs[1])
#绘制趋势线
sns.lineplot(X1,Y,ax=axs[1])
#你的意思是什么
axs[1]。绘图([0,最大值(X1)],[mean_Y0,mean_Y0],'--',c='orange')
plt.show()
输出:


我可以重新创建您的结果,您的评论非常有用。你做得很好——谢谢。很高兴帮助你!