简体   繁体   English

如何在seaborn distplot的模式下画一条垂直线

[英]How to draw a vertical line at the mode of the seaborn distplot

I just learned how to draw a density plot with the seaborn Python module:我刚刚学会了如何使用seaborn Python 模块绘制密度图:

import numpy as np
import torch
from matplotlib import pyplot as plt
from matplotlib.pyplot import (plot, savefig, xlim, figure,
                              ylim, legend, boxplot, setp,
                              axes, xlabel, ylabel, xticks,
                              axvline)
import seaborn as sns

layer1_G1_G2 = [-0.05567627772688866,
 -0.06829605251550674,
 -0.0721447765827179,
 -0.05942181497812271,
 -0.061410266906023026,
 -0.062010858207941055,
 -0.05238522216677666,
 -0.057129692286252975,
 -0.06323938071727753,
 -0.07018601894378662,
 -0.05972284823656082,
 -0.06124034896492958,
 -0.06971242278814316,
 -0.06730005890130997]

def make_density(layer_list,color, layer_num):

    layer_list_tensor = torch.tensor(layer_list)
    
    # Plot formatting
    plt.title('Density Plot of Median Stn. MC-Losses at Layer ' + layer_num)
    plt.xlabel('MC-Loss')
    plt.ylabel('Density')
    plt.xlim(-0.2,0.05)
    plt.ylim(0, 85)
    min_ylim, max_ylim = plt.ylim()
    
    # Draw the density plot
    sns.distplot(layer_list, hist = False, kde = True,
                 kde_kws = {'linewidth': 2}, color=color)

# plot the density plot
# the resulting density plot is shown below
>>> make_density(layer1_G1_G2, 'green','1')

从上面的代码生成的图像:

How can I draw a vertical line at the mode of this density curve on this distplot ?如何在此distplot以该密度曲线模式绘制一条垂直线?

Thank you,谢谢,

I found the solution:我找到了解决方案:

def make_density(layer_list,color, layer_num):

    
    # Plot formatting
    plt.title('Density Plot of Median Stn. MC-Losses at Layer ' + layer_num)
    plt.xlabel('MC-Loss')
    plt.ylabel('Density')
    plt.xlim(-0.2,0.05)
    plt.ylim(0, 85)
    min_ylim, max_ylim = plt.ylim()
    
    
    
    # Draw the density plot
    sns.distplot(layer_list, hist = False, kde = True,
                 kde_kws = {'linewidth': 2}, color=color)
    
    dens_list = sns.distplot(layer1_G1_G2, hist = False, kde = True,
             kde_kws = {'linewidth': 2}, color='green').get_lines()[0].get_data()[1].tolist()
                    
    max_dens_index = dens_list.index(max(dens_list))
    
    mode = sns.distplot(layer1_G1_G2, hist = False, kde = True,
             kde_kws = {'linewidth': 2}, color='green').get_lines()[0].get_data()[0].tolist()[max_dens_index]
  
    plt.axvline(mode, color='orange', linestyle='dashed', linewidth=1.5)

    plt.text(mode * 0.87, 80, 'mode: {:.2f}'.format(mode))

>>> make_density(layer1_G1_G2, 'green','1')

在此处输入图片说明

You can extract the x and y values of the generated curve and find the mode as the highest y-value.您可以提取生成曲线的 x 和 y 值,并找到最高 y 值的众数。

from matplotlib import pyplot as plt
import seaborn as sns

layer1_G1_G2 = [-0.05567627772688866, -0.06829605251550674, -0.0721447765827179, -0.05942181497812271, -0.061410266906023026, -0.062010858207941055, -0.05238522216677666, -0.057129692286252975, -0.06323938071727753, -0.07018601894378662, -0.05972284823656082, -0.06124034896492958, -0.06971242278814316, -0.06730005890130997]

def make_density(layer_list, color, layer_num):
    # Draw the density plot
    ax = sns.distplot(layer_list, hist=False, kde=True, kde_kws={'linewidth': 2}, color=color)
    x = ax.lines[0].get_xdata()
    y = ax.lines[0].get_ydata()
    mode_idx = y.argmax()
    ax.vlines(x[mode_idx], 0, y[mode_idx], color='crimson', ls=':')

    # Plot formatting
    ax.set_title('Density Plot of Median Stn. MC-Losses at Layer ' + layer_num)
    ax.set_xlabel('MC-Loss')
    ax.set_ylabel('Density')
    ax.autoscale(axis='x', tight=True)
    ax.set_ylim(ymin=0)

make_density(layer1_G1_G2, 'green', '1')
plt.show()

示例图

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM