箱线图的几种画法-Python

欢迎关注笔者的微信公众号


箱线图是一种强大的数据可视化工具,用于了解数据的分布。它将数据分成四分位数,并根据从这些四分位数得出的五个数字对其进行汇总:

  • 中位数:数据的中间值。标记为 Q2,描绘了第 50 个百分点。

  • 第一个四分位数:“最小非异常值”和中位数之间的中间值。标记为 Q1,描绘了第 25 个百分点。

  • 第三四分位数:“最大非异常值”和中位数之间的中间值。标记为 Q3,描绘了第 75 个百分点。

  • “最大非异常值”:按 (Q3 + 1.5*IQR) 计算。高于此值的所有值都被视为异常值。

  • “最小非异常值”:按 (Q1 – 1.5*IQR) 计算。低于此值的所有值都被视为异常值。

它还可以表示数据的对称性、偏度和分布。

箱型图的功能:

  • 直观明了地识别数据批中的异常值
  • 利用箱线图判断数据批的偏态和尾重
  • 比较几批数据的形状

使用Pandas + Seaborn绘制箱型图

  • 导入相关库
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import seaborn as sns

import warnings
warnings.filterwarnings("ignore")

sns.set(font="SimHei")
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

Pandas绘图

# load the dataset
df = sns.load_dataset('tips')
df.head(10)

tips是Seaborn官方的一个数据集,首次会从github远程仓库下载到用户目录,如果出现超时可手动使用下面的镜像加速网址下载官方数据集并放到用户目录下,如/home/sairo/seaborn-data

https://github.com.cnpmjs.org/mwaskom/seaborn-data.git

df.boxplot(by="day", column=["total_bill"])
df.boxplot(by="size", column=["tip"], grid=False)

使用Seaborn画箱型图

tips = sns.load_dataset("tips")
tips.head()

# Draw a vertical boxplot grouped
# by a categorical variable:
sns.set_style("whitegrid")

sns.boxplot(x="day", y="total_bill", data=tips)

Seaborn绘制水平箱型图

箱线图用于可视化数据分布,这在需要比较数据时非常有用。有时,箱线图也称为箱线图。该框显示了数据集的四分位数,而胡须延伸以显示分布的其余部分。在本文中,我们将使用 python 使用 seaborn 实现水平箱线图。

水平箱线图

Seaborn 使用 boxplot() 方法绘制箱线图。我们可以通过两种方法将箱线图变成水平箱线图,我们需要切换x和y属性并将其传递给boxplot()方法,另一种是使用orient="h"选项传递给boxplot() 方法。

  • 方法一:切换x和y属性
# import library & dataset
import seaborn as sns

df = sns.load_dataset("iris")

# Just switch x and y
plt.Figure(dpi=300)
sns.boxplot(y=df["species"], x=df["sepal_length"])

  • 方法 2:使用 orient = h
# import library & dataset
import seaborn as sns

tips = sns.load_dataset("tips")
ax = sns.boxplot(data=tips, orient="h", palette="Set2")

Seaborn – 使用调色板为箱线图着色

为您的数据可视化添加正确的颜色集使其更令人印象深刻和可读,seaborn 调色板使您可以轻松地在您的可视化中使用颜色。在本文中,我们将看到如何使用 seaborn 调色板为箱线图着色,还将了解 seaborn 调色板的用途,它也可以应用于其他绘图。

# import libraries
import matplotlib.pyplot as plt
import seaborn as sns

ds = sns.load_dataset("iris")
ax = sns.boxplot(data=tips, orient="h")

Seaborn boxplot() 函数有调色板参数,在这个例子中我们设置了palette=”Set1″,它使用定性调色板来给boxplot中的框上色。所以在 boxplot 方法中添加调色板参数。

# use palette method
ax = sns.boxplot(data=ds, orient="h", palette="Set1")

如何在 Python 中使用 Seaborn 在 Boxplot 上显示均值?

本节使用官方提供的泰坦尼克数据集

# importing useful libraries
import matplotlib.pyplot as plt
import seaborn as sns

# using titanic dataset from
# seaborn library
df = sns.load_dataset("titanic")

# to see first 5 rows of dataset
df.head()

# to plot a boxplot of
# age vs survived feature
plt.figure(figsize=(10, 8))
sns.boxplot(x="survived", y="age", data=df)
plt.ylabel("Age", size=14)
plt.xlabel("Survived", size=14)
plt.title("Titanic Dataset", size=18)

我们观察到中位数显示为四分位线,但未显示平均值。

  • 为了显示均值,我们在 boxplot 函数中使用了一个额外的关键字参数。我们将 showmeans 设置为 True。
# boxplot with showmeans
plt.figure(figsize=(10, 8))
sns.boxplot(x="survived", y="age", data=df, showmeans=True)  # notice the change
plt.ylabel("Age", size=14)
plt.xlabel("Survived", size=14)
plt.title("Titanic Dataset", size=18)

  • 要设置我们自定义的标记和标记颜色,我们将使用meanprops关键字参数,如下面的代码所示。
# customizing using meanprops
plt.figure(figsize=(10, 8))
sns.boxplot(
    x="survived",
    y="age",
    data=df,
    showmeans=True,
    meanprops={"marker": "+", "markeredgecolor": "black", "markersize": "10"},
)
plt.ylabel("Age", size=14)
plt.xlabel("Survived", size=14)
plt.title("Titanic Dataset", size=18)

如何在 Seaborn 中手动排序 Boxplot?

# import required modules
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns

# load dataset
tips = sns.load_dataset("tips")

# display top most rows
tips.head()

# illustrate box plot
fx = sns.boxplot(x="day", y="total_bill", data=tips, hue="sex", palette="Set2")

  • 使用 seaborn 绘制箱线图。看上图的顺序和根据我们的需要设置顺序后的区别。 Palette 将改变图形的颜色(您也可以尝试 Set1 和 Set3)
# illustrating box plot with order
fx = sns.boxplot(
    x="day",
    y="total_bill",
    data=tips,
    order=["Sun", "Sat", "Fri", "Thur"],
    hue="sex",
    palette="Set2",
)

使用 Seaborn 在 Python 中分组箱线图

分组箱线图用于可视化具有多个子组的数据。此外,我们可以使用分组箱线图一次可视化三个变量,其中一个变量是数字变量,另外两个变量是分类变量。 我们将使用 Python 的 Seaborn 库来创建分组箱线图。我们将使用来自 Seaborn 库的tip数据集。

# import seaborn library
import seaborn as sns

# load the dataset
data = sns.load_dataset("tips")

data.head(5)

示例 1:让我们创建一个箱线图来了解“tips”数据集的每一“天”上“total_bill”的分布。但我们也想根据“性别”属性对其进行分组。因此,我们将为这三个属性绘制分组箱线图,其中“sex”和“day”是分类属性,“total_bill”是数值属性。

sns.boxplot(x=data["day"], y=data["total_bill"], hue=data["sex"])

示例 2:下一个示例与上一个示例类似。唯一的区别是作为"smoker"属性的"hue"参数的值。在这里,我们想根据一个人是否吸烟来了解"total_bill"与"day"组的分布。

# create another grouped boxplot
sns.boxplot(x=data["day"], y=data["total_bill"], hue=data["smoker"], palette="Set2")

示例 3:在本示例中,我们将介绍如何绘制 2 个以上的分组箱线图。如果"hue"参数的值有 2 个以上的类别,那么我们可以绘制 2 个以上的分组箱线图,如下所示。 在这里,‘hue’ = data[‘size’] 有六个类别,因此我们可以使用与上述相同的方法看到 2 个以上的分组箱线图。

sns.boxplot(x=data["day"], y=data["total_bill"], hue=data["size"], palette="husl")

使用 graph_objects 类在 Plotly 中绘制箱线图

Plotly 是一个 Python 库,用于设计图形,尤其是交互式图形。它可以绘制各种图形和图表,如直方图、条形图、箱线图、展开图等等。它主要用于数据分析以及财务分析。

使用graph_objects类的箱线图

import plotly.graph_objects as go
import numpy as np


# creating random data through randomint
# function of numpy.random
np.random.seed(42)

random_y1= np.random.randint(1,101,100)
random_y2= np.random.randint(1,101,100)

x = ['A', 'B', 'C', 'D']

fig = go.Figure()

fig.add_trace(go.Box(y=random_y1))
fig.add_trace(go.Box(y=random_y2))

fig.show()

水平箱线图

水平箱线图是一种箱线图,其中 x 变量和 y 值在图中水平显示。它可以通过传递箱线图的 x 参数来创建。

import plotly.graph_objects as go
import numpy as np


# creating random data through randomint
# function of numpy.random
np.random.seed(42)

random_x1= np.random.randint(1,101,100)
random_x2= np.random.randint(1,101,100)

x = ['A', 'B', 'C', 'D']

fig = go.Figure()

fig.add_trace(go.Box(x=random_x1))
fig.add_trace(go.Box(x=random_x2))

fig.show()

寻找均值和标准差

可以使用 boxmean 参数找到由boxplot绘制的数据的平均值和标准偏差。它可以取两个值:

True: 显示均值

sd: 为标准差。

import plotly.graph_objects as go
import numpy as np


# creating random data through randomint
# function of numpy.random
np.random.seed(42)

random_x1= np.random.randint(1,101,100)
random_x2= np.random.randint(1,101,100)

x = ['A', 'B', 'C', 'D']

fig = go.Figure()

fig.add_trace(go.Box(x=random_x1, marker_color = 'indianred', boxmean=True))
fig.add_trace(go.Box(x=random_x2, marker_color='royalblue', boxmean='sd'))

fig.show()

更改四分位数的算法

选择四分位数的算法也可以在plotly中选择。默认使用线性算法计算。然而,它提供了两种以上的算法来做同样的事情,即包容性和排斥性。可以通过传递 quartilemethod 参数来完成。

import plotly.graph_objects as go
import numpy as np


# creating random data through randomint
# function of numpy.random
np.random.seed(42)

random_y= np.random.randint(1,101,100)

x = ['A', 'B', 'C', 'D']

fig = go.Figure()

fig.add_trace(go.Box(y=random_y, quartilemethod="linear", name="linear"))
fig.add_trace(go.Box(y=random_y, quartilemethod="inclusive", name="inclusive"))
fig.add_trace(go.Box(y=random_y, quartilemethod="exclusive", name="exclusive"))

fig.show()

显示基础数据

可以使用 boxpoints 参数显示基础数据。这个参数的值可以是三种类型——

all为所有点

outliers 仅异常值

false 不是以上任何一种

import plotly.graph_objects as go
import numpy as np


# creating random data through randomint
# function of numpy.random
np.random.seed(42)

random_y1= np.random.randint(1,101,100)
random_y2= np.random.randint(1,101,100)

x = ['A', 'B', 'C', 'D']

fig = go.Figure()

fig.add_trace(go.Box(y=random_y1, boxpoints="all"))
fig.add_trace(go.Box(y=random_y2, boxpoints="outliers"))

fig.show()

参考文献

  • https://www.geeksforgeeks.org/horizontal-boxplots-with-seaborn-in-python/?ref=lbp
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐