Для моего проекта я использую sns.FacetGrid()
для построения нескольких вспомогательных участков, каждое из которых содержит несколько строк. Моя общая цель - нарисовать среднюю линию для каждой линии на каждом участке. Моя идея состояла в том, чтобы извлечь x- и y-данные для каждой строки. Для этого я выполняю итерации по каждому подплощадке, а затем по каждому объекту линии в каждом подплощадке (как описано в этом сообщении stackoverflow * ). Проблема: Кажется, что каждый из предметов содержит четыре «пустых» строковых объекта, но мои подсюжеты содержат только три строчки каждый. Итак, мой ожидаемый результат - список из шести кортежей, каждый из которых содержит массив для моих 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()))