【发布时间】:2020-02-23 23:37:18
【问题描述】:
对于我的项目,我使用sns.FacetGrid() 绘制多个子图,每个子图包含多条线。我的总体目标是为每个子图中的每条线画一条平均线。我的想法是提取每行的 x 和 y 数据。为此,我遍历每个子图,然后遍历每个子图中的每个线对象(如stackoverflow post 中所述)。问题:每个主题似乎都包含四个“空”线对象,但我的子图每个只包含三行。所以我的预期输出是一个包含六个元组的列表,每个元组都包含一个用于我的 x 和 y 数据的数组。有谁知道这四个空行对象来自哪里以及如何仅获取每个现有(又名可见)行的 x 和 y 数据?
这是我的代码:
import numpy as np
import pandas as pd
import seaborn as sns
# simulate data frames #########################################################
n_outer_folds = 10
plot_df_1 = pd.DataFrame({'Outer Fold':np.linspace(start=1,stop=10,num=n_outer_folds),
'train_BAC':np.random.uniform(low=0.6,high=1.0,size=n_outer_folds).tolist(),
'train_SPEC':np.random.uniform(low=0.6,high=1.0,size=n_outer_folds).tolist(),
'test_BAC':np.random.uniform(low=0.1,high=0.8,size=n_outer_folds).tolist(),
'test_SPEC':np.random.uniform(low=0.1,high=0.8,size=n_outer_folds).tolist()
})
plot_df_2 = pd.DataFrame({'Outer Fold':np.linspace(start=1,stop=10,num=n_outer_folds),
'train_BAC':np.random.uniform(low=0.6,high=1.0,size=n_outer_folds).tolist(),
'train_SPEC':np.random.uniform(low=0.6,high=1.0,size=n_outer_folds).tolist(),
'test_BAC':np.random.uniform(low=0.1,high=0.8,size=n_outer_folds).tolist(),
'test_SPEC':np.random.uniform(low=0.1,high=0.8,size=n_outer_folds).tolist()
})
plot_df_list = [plot_df_1,plot_df_2]
# append 'Model' column to make each plot df identifiable
for idx,plot_df in enumerate(plot_df_list):
plot_df['Model'] = idx
# concatenate all plot dfs
plot_df = pd.concat(plot_df_list)
# create a plotable Dataframe
plot_df_melt = pd.melt(plot_df,
id_vars=['Outer Fold','Model'],
value_vars=['train_BAC','test_BAC','train_SPEC'],
var_name ='Scores',
value_name='Score'
)
# plot data
g = sns.FacetGrid(plot_df_melt,col="Model",height=4,aspect=2,col_wrap=1)
g.map(sns.lineplot,'Outer Fold','Score','Scores')
# get line data
axes_data = []
ax_lines_data = []
for ax in g.axes.flat:
axes_data.append(ax)
for line in ax.lines:
ax_lines_data.append((line.get_xdata(),line.get_ydata()))
【问题讨论】:
标签: matplotlib seaborn