我如何 select 列表中的特定值并绘制 seaborn 箱线图?

How can I select specific values from list and plot a seaborn boxplot?

我有一个列表(长度 300)的列表(每个长度 1000)。我想按每个 1000 个列表的中位数对 300 个列表进行排序,然后绘制前 10 个(即中位数最大的 10 个列表)的 seaborn 箱线图。

我能够绘制整个 300 列表,但不知道从那里去哪里。

我可以绘制一系列点,但如何绘制,例如:数据[3]、数据[45]、数据[129] 都在同一个图中?

ax = sns.boxplot(data = data[0:50])

我也可以通过这样做计算出列表中的哪些项目在前 10 名中(但我意识到这不是最优雅的方法!)

array_median = np.median(data, axis=1)
np_sortedarray = np.sort(np.array(array_median))

sort_panda = pd.DataFrame(array_median)
TwoL = sort_panda.reset_index()
TwoL.sort_values(0)

最终我想要一个包含 10 个方框的箱线图,显示具有最大中值的列表项。

数据示例:300 x 1000 的列表 [[1.236762285232544, 1.2303414344787598, 1.196462631225586, ...1.1787045001983643, 1.1760116815567017, 1.1614983081817627, 1.1546586751937866], [1.1349891424179077, 1.1338907480239868, 1.1239897012710571, 1.1173863410949707, ...1.1015456914901733, 1.1005324125289917, 1.1005228757858276], [1.0945734977722168, ...1.091795563697815]]

请参阅 this answer 获取前 10 个元素

idx = (-median).argsort()[:10]
data[idx]

此外,您还可以像这样获取特定的数据元素

data[[3, 45, 129]]

我稍微修改了您的示例数据以使其更容易。

import seaborn as sns
import pandas as pd
import numpy as np

data = [[1.236762285232544, 1.2303414344787598, 1.196462631225586, 1.1787045001983643, 1.1760116815567017, 1.1614983081817627, 1.1546586751937866], 
        [1.1349891424179077, 1.1338907480239868, 1.1239897012710571, 1.1173863410949707, 1.1015456914901733, 1.1005324125289917, 1.1005228757858276]]

要对数据进行排序,因为它是列表格式而不是 numpy arrays,您可以使用带有键的 sorted 函数来告诉它对列表中的每个列表执行操作,这就是函数的排序方式。设置 reverse = True 告诉它从高到低排序。

sorted_data = sorted(data, key = lambda x: np.median(x), reverse = True)

对于 select 顶部 n 列表,将 [:n] 添加到上一条语句的末尾。

要在 Seaborn 中绘图,最简单的方法是将数据转换为 pandas.DataFrame

df = pd.DataFrame(data).T

这使得 DataFrame 有 10 列(或本例中的 2 列)。我们可以重命名列以使每个数据集更清晰。

df = df.rename(columns={k: f'Data{k+1}' for k in range(len(sorted_data))}).reset_index()

要在一个图中绘制 2 个(或 10 个)箱线图,您可以将数据框重新整形为具有 2 列,一列用于数据,一列用于数据集编号 (ID)(来源 )。

df = pd.wide_to_long(df, stubnames = ['Data'], i = 'index', j = 'ID').reset_index()[['ID', 'Data']]

然后你就可以绘制了。

sns.boxplot(x='ID', y = 'Data', data = df)