【问题标题】:ax.lines contains line objects without x- and y-coordinatesax.lines 包含没有 x 和 y 坐标的线对象
【发布时间】: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


    【解决方案1】:

    在 seaborn lineplot 中绘制 n 不同的 hue 类别会在轴上为您提供 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']
    

    这里,'_line0', '_line1' 是图像中显示的行。它们包含数据。它们的标签以下划线开头,这样它们就不会出现在图例中。
    剩余的'hue', 'A', 'B' 不包含任何数据。他们的唯一目的是编造传奇。 'hue' 是“图例标题”,也是一个普通的图例条目; 'A', 'B' 是图例条目。

    这是 seaborn 创造传奇的结果。可能的选项是过滤行。例如。可以只取标签中第一个字符为下划线的那些,

     [line for line in ax.lines if line.get_label()[0] == "_"] 
    

    【讨论】:

      猜你喜欢
      • 2012-08-08
      • 2011-02-24
      • 2010-11-03
      • 2020-03-27
      • 2019-11-06
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多