100天精通Python(可视化篇)——第83天:matplotlib绘制不同种类炫酷箱形图参数说明+代码实战(水平、缺口、群组、堆叠、核密度、小提琴箱形图)

文章目录

  • 专栏导读
  • 1. 箱形图介绍
    • 1)箱形图介绍
    • 2)怎么看箱型图?
    • 3)参数说明
  • 2. 普通箱型图
    • 1)绘图
    • 2)解释说明
  • 3. 水平箱形图
  • 4. 带有缺口的箱形图
  • 5. 群组箱形图
  • 6. 堆叠箱形图
  • 7. 核密度估计箱形图
  • 8. 小提琴箱形图

专栏导读

🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html

  • 优点订阅限时9.9付费专栏进入千人全栈VIP答疑群,作者优先解答机会(代码指导、远程服务),群里大佬众多可以抱团取暖(大厂内推机会)
  • 专栏福利简历指导、招聘内推、每周送实体书、80G全栈学习视频、300本IT电子书:Python、Java、前端、大数据、数据库、算法、爬虫、数据分析、机器学习、面试题库等等
    在这里插入图片描述
    在这里插入图片描述

1. 箱形图介绍

1)箱形图介绍

箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理。它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比 较。箱线图的绘制方法是:先找出一组数据的上边缘、下边缘、中位数和两个四分位数;然后, 连接两个四分位数画出箱体;再将上边缘和下边缘与箱体相连接,中位数在箱体中间。箱形图是由首位两个四分位数(Q1,Q3)以及中位数(Q2)组成的,它能够反映出一组数据的基本统计特性,如分布的范围、中位数、变异程度等。

在这里插入图片描述

特点:箱形图是概括性较强的一种图,它能够准确反映出数据的主要特点,包括最大值、最小值、四分位数、中位数和实例数,同时观测异常点。

应用场景:箱形图主要用于比较多组数据的分布情况,它非常适用于表示连续变量的分布和比较,是显著进行数据可视化的一种常用工具。

2)怎么看箱型图?

“盒式图"或叫"盒须图”"箱形图"boxplot(也称箱须图(Box-whiskerPlot)须图又称为箱形图,其绘制须使用常用的统计量,能提供有关数据位置和分散情况的关键信息,尤其在比较不同的母体数据时更可表现其差异。

主要包含六个数据节点,将一组数据从大到小排列,分别计算出他的上边缘,上四分位数Q3,中位数,下四分位数Q1,下边缘,还有一个异常值。标示了图中每条线表示的含义,其中应用到了分位值(数)的概念,如下图所示:

在这里插入图片描述

3)参数说明

matplotlib绘制箱形图的函数是boxplot(),以下是函数代码:

import matplotlib.pyplot as pltplt.boxplot(
x, notch=None, sym=None, vert=None, whis=None,
positions=None, widths=None, patch_artist=None,
bootstrap=None, usermedians=None, conf_intervals=None,
meanline=None, showmeans=None, showcaps=None, showbox=None,
showfliers=None, boxprops=None, labels=None, flierprops=None,
medianprops=None, meanprops=None, capprops=None,
whiskerprops=None, manage_ticks=True, autorange=False,
zorder=None, *, data=None)

参数说明如下:

  • x:要绘制箱形图的数据,可以是一个数组或多个数组。
  • notch:是否绘制缺口箱形图,可选值为True或False,默认为False。
  • sym:指定异常值的标记样式,可选值为点(‘.’)、叉号(‘x’)、圆圈(‘o’)等,默认为None。
  • vert:指定箱形图的方向,可选值为True(竖向)或False(横向),默认为True。
  • patch_artist:是否给箱体填充颜色,可选值为True或False,默认为False。
  • meanline:是否绘制均值线,可选值为True或False,默认为False。
  • showmeans:是否显示均值,可选值为True或False,默认为False。
  • showcaps:是否显示箱线图的上下限制线,可选值为True或False,默认为True。
  • showbox:是否显示箱体,可选值为True或False,默认为True。
  • showfliers:是否显示异常值,可选值为True或False,默认为True。
  • boxprops:指定箱体的属性,如边框颜色、线宽、填充颜色等。
  • whiskerprops:指定箱线图的上下限制线的属性,如颜色、线宽等。
  • capprops:指定箱线图的上下限制线的帽子的属性,如颜色、线宽等。
  • medianprops:指定箱线图的中位数线的属性,如颜色、线宽等。
  • meanprops:指定均值线的属性,如颜色、线宽等。
  • flierprops:指定异常值的属性,如颜色、大小等。
  • manage_xticks:是否自动管理x轴刻度,可选值为True或False,默认为True。
  • labels:指定每个数据集的标签。
  • notch:是否绘制缺口箱形图,可选值为True或False,默认为False。
  • bootstrap:指定计算置信区间时的重抽样次数,默认为10000。

2. 普通箱型图

1)绘图

下面代码绘制一个简单的箱型图,其中Q1、Q3 分别表示上下四分位数;Q2 表示中位数;low_limit、upper_limit 分别表示下限和上限;val 表示异常值。在绘制箱形图时,设置sym="o"即可显示异常值:

import pandas as pd
import matplotlib.pyplot as pltdata = {'num': ['1', '2', '3', '4', '5', '6', '7'],'value': [-15, 7, 10, 15, 20, 33, 5]}
df = pd.DataFrame(data)plt.boxplot(x=df['value'], whis=1.5, widths=0.5, patch_artist=True, showmeans=True, boxprops={'facecolor': 'c'},flierprops={'markerfacecolor': 'red', 'markersize': 4},meanprops={'marker': '*', 'markerfacecolor': 'skyblue'}, medianprops={'linestyle': '--', 'color': 'orange'},capprops={'color': 'r'})Q1 = df['value'].quantile(q=0.25)
Q2 = df['value'].quantile(q=0.5)
Q3 = df['value'].quantile(q=0.75)low_limit = Q1 - 1.5 * (Q3 - Q1)
upper_limit = Q3 + 1.5 * (Q3 - Q1)print('下四分位数:', Q1)
print('中位数:', Q2)
print('上四分位数:', Q3)
print('下限:', low_limit)
print('上限:', upper_limit)# 查找异常值
val = df['value'][(df['value'] > upper_limit) | (df['value'] < low_limit)]
print('异常值:', val)#显示图像
plt.show()

运行结果
在这里插入图片描述

2)解释说明

数学层面理解箱形图每个部分的含义(下四分位线,中位数,上四分位数,上限,下限,异常值,极端异常值):

  • 下四分位数:指数据的25%分位点所对应的值(Q1)
  • 中位数:指数据的50%分位点所对应的值(Q2)
  • 上四分位数:指数据的75%分位点所对应的值(Q3)
  • 上限:上限=Q3+1.5*(Q3-Q1)
  • 下限:下限=Q1-1.5*(Q3-Q1)
  • 异常值的判定标准:当变量的数据值大于上限或小于下限时,判定为异常值

计算方法:

  • 1、.数据集:-15, 7, 10, 15, 20, 33, 5
  • 2、按从小到大的顺序对数据集进行排列:-15, 5, 7, 10, 15, 20, 33
  • 3、确定四分位数索引位置的根据公式:1+(n-1)*数据的百分比分位点,在根据索引位置确定索引所对应的数据值(n是数据集的数量 n=6)
    • Q1_position=1+(6-1)*0.25=2.25 (Q1在第二个数和第三个数之间)
    • Q1_value=15+(36-15)*(2.25-2)=20.25
    • Q2_position=1+(6-1)*0.5=3.5 (Q2在第三个数和第四个数之间)
    • Q2_value=36+(39-36)*(3.5-3)=37.5
    • Q3_position=1+(6-1)*0.75=4.75 (Q3在第四个数和第五个数之间)
    • Q3_value=39+(40-39)*(4.75-4)=39.75
    • 上限=39.75+(39.75-20.25)*1.5=69
    • 下限=20.25-(39.75-20.25)*1.5=-9

极端异常值:

  • 极端上限:上限=Q3+3*(Q3-Q1)
  • 极端下限:下限=Q1-3*(Q3-Q1)
  • 极端异常值的判定标准:当变量的数据值大于极端上限或小于极端下限时,判定为极端异常值

3. 水平箱形图

与基本箱形图类似,但是箱形图是水平的,适用于较长的标签或较短的数据集:

import matplotlib.pyplot as plt
import numpy as np# 生成一组随机数据
np.random.seed(123)
data = np.random.normal(0, 1, 100)# 绘制水平箱形图
fig, ax = plt.subplots(figsize=(8, 4))
ax.boxplot(data, vert=False)# 设置图表标题和坐标轴标签
ax.set_title('Boxplot of Random Data')
ax.set_xlabel('Value')# 显示图表
plt.show()

代码解释

首先导入matplotlib.pyplot和numpy模块。使用numpy.random.normal函数生成一组均值为0、标准差为1的正态分布随机数据。创建一个图表对象fig和一个坐标轴对象ax,并设置图表大小为8x4。使用坐标轴对象的boxplot方法绘制水平箱形图,其中vert=False表示绘制水平箱形图。使用坐标轴对象的set_title和set_xlabel方法设置图表标题和坐标轴标签。使用matplotlib.pyplot的show函数显示图表。

运行结果
在这里插入图片描述

4. 带有缺口的箱形图

在基本箱形图的基础上,为中位数添加一个缺口,以显示置信区间。如果数据中存在离群值(Outlier),箱形图就会失去一些效果。因此,有时候需要绘制带有缺口的箱形图来突出离群值的存在。

在下面示例中,我们使用了 notch=True 参数来绘制缺口。缺口的位置是根据数据分布情况自动计算的。我们还使用了 patch_artist=True 参数来填充箱体的颜色,并使用相应的参数来设置箱体、须、中位数和离群值的样式。最后,我们添加了一些说明来解释图表中的每个部分:

import matplotlib.pyplot as plt
import numpy as np# 生成随机数据
np.random.seed(10)
data = np.random.normal(100, 20, 200)# 计算箱形图的五个关键值
q1, median, q3 = np.percentile(data, [25, 50, 75])
iqr = q3 - q1
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr# 绘制箱形图
fig, ax = plt.subplots()
ax.boxplot(data, notch=True, vert=False, widths=0.7, patch_artist=True,boxprops=dict(facecolor='pink', color='black'),whiskerprops=dict(color='black'),medianprops=dict(color='black'),capprops=dict(color='black'))# 绘制离群值
outliers = data[(data < lower_bound) | (data > upper_bound)]
ax.scatter(outliers, np.ones(len(outliers)), marker='o', color='black')# 设置坐标轴
ax.set_yticks([1])
ax.set_yticklabels(['Data'])
ax.set_xlim([80, 120])
ax.axvline(lower_bound, linestyle='--', color='black')
ax.axvline(upper_bound, linestyle='--', color='black')# 添加说明
ax.text(lower_bound - 2, 1.1, 'Lower\nOutliers', fontsize=10)
ax.text(upper_bound + 2, 1.1, 'Upper\nOutliers', fontsize=10)
ax.text(q1 - 2, 1.2, 'Q1', fontsize=10)
ax.text(median - 2, 1.2, 'Median', fontsize=10)
ax.text(q3 - 2, 1.2, 'Q3', fontsize=10)plt.show()

运行结果
在这里插入图片描述

5. 群组箱形图

群组箱形图(Grouped box plot)是一种用于比较多组数据分布情况的图表。它用于比较两个或多个数据集的中位数、四分位数和异常值。可以将多组数据按照分类变量分组,并在同一图表中展示出来,以便于比较不同组之间的差异。

在下面示例中,我们使用了 labels 参数将数据按照分类变量分组,并使用了 vert=False 参数将图表方向设置为水平方向。我们还使用了相应的参数来设置箱体、须、中位数的样式,并使用了 patch_artist=True 参数来填充箱体的颜色。最后,我们添加了标题和标签来解释图表的含义:

import matplotlib.pyplot as plt
import numpy as np# 生成随机数据
np.random.seed(10)
data1 = np.random.normal(100, 20, 200)
data2 = np.random.normal(80, 15, 200)
data3 = np.random.normal(120, 25, 200)
data4 = np.random.normal(90, 10, 200)# 将数据按照分类变量分组
data = [data1, data2, data3, data4]
labels = ['Group 1', 'Group 2', 'Group 3', 'Group 4']# 绘制群组箱形图
fig, ax = plt.subplots()
ax.boxplot(data, labels=labels, vert=False, patch_artist=True,boxprops=dict(facecolor='pink', color='black'),whiskerprops=dict(color='black'),medianprops=dict(color='black'),capprops=dict(color='black'))# 设置坐标轴
ax.set_xlim([50, 150])# 添加标题和标签
ax.set_title('Grouped Box Plot')
ax.set_xlabel('Value')
ax.set_ylabel('Group')plt.show()

运行结果
在这里插入图片描述

6. 堆叠箱形图

堆叠箱形图(Stacked box plot)是一种用于比较两个或多个数据集的分布情况,将箱形图堆叠在一起。它可以将多组数据按照分类变量分组,并在同一图表中展示出来,并且在每个组内部又按照另一个分类变量进行分层,以便于比较不同组之间和不同层之间的差异。

堆叠箱形图显示了三个组之间的分布,每个组有100个观测值。每个箱子代表每个组的中位数、上下四分位数和最大/最小值。箱子的颜色表示每个组的标识符,即Group 1、Group 2和Group 3。可以看到,Group 1和Group 3的数据分布相似,而Group 2的数据分布略有不同:

import matplotlib.pyplot as plt
import numpy as np# 生成数据集
np.random.seed(123)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]# 绘制堆叠箱形图
fig, ax = plt.subplots(figsize=(10, 6))
ax.boxplot(data, vert=True, patch_artist=True, labels=['Group 1', 'Group 2', 'Group 3'])# 显示网格
plt.grid(True)  # 设置箱子颜色
colors = ['#0000FF', '#FFA500', '#00FFFF']
for patch, color in zip(ax.artists, colors):patch.set_facecolor(color)# 添加标题和标签
ax.set_title('Stacked Boxplot')
ax.set_xlabel('Groups')
ax.set_ylabel('Values')# 展示图表
plt.show()

运行结果
在这里插入图片描述

7. 核密度估计箱形图

核密度估计箱形图是一种结合了核密度估计和箱形图的图表,添加核密度估计曲线,它可以更准确地反映数据的分布情况,并且能够同时显示出异常值等信息:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns# 生成一组随机数据
np.random.seed(123)
data = np.random.normal(0, 1, 100)# 绘制核密度估计箱形图
fig, ax = plt.subplots(figsize=(8, 4))
sns.boxplot(x=data, ax=ax, color='lightblue')
sns.kdeplot(x=data, ax=ax, color='blue', linewidth=2)# 设置图表标题和坐标轴标签
ax.set_title('Kernel Density Estimation Boxplot of Random Data')
ax.set_xlabel('Value')# 显示图表
plt.show()

代码解释

首先导入matplotlib.pyplot、numpy和seaborn模块。使用numpy.random.normal函数生成一组均值为0、标准差为1的正态分布随机数据。创建一个图表对象fig和一个坐标轴对象ax,并设置图表大小为8x4。使用seaborn的boxplot方法绘制箱形图,并设置颜色为'lightblue'。使用seaborn的kdeplot方法绘制核密度估计图,并设置颜色为'blue'、线宽为2。使用坐标轴对象的set_title和set_xlabel方法设置图表标题和坐标轴标签。使用matplotlib.pyplot的show函数显示图表。

运行结果
在这里插入图片描述

8. 小提琴箱形图

小提琴箱形图是一种结合了箱形图和核密度估计的图表,它可以更好地反映数据的分布情况,并且能够同时显示出异常值等信息:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns# 生成一组随机数据
np.random.seed(123)
data = np.random.normal(0, 1, 100)# 绘制小提琴箱形图
fig, ax = plt.subplots(figsize=(8, 4))
sns.violinplot(x=data, ax=ax, color='lightblue', inner='stick', linewidth=2)# 设置图表标题和坐标轴标签
ax.set_title('Violinplot of Random Data')
ax.set_xlabel('Value')# 显示图表
plt.show()

代码解释

首先导入matplotlib.pyplot、numpy和seaborn模块。使用numpy.random.normal函数生成一组均值为0、标准差为1的正态分布随机数据。创建一个图表对象fig和一个坐标轴对象ax,并设置图表大小为8x4。使用seaborn的violinplot方法绘制小提琴箱形图,并设置颜色为'lightblue'、内部样式为'stick'、线宽为2。使用坐标轴对象的set_title和set_xlabel方法设置图表标题和坐标轴标签。使用matplotlib.pyplot的show函数显示图表。

运行结果
在这里插入图片描述

查看全文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/2265997.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章:

在这里插入图片描述

100天精通Python(可视化篇)——第83天:matplotlib绘制不同种类炫酷箱形图参数说明+代码实战(水平、缺口、群组、堆叠、核密度、小提琴箱形图)

文章目录专栏导读1. 箱形图介绍1)箱形图介绍2)怎么看箱型图?3)参数说明2. 普通箱型图1)绘图2)解释说明3. 水平箱形图4. 带有缺口的箱形图5. 群组箱形图6. 堆叠箱形图7. 核密度估计箱形图8. 小提琴箱形图专栏……

第3章 matplotlib数据可视化基础 课后习题

1.选择题 (1)以下关于绘图标准流程说法错误的是(B) A.绘制最简单的图形可以不用创建画布 B.添加图例可以在绘制图形之前 C.添加x轴、y轴的标签可以在绘制图形之前 D.修改x轴标签、y轴标签和绘制图形没有先后 (2)下列参数中调整后显示中文的是© A.lines.linestyle B.lines.……

第4章 pandas统计分析基础 课后习题

1.选择题 (1)下列关于pandas数据读/写说法错误的是(A) A.read_csv能够读取所有文本文档的数据 B.read_sql能够读取数据库的数据 C.to_csv函数能够将结构化数据写入.csv文件 D.to_excel函数能够将结构化数据写入.Excel文件 (2)下列loc、iloc、ix属性的用法正确的是(D) A.df.loc[……

第5章 使用pandas进行数据预处理 课后习题

1.选择题 (1)数据质量包含的要素有(D) A.准确性、完整性 B.一致性、可解释性 C.时效性、可信性 D.以上所有要素 (2)以下关于数据分析预处理的过程描述正确的是© A.数据清洗包括了数据标准化、数据合并和缺失值处理 B.数据合并按照合并轴方向主要分为左连接、右连接、内连接……

第6章 使用scikit-learn构建模型 课后习题

1.选择题 (1)下列关于sklearn说法错误的是(B) A.sklearn全称为scikit-learn B.sklearn在官网被分为7个大块 C.sklearn的聚类算法几乎已经放在culster模块中了 D.sklearn需要Numpy和SciPy库的支持 (2)下列关于train_test_split函数的说法正确的是(D) A.train_test_split能够将数……

1001 害死人不偿命的(3n+1)猜想

#include <stdio.h>
int main()
{int n,count0;scanf("%d",&n);while(n!1){if(n%20)nn/2;elsen(3*n1)/2;count;}printf("%d",count);return 0;
}…

1010 一元多项式求导

这个思路有一点错误还未找到,希望帮忙解决一下
#include <stdio.h>
int main()
{int a,b,flag0;while(1){scanf("%d %d",&a,&b);if(a0&&b0) //零多项式{printf("0 0");break;}else if(a!0&&b!0) //系数不为0{……

1036 跟奥巴马一起编程

#include <stdio.h>
int main()
{int a;char ch;scanf("%d %c",&a,&ch);for(int i1;i<a;i)//第一行 printf("%c",ch);printf("\n");for(int i2;i<(a-1)/2;i){printf("%c",ch);for(int j2;j<a-1;j)printf(&quot……

StarRocks集群部署

文章目录StarRocks集群部署准备工作硬件要求操作系统软件要求系统环境集群部署集群监控集群审计日志采集StarRocks集群部署
准备工作
分类描述说明硬件要求集群至少拥有两台物理或虚拟节点。BE 节点 CPU 需支持 AVX2 指令集。各节点间需要通过万兆网卡及万兆交换机连接。FE 节……

1063 计算谱半径

解题思路:此题较为简单,先建立一个双精度型的数组,用来存储每对实部的
平方与虚部的平方和,再设一个max,找出最大值,最后对最大值开
方取两位小数即可.#include <stdio.h>
#include <math.h>
int main()
{int n,a,b,p0;double k[11000],max;scanf("%d",&……

杭州旭航集团,申请纳斯达克IPO上市,募资9800万美元

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,为中国企业提供数字内容营销服务的杭州旭航网络科技有限公司的控股公司Xuhang Holdings Ltd(以下简称:旭航集团),近期已向美国证券交易委员会(SEC)提……

深度学习快速参考:11~13

原文:Deep Learning Quick Reference 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如何实现目……

基于copula的风光联合场景生成与缩减

目录
1 主要内容
风光出力场景生成方法
2 部分程序
3 程序结果
4 程序链接
点击直达! 1 主要内容
该程序方法复现《融合风光出力场景生成的多能互补微网系统优化配置》风光出力场景生成部分,目前大多数研究的是不计风光出力之间的相关性影响&amp……

TS 使用自动提示生成对象中的键

TS 使用自动提示生成对象中的键
使用 plain object 而不是 class 的原因主要是在于 redux 中保存的对象需要为可序列化的对象。当然,具体操实现的时候肯定是可以无视这个需求的,不过 Redux 团队强烈建议使用可序列化对象,具体的官方文档说明……

Spring Boot概述(一)

1. SpringBoot 概述
1.1 SpringBoot 概念
SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的……

计算机笔试/面试常见逻辑题/智力题汇总

说明:按种类汇总,难度不分先后,做了分级罗列,方便后续扩充,大家有比较有意思的题目可以在讨论区讨论。 下面有的题题解相对复杂的直接参考了网上的一些解答,而有的题解我认为并不好的也做了补充&#xff0c……

OpenAI文档翻译——搭建第一个自己的ChatGPT应用

这篇主要是讲了重头到位创建一个基于OpenAI API的应用程序的过程,同时给出了Node.js、Python版本的实例代码。应用程序的构建总体来说是很简单的就是一个接口调用,前提是我们需要提供密匙。
如果想要获取更好的结果返回一个是可以给模型提供一些列子从而……

python以及PyCharm工具的环境安装与配置

这里以Windows为例
Python的安装
当然是到Python官网下载咯,https://www.python.org/downloads/点我直达,如图: 可以下载最新版本,可以下拉找到之前特定的版本安装,如图: 这里先择的是最新版的进行安装……

JavaScript【六】JavaScript中的字符串(String)

文章目录🌟前言🌟字符串(String)🌟单引号和双引号的区别🌟属性🌟 length :字符串的长度🌟 方法🌟 str.charAt(index);🌟 str.charCodeAt(index);🌟 String.fromCharCode(……

获取文件MD5小案例(未拆分文件)

文章目录前端获取MD5后端获取MD5前端获取MD5
1、引入js
<script src"js/spark-md5.min.js" type"text/javascript"></script>注:spark-md5库GitHub链接 2、这里是一个按钮和被隐藏调的<input/>标签 <body><button……

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注