Seaborn箱线图中的过滤数据和修改标签

2024-06-02 07:52:02 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑:删除旧问题,以便在帖子中更容易找到解决方案

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

设置seaborn风格

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


Tags: 数据示例datalabelspltseabornaxmetric
2条回答

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

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

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

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

2)要更改任何基于matplotlib的绘图(例如通过seaborn生成的绘图)的xticks标签,您可以获取轴的句柄(通过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)

希望有人会觉得这个有用

相关问题 更多 >