如何在 Matplotlib 中按组创建箱线图?
可以使用 matplotlib 包创建按组的箱线图,但是,如果您希望对分组箱线图进行更多自定义,那么 seaborn 包提供了一个支持对分组箱线图进行各种自定义的首选函数. Matplotlib 不提供创建分组箱线图的显式函数。我们必须按照所需的格式构建绘图。本文讨论如何在 matplotlib 中创建分组箱线图。
在 Matplotlib 中按组创建箱线图
matplotlib.pyplot.boxplot()和matplotlib.pyplot.setp()是创建分组箱线图的两个有用函数
Syntax: matplotlib.pyplot.boxplot(x, notch, positions, widths)
Syntax: matplotlib.pyplot.setp(obj, *args, **kwargs)
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 的库,使用长格式和宽格式数据绘制分组箱线图。
Syntax: sns.boxplot(data, x, y)
Parameters:
- data – specifies the dataframe to be used for the box plots
- x – specifies the column to be used in the x-axis
- y – specifies the column to be used in y-axis
长格式数据的分组箱线图:
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 轴标签。