我如何 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)
我有一个列表(长度 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)