📜  如何在 Matplotlib 中按组创建箱线图?

📅  最后修改于: 2022-05-13 01:55:16.852000             🧑  作者: Mango

如何在 Matplotlib 中按组创建箱线图?

可以使用 matplotlib 包创建按组的箱线图,但是,如果您希望对分组箱线图进行更多自定义,那么 seaborn 包提供了一个支持对分组箱线图进行各种自定义的首选函数. Matplotlib 不提供创建分组箱线图的显式函数。我们必须按照所需的格式构建绘图。本文讨论如何在 matplotlib 中创建分组箱线图。

在 Matplotlib 中按组创建箱线图

matplotlib.pyplot.boxplot()matplotlib.pyplot.setp()是创建分组箱线图的两个有用函数

Python3
# import the matplotlib package
import matplotlib.pyplot as plt
 
# import the numpy package
import numpy as np
 
# create 2 - sample a 3-Dim array, that measures
# the summer and winter rain fall amount
summer_rain = [[3, 5, 7], [15, 17, 12, 12, 15],
               [26, 21, 15]]
winter_rain = [[16, 14, 12], [31, 20, 25, 23, 28],
               [29, 31, 35, 41]]
 
# the list named ticks, summarizes or groups
# the summer and winter rainfall as low, mid
# and high
ticks = ['Low', 'Mid', 'High']
 
# create a boxplot for two arrays separately,
# the position specifies the location of the
# particular box in the graph,
# this can be changed as per your wish. Use width
# to specify the width of the plot
summer_rain_plot = plt.boxplot(summer_rain,
                               positions=np.array(
    np.arange(len(summer_rain)))*2.0-0.35,
                               widths=0.6)
winter_rain_plot = plt.boxplot(winter_rain,
                               positions=np.array(
    np.arange(len(winter_rain)))*2.0+0.35,
                               widths=0.6)
 
# each plot returns a dictionary, use plt.setp()
# function to assign the color code
# for all properties of the box plot of particular group
# use the below function to set color for particular group,
# by iterating over all properties of the box plot
def define_box_properties(plot_name, color_code, label):
    for k, v in plot_name.items():
        plt.setp(plot_name.get(k), color=color_code)
         
    # use plot function to draw a small line to name the legend.
    plt.plot([], c=color_code, label=label)
    plt.legend()
 
 
# setting colors for each groups
define_box_properties(summer_rain_plot, '#D7191C', 'Summer')
define_box_properties(winter_rain_plot, '#2C7BB6', 'Winter')
 
# set the x label values
plt.xticks(np.arange(0, len(ticks) * 2, 2), ticks)
 
# set the limit for x axis
plt.xlim(-2, len(ticks)*2)
 
# set the limit for y axis
plt.ylim(0, 50)
 
# set the title
plt.title('Grouped boxplot using matplotlib')


Python3
# import the necessary python packages
import pandas as pd
import numpy as np
import seaborn as sns
 
# create long-form data
data = pd.DataFrame({'season': np.repeat(['Summer', 'Winter',
                                          'Spring'], 5),
                     'rainfall_amount': [17, 18, 19, 21, 27,
                                         33, 37, 33, 36, 12,
                                         14, 15, 16, 21, 22],
                     })
# print the data
print(data)
 
# use seaborn plot and specify the x and y
# columns and specify the dataframe
sns.boxplot(x='season', y='rainfall_amount', data=data)


Python3
# import the necessary python packages
import pandas as pd
import numpy as np
import seaborn as sns
 
# create wide-form data
data = pd.DataFrame({'Summer': [17, 18, 19, 21, 27],
                     'Winter': [33, 37, 33, 36, 12],
                     'Spring': [14, 15, 16, 21, 22]})
# print the data
print(data)
# use melt to convert wide form to long form data
# use seaborn plot and specify the x and y columns
# and specify the dataframe
sns.boxplot(x='variable', y='value', data=pd.melt(data)).set(
    xlabel='Season',
    ylabel='Rainfall amount')


输出:

解释:

  • 导入必要的包 numpy 和 matplotlib。
  • 创建 2 - 名为 Summer_rain 和 Winter_rain 的 3 维样本数组
  • 创建另一个名为 ticks 的列表,将夏季和冬季降雨量汇总或分组为低、中和高。
  • 如图所示,分别为两个数组创建箱线图。
  • 使用 position 参数指定组中每个框的位置,这里,summer_rain 图有 3 个框,间距为 [-0.35, 1.65, 3.65],winter_rain 图有 3 个框,间距为[0.35, 2.35, 4.35] 的间距。
  • 每个框的宽度保持在 0.6。
  • 现在,每个单独的 plot summer_rain_plot 和 winter_rain_plot 返回一个字典,该字典包含箱形图的属性列表,如胡须、中值、传单等。
  • 现在,遍历字典项并使用 plt.setp()函数为每个组分配唯一的颜色代码,如图所示。
  • 使用 plt.plot()函数绘制一条默认线来表示箱线图的图例。
  • define_box_properties函数将绘图、颜色和图例名称作为参数,并适当地设置绘图的属性。
  • 最后,为了提高审美价值,使用 xlim、ylim函数定义 x 和 y 轴的界限,并使用 xticks函数标记 x 轴。使用 plt.title()函数设置绘图的标题。

在 seaborn 中按组创建箱线图

您还可以使用基于顶级 matplotlib 库的另一个名为 seaborn 的库,使用长格式和宽格式数据绘制分组箱线图。

长格式数据的分组箱线图:

Python3

# import the necessary python packages
import pandas as pd
import numpy as np
import seaborn as sns
 
# create long-form data
data = pd.DataFrame({'season': np.repeat(['Summer', 'Winter',
                                          'Spring'], 5),
                     'rainfall_amount': [17, 18, 19, 21, 27,
                                         33, 37, 33, 36, 12,
                                         14, 15, 16, 21, 22],
                     })
# print the data
print(data)
 
# use seaborn plot and specify the x and y
# columns and specify the dataframe
sns.boxplot(x='season', y='rainfall_amount', data=data)

输出:

宽格式数据的分组箱形图:

Python3

# import the necessary python packages
import pandas as pd
import numpy as np
import seaborn as sns
 
# create wide-form data
data = pd.DataFrame({'Summer': [17, 18, 19, 21, 27],
                     'Winter': [33, 37, 33, 36, 12],
                     'Spring': [14, 15, 16, 21, 22]})
# print the data
print(data)
# use melt to convert wide form to long form data
# use seaborn plot and specify the x and y columns
# and specify the dataframe
sns.boxplot(x='variable', y='value', data=pd.melt(data)).set(
    xlabel='Season',
    ylabel='Rainfall amount')

输出:

代码说明:

  • 导入必要的包
  • 创建一个示例数据框,以宽格式列出季节性降雨量,如图所示。
  • 要绘制分组箱线图,数据必须是长格式,因此使用 pandas.melt()函数将数据从宽格式融合到长格式。
  • 将宽格式数据转换为长格式数据时,这两列将默认命名为“变量”和“值”。
  • 使用 seaborn 图并将“变量”作为 x 和“值”作为箱线图的 y 列和相应的数据框传递。
  • 使用 set()函数设置箱线图的 x 和 y 轴标签。