【问题标题】:How can I select specific values from list and plot a seaborn boxplot?如何从列表中选择特定值并绘制 seaborn 箱线图?
【发布时间】:2019-05-31 14:38:18
【问题描述】:

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

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

我可以绘制一系列点,但如何绘制,例如:data[3]、data[45]、data[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]]

【问题讨论】:

  • 您能否从您的列表中提供一些示例数据?在你的问题中,我的意思是。在您根据中位数对它们进行排序之后,最好是您想要绘制的前 10 个。
  • 感谢您的回复。这就是问题所在,我不知道如何在列表中排序。我需要跟踪每个列表出现在列表中的顺序,因为这对我的分析很重要。对此有何想法?
  • 那你能把整个列表中的一些数据显示出来吗?
  • 可以!最好的分享方式是什么?
  • 按照here的建议在您的问题中添加一个示例

标签: python-3.x seaborn boxplot numpy-ndarray


【解决方案1】:

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

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)

要选择顶部的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)(信用 here)。

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

然后你就可以绘制它了。

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

【讨论】:

    【解决方案2】:

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

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

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

    data[[3, 45, 129]]
    

    【讨论】:

    • 谢谢!但是,当我尝试以这种方式绘制时(选择特定元素时,我收到此错误消息:TypeError: list indices must be integers or slices, not list
    • @egeorgia 显然你正在尝试绘制列表,而不是 numpy 数组
    猜你喜欢
    • 1970-01-01
    • 2020-09-01
    • 2021-05-19
    • 2017-11-17
    • 2018-02-16
    • 2019-05-21
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多