筛选Seaborn箱形图中的数据和修改标签

问题描述 投票:0回答:2

编辑:删除了旧问题,以便更轻松地在帖子中查找解决方案。

Seaborn是基于matplotlib的Python数据可视化库。要使用Seaborn,您的数据必须位于tidy format中。

您可以使用Pandas DataFrame.loc[]过滤数据帧。

[在以下示例中,我将(1)将CSV文件中的某些数据加载到数据帧中;(2)根据列中的特定值过滤该数据;(3)使用Seaborn在箱图中显示该数据;( 4)确定数据显示的顺序以及应使用的标签。

一些示例数据

Object,Metric,Score
M11,B2A10,2.7939033333333336
MT1,B2A10,1.287634388888889
MT1,B2A1,7.1535
MT1,B2A2,2.2441833333333334
MT1,B2A3,3.3787333333333334
MT1,B2A4,2.50297
MT1,B2A5,1.4254989999999998
MT1,B2A6,2.91325
MT1,B2A7,1.24806
MT1,B2A8,2.08797725
MT1,B2A9,1.208722

导入库和模块

import pandas as pd
import seaborn as sns

设置海洋风格

sns.set(style="whitegrid", palette="colorblind")

加载数据并生成我们要过滤的项目列表

data = pd.read_csv("data.csv") 

list = ["B2A10", "B2A1"]

使用.loc过滤数据并放入新数据框

filtered_data = data.loc[data['Metric'].isin(list)]

使用过滤后的数据生成箱线图

fig, ax = plt.subplots(figsize=(10,6))
ax = sns.boxplot(x='Metric', y='Length', data=samples, order=["B2A1", "B2A10"])
ax = sns.swarmplot(x="Metric", y="Length", data=samples, color=".25", order=["B2A1", "B2A10"])
ax.set_xlabel('Label X-Axis')
ax.set_ylabel('Label Y-Axis')
plt.title('Title',fontsize=16)
labels = [item.get_text() for item in ax.get_xticklabels()]
labels[0] = 'Sample 1'
labels[1] = 'Sample 2'
ax.set_xticklabels(labels)
plt.savefig('test.png', dpi=300, bbox_inches='tight')

最终图形应如下所示。

enter image description here

python matplotlib seaborn
2个回答
0
投票

我将在下面回答您的两个问题。

1]要对绘图中的值进行排序(例如,按Score进行排序),您可以先通过“分数”对Metric(您将其用作箱线图的order参数)进行排序:] >

sorted_order = [x for _, x in sorted(zip(score_tidy.Score, score_tidy.Metric))]

然后将order=sorted_order传递给您的箱线图调用。

2)要更改任何基于matplotlib的图的xticks标签(例如,通过seaborn生成的图),您可以获取轴的手柄(以下通过plt.gca()获取当前轴),并执行以下操作:]

plt.gca().set_xticks(np.arange(0, len(sorted_order)), sorted_order)

这样,您将从Metrics中获得xticks标签,并根据Score进行排序。

我找到了两个问题的解决方案。

(1)第一种解决方案是简单地从原始数据中筛选出我想要的项目,然后另存为新的数据文件。我认为这不是最佳选择,但可以满足我的目的。我认为直接根据图中显示的内容进行过滤会更加有效。

# Load list data

data = pd.read_csv('data.csv')

# Define items

items = ['item1', 'item2', 'item3']

# Filter items using Pandas isin() function

items_1_3 = data[data.Column.isin(items)]
items_1_3.to_csv('data_1_3.csv', index=False)

((2)我找到了一种根据其位置更改图形标签的方法(请记住,Python从0开始计数,而不是1)。我在定义图形的位置之后直接添加此代码。

labels = [item.get_text() for item in ax.get_xticklabels()] 
labels[0] = 'one' 
labels[1] = 'two' 
labels[2] = 'three' 
ax.set_xticklabels(labels)

希望有人会发现这很有用。


0
投票

我找到了两个问题的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.