简体   繁体   English

将 seaborn regplot 参数注释到 plot

[英]Annotating seaborn regplot parameters to the plot

I am trying to make scatter plots with r2 , p and rmse values using seaborn.regplot .我正在尝试使用seaborn.regplot制作具有r2prmse值的散点图。 But following code returns an error of AttributeError: 'AxesSubplot' object has no attribute 'map_dataframe'但以下代码返回AttributeError: 'AxesSubplot' object has no attribute 'map_dataframe'

fig, axes = plt.subplots(1, 2, figsize=(15, 5), sharey=True)


g = sns.regplot(x='est_fmc', y='1h_surface', data=new_df, ax=axes[0])
def annotate(data, **kws):
    slope, intercept, rvalue, pvalue, stderr = scipy.stats.linregress(x = data['est_fmc'], y= data['1h_surface'] )
    rmse = mean_squared_error(data['est_fmc'], data['1h_surface'], squared=False)
    print(slope, intercept, rvalue, pvalue, rmse)
    ax = plt.gca()
    ax.text(.02, .9, 'r2={:.2f}, p={:.2g}, rmse = {:.2f}'.format(rvalue**2, pvalue, rmse),
            transform=ax.transAxes)
g.map_dataframe(annotate)


g = sns.regplot(x='est_fmc', y='1h_profile', data=new_df, ax = axes[1] )
def annotate(data, **kws):
    slope, intercept, rvalue, pvalue, stderr = scipy.stats.linregress(x = data['est_fmc'], y= data['1h_profile'] )
    rmse = mean_squared_error(data['est_fmc'], data['1h_profile'], squared=False)
    print(slope, intercept, rvalue, pvalue, rmse)
    ax = plt.gca()
    ax.text(.02, .9, 'r2={:.2f}, p={:.2g}, rmse = {:.2f}'.format(rvalue**2, pvalue, rmse),
            transform=ax.transAxes)
g.map_dataframe(annotate)

Is there a way to work around?有办法解决吗? I would really appreciate any help.我真的很感激任何帮助。

An important aspect of seaborn is the difference between figure-level and axes-level functions . seaborn 的一个重要方面是图形级和轴级功能之间的区别 sns.regplot is an axes-level function. sns.regplot是轴级别的 function。 It gets an ax (indicating the subplot) as an optional parameter, and always returns the ax on which the plot has been created.它获取一个ax (指示子图)作为可选参数,并始终返回创建 plot 的ax

map_dataframe is meant to work with figure-level functions (which create a grid of subplots). map_dataframe旨在与图形级函数(创建子图网格)一起使用。 It can work together with a function such as relplot .它可以与 relplot 等relplot一起使用。 Note that figure-level functions don't accept an ax as parameter, they always create their own new figure.请注意,图形级函数不接受ax作为参数,它们总是创建自己的新图形。

In your case, you can modify the annotate function with an ax parameter, and also a parameter for x and y to make it work for both subplots.在您的情况下,您可以使用ax参数以及xy的参数修改annotate function 以使其适用于两个子图。 (An important concept in Python is "DRY - Don't Repeat Yourself" .) (Python 中的一个重要概念是“干——不要重复自己” 。)

Here is the modified code, starting from some test data.这是修改后的代码,从一些测试数据开始。 (A further improvement would be to also put the call to regplot into the annotate function, renaming that function to something like "regplot_with_annotation"). (进一步的改进是将调用regplot放入annotate function,将 function 重命名为“regplot_with_annotation”)。

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
import scipy
from sklearn.metrics import mean_squared_error

def annotate(ax, data, x, y):
    slope, intercept, rvalue, pvalue, stderr = scipy.stats.linregress(x=data[x], y=data[y])
    rmse = mean_squared_error(data[x], data[y], squared=False)
    ax.text(.02, .9, f'r2={rvalue ** 2:.2f}, p={pvalue:.2g}, rmse={rmse:.2f}', transform=ax.transAxes)

est_fmc = np.random.uniform(0, 10, 100)
oneh_surface = 2 * est_fmc + np.random.normal(0, 5, 100) + 10
oneh_profile = 3 * est_fmc + np.random.normal(0, 3, 100) + 5

new_df = pd.DataFrame({'est_fmc': est_fmc, '1h_surface': oneh_surface, '1h_profile': oneh_profile})

fig, axes = plt.subplots(1, 2, figsize=(15, 5), sharey=True)

ax = sns.regplot(x='est_fmc', y='1h_surface', data=new_df, ax=axes[0])
annotate(ax, data=new_df, x='est_fmc', y='1h_surface')

ax = sns.regplot(x='est_fmc', y='1h_profile', data=new_df, ax=axes[1])
annotate(ax, data=new_df, x='est_fmc', y='1h_profile')

plt.tight_layout()
plt.show()

sns.regplot 带注释

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

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