ax.lines содержит линейные объекты без x- и y-координат - PullRequest
0 голосов
/ 23 февраля 2020

Для моего проекта я использую 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()))

image

1 Ответ

0 голосов
/ 23 февраля 2020

График n различных hue категорий в морском пороге lineplot дает вам 2*n+1 линий на осях. Минимальный пример:

df = pd.DataFrame({"x" : [1,2,2,4], "y" : [1,2,3,4], "hue" : list("ABAB")})
ax = sns.lineplot("x", "y", "hue", data=df)
print([line.get_label() for line in ax.lines])

отпечатки

['_line0', '_line1', 'hue', 'A', 'B']

enter image description here

Здесь '_line0', '_line1' - линии, показанные на изображении , Они содержат данные. Их метка начинается с подчеркивания, чтобы они не появлялись в легенде.
Остальные 'hue', 'A', 'B' не содержат никаких данных. Их единственная цель - составить легенду. 'hue' - это «заголовок легенды», который также является обычной записью легенды; 'A', 'B' являются записями легенд.

Это следствие того, как seaborn создает легенды. Возможные варианты - отфильтровать строки. Например, в качестве первого символа в названии можно взять только те, которые имеют подчеркивание

 [line for line in ax.lines if line.get_label()[0] == "_"] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...