matplotlib 比较密度图的形状

bgtovc5b  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(103)

我想比较密度图的形状。我已经做了一个一般的密度图,但因为它们有不同的值,我不能真正比较它们的形状。我要他们一个一个叠在一起。
这是我现在的代码:

for descriptor in descriptors:
            plt.figure()
            descript = [descriptor]+ [descriptor+ '_'+ sets[i] for i in range(1,len(sets))]
            sns.kdeplot(data=df[descript], legend=False)
            plt.legend(labels=['a', 'b', 'c', 'd', 'e'],bbox_to_anchor=(1.04, 0.5), loc="center left")
            plt.title(descriptor.replace('_', ' ').capitalize())
            plt.xlabel(descriptor.replace('_', ' ').capitalize())
            plt.savefig('distribution_'+descriptor+'.png', bbox_inches='tight')
            plt.close()

这导致下面的图.

那我怎么才能把这5个都叠在一起呢

w8ntj3qf

w8ntj3qf1#

这里的两个评论非常有道理。所以,我的假设是:
1.通过重叠,你指的是最大值在彼此的顶部。
1.由于没有数据,我使用IRIS数据
去做你想要的事情…

  • 得到每条曲线的x值,其中y是max。我只是把它画出来,因为它对我来说更简单。如果有其他方法,其他人可以评论/更新
  • 通过将每条曲线移动max的值来绘制图。这将使每条曲线相互移动,最大值为x=0

请注意,这将一起显示图,但x值显然不同。

iris = sns.load_dataset("iris")
cols = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
maxes=[]
fig, ax = plt.subplots()

for col in cols:
    x, y = sns.kdeplot(iris[col], ax=ax).get_lines()[-1].get_data() # Get the x and y values
    maxid = np.argmax(y) # The id of the peak (maximum of y data)
    maxes.append(x[maxid]) # Append the x value which has max-y to maxes list

plt.cla() ## Clear and start plotting the shifted curves

## The actual plot
for i, col in enumerate(cols):
    sns.kdeplot(iris[col]-maxes[i], ax=ax) # Plot with the shift, so that each curve is at 0
ax.axvline(ls=":", c='k')
ax.set_xlabel('')
ax.set_xticks([])
plt.show()

相关问题