为了账号安全,请及时绑定邮箱和手机立即绑定

如何将多类别数据框绘制为单个箱线图

如何将多类别数据框绘制为单个箱线图

慕尼黑8549860 2023-10-26 15:36:08
我可以使用 SPSS 软件轻松绘制下面的箱线图。但对于Python来说,这对我来说有点困难。我一直在尝试子情节,但我很困惑如何做到这一点。这是 SPSS 的箱线图。我想知道如何绘制类似于seaborn或matplotlib的东西?独特的价值观是:公司:TAM、GOL目的地:SSA、SLZ、FOR、MCZ、NAT、JPA、REC工作日:周一、周五、周六、周四、周二、周三我很感激任何答案。
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

映射seaborn.boxplotseaborn.Facetgrid

  • AFacetgrid是用于绘制条件关系的多图网格。

  • 可以使用参数将标题WEEKDAY放置在右边距,但这也需要更多的垂直空间。FacetGridmargin_titles=True

import pandas as pd

import calendar

import seaborn as sns


# given your data in dataframe df, read from a csv

df = pd.read_csv('test.csv', index_col=0)


# create the FacetGrid with boxplot

g = sns.FacetGrid(data=df, col='COMPANY', row='WEEKDAY', height=1.5, aspect=4, margin_titles=True, row_order=calendar.day_name)

g.map(sns.boxplot, 'DESTINATION', 'COST', order=sorted(df.DESTINATION.unique()))

https://img1.sycdn.imooc.com/653a171b0001e7b208600748.jpg

进一步定制

  • 归因于在seaborn FacetGrid图中编辑正确的ylabel

import pandas as pd

import calendar

import seaborn as sns


# given your data in dataframe df, read from a csv

df = pd.read_csv('test.csv', index_col=0)


# create the FacetGrid with boxplot

g = sns.FacetGrid(data=df, col='COMPANY', row='WEEKDAY', height=1.5, aspect=4, margin_titles=True, row_order=calendar.day_name)

g.map(sns.boxplot, 'DESTINATION', 'COST', order=sorted(df.DESTINATION.unique()))

https://img1.sycdn.imooc.com/653a172e00017d3309540758.jpg

查看完整回答
反对 回复 2023-10-26
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

以下方法创建一个没有间距的 7x2 子图网格,并用于sns.boxplot每个子图内的箱线图:


import matplotlib.pyplot as plt

import seaborn as sns

import pandas as pd

import numpy as np


# df = pd.read_csv(...)


fig, axes = plt.subplots(ncols=2, nrows=7, sharex=True, sharey=True, figsize=(10, 16),

                         gridspec_kw={'wspace': 0, 'hspace': 0})


companies = ['GOL', 'TAM']

for comp_index, company in enumerate(companies):

    axes[0, comp_index].set_title(company)

    for weekd_index, weekd in enumerate(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']):

        ax = axes[weekd_index, comp_index]

        sns.boxplot(data=df[(df['WEEKDAY'] == weekd) & (df['COMPANY'] == company)],

                    x='DESTINATION', y='COST', color='skyblue', ax=ax)

        if comp_index != 0:

            ax.set_ylabel('')

        if comp_index == len(companies) - 1:

            ax.text(1.02, 0.5, weekd, ha='left', va='center', rotation=90, transform=ax.transAxes)


plt.tight_layout()

plt.show()

https://img1.sycdn.imooc.com/653a1741000161f206541051.jpg

查看完整回答
反对 回复 2023-10-26
  • 2 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信