箱线图异常值总是干扰分析?,一文解决ggplot2 geom_boxplot outlier剔除与标注难题

第一章:箱线图异常值的本质与ggplot2默认行为

箱线图(Boxplot)是一种用于展示数据分布与识别异常值的经典可视化工具。其核心原理基于四分位距(IQR),即上四分位数(Q3)与下四分位数(Q1)之差。根据Tukey规则,任何小于 Q1 - 1.5×IQR 或大于 Q3 + 1.5×IQR 的数据点被视为潜在异常值,并在图中以孤立点形式呈现。

ggplot2中的异常值检测机制

R语言中ggplot2包绘制箱线图时,默认采用上述Tukey规则自动识别并标出异常值。这些点不会影响箱体本身的高度,但会在图中以离散点显示,便于快速识别极端值。 例如,使用以下代码绘制mtcars数据集中mpg的分布:

library(ggplot2)

# 绘制箱线图并显示异常值
ggplot(mtcars, aes(x = "", y = mpg)) +
  geom_boxplot() +
  labs(title = "MPG 分布箱线图", y = "Miles per Gallon") +
  theme_minimal()
该代码中,geom_boxplot()会自动计算IQR并标记符合异常值定义的数据点。图形输出中,圆点代表超出须线范围的观测值。

异常值判定标准的内部逻辑

以下是ggplot2判断异常值的关键步骤:
  1. 计算第一四分位数(Q1)和第三四分位数(Q3)
  2. 求出四分位距:IQR = Q3 - Q1
  3. 设定上下阈值:下限 = Q1 - 1.5×IQR,上限 = Q3 + 1.5×IQR
  4. 将落在阈值外的点渲染为异常值点
统计量数值(示例)
Q1 (mpg)15.4
Q3 (mpg)25.8
IQR10.4
异常值上限41.4

第二章:理解geom_boxplot中outlier的生成机制

2.1 箱线图四分位距(IQR)与异常值判定原理

四分位距的基本概念
箱线图通过五数概括(最小值、第一四分位数 Q1、中位数、第三四分位数 Q3、最大值)展示数据分布。其中,四分位距(Interquartile Range, IQR)定义为:
IQR = Q3 - Q1
该指标衡量中间50%数据的离散程度,对异常值不敏感,是识别异常点的核心工具。
异常值判定规则
基于 IQR,通常将超出以下范围的数据视为异常值:
  • 下界:Q1 - 1.5 × IQR
  • 上界:Q3 + 1.5 × IQR
落在边界之外的点被标记为异常值,常在箱线图中以圆点或星号形式呈现。
实际应用示例
使用 Python 计算 IQR 并识别异常值:
import numpy as np
data = np.array([12, 15, 17, 19, 20, 21, 22, 23, 25, 30, 50])
Q1 = np.percentile(data, 25)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = data[(data < lower_bound) | (data > upper_bound)]
上述代码中,np.percentile 计算分位数,最终筛选出超出边界的异常值(如 50),体现 IQR 在实际数据清洗中的有效性。

2.2 ggplot2如何自动识别并绘制outlier点

ggplot2 本身不直接“识别”异常值,而是通过统计变换层(如箱线图)间接展示。在绘制箱线图时,`geom_boxplot()` 会依据四分位距(IQR)规则自动标出超出上下须范围的点作为异常值。
箱线图中的异常值判定机制
箱线图使用如下规则识别异常值:
  • 计算第一四分位数(Q1)与第三四分位数(Q3)
  • 四分位距 IQR = Q3 - Q1
  • 下限:Q1 - 1.5×IQR,上限:Q3 + 1.5×IQR
  • 超出范围的点被视为异常值并单独绘制
代码示例与参数解析
library(ggplot2)
ggplot(mtcars, aes(x = "", y = mpg)) +
  geom_boxplot() +
  labs(title = "MPG 分布及异常值")
该代码绘制 mtcars 数据集中 mpg 的箱线图。`geom_boxplot()` 默认启用 outlier 显示,其内部调用 `stat_boxplot` 计算统计量,并将超出须端的点以圆点形式标出。可通过 `outlier.colour`、`outlier.shape` 等参数自定义异常点样式。

2.3 outlier显示参数outlier.shape、outlier.color的控制逻辑

在可视化图表中,异常值(outlier)的呈现可通过 `outlier.shape` 和 `outlier.color` 参数进行精细化控制。这两个参数通常用于箱线图或小提琴图中,以增强数据异常点的可辨识度。
参数作用说明
  • outlier.shape:控制异常点的形状,如圆形(circle)、三角形(triangle)等;
  • outlier.color:设置异常点的颜色,便于区分不同组别或突出警示级别。
代码示例与分析
import seaborn as sns
sns.boxplot(data=df, x="category", y="value", 
            flierprops=dict(marker='o', markerfacecolor='red', markersize=6))
上述代码中,`flierprops` 字典用于自定义异常值显示属性。其中: - `marker='o'` 对应 `outlier.shape`,设定为圆形; - `markerfacecolor='red'` 实现 `outlier.color` 红色填充,提升视觉警示效果。

2.4 不同数据分布下outlier表现差异的案例分析

在实际数据分析中,异常值(outlier)的表现受数据分布形态显著影响。以正态分布与偏态分布为例,可观察其检测结果的显著差异。
正态分布下的异常值检测
对于服从正态分布的数据,Z-score 方法较为有效:
# 使用Z-score检测异常值
import numpy as np
z_scores = (data - np.mean(data)) / np.std(data)
outliers = data[np.abs(z_scores) > 3]
该方法假设数据对称分布,阈值±3覆盖约99.7%的数据点,适用于理想正态情况。
偏态分布中的误判风险
在右偏数据中,IQR 方法更稳健:
  • Q1 和 Q3 分别为第一、第三四分位数
  • 异常值边界:[Q1 - 1.5×IQR, Q3 + 1.5×IQR]
  • 不受极端值影响,适应非对称结构
分布类型适用方法误检率
正态分布Z-score
偏态分布IQR较低

2.5 关闭与隐藏outlier的两种基础方法对比

在处理时间序列或统计分析中的异常值(outlier)时,关闭与隐藏是两种常见策略。它们虽目标相似,但实现机制和影响存在显著差异。
方法一:直接关闭outlier
该方法通过过滤机制从数据流中移除异常值,确保其不参与后续计算。
# 示例:使用IQR规则过滤outlier
Q1 = df['value'].quantile(0.25)
Q3 = df['value'].quantile(0.75)
IQR = Q3 - Q1
filtered_df = df[~((df['value'] < (Q1 - 1.5 * IQR)) | (df['value'] > (Q3 + 1.5 * IQR)))]
此代码基于四分位距(IQR)识别并剔除异常点。逻辑严谨,适用于需净化数据集的场景,但可能导致信息丢失。
方法二:视觉隐藏而非删除
隐藏outlier常用于可视化层面,保留原始数据完整性。
  • 仅在图表渲染时屏蔽异常点显示
  • 支持动态切换,便于对比分析
  • 适合监控系统中临时遮蔽噪声
维度关闭outlier隐藏outlier
数据完整性破坏性保留
适用阶段预处理展示层

第三章:精准剔除outlier的三种实战策略

3.1 预处理阶段基于IQR规则手动过滤异常值

在数据预处理过程中,异常值的存在可能严重影响模型训练效果。采用IQR(Interquartile Range)规则是一种稳健的统计方法,能够有效识别并过滤数值型特征中的离群点。
IQR计算逻辑
IQR定义为上四分位数(Q3)与下四分位数(Q1)之差,异常值边界通常设定为:
  • 下界:Q1 - 1.5 × IQR
  • 上界:Q3 + 1.5 × IQR
代码实现示例
import numpy as np

def remove_outliers_iqr(data):
    Q1 = np.percentile(data, 25)
    Q3 = np.percentile(data, 75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    return data[(data >= lower_bound) & (data <= upper_bound)]
该函数接收一维数组,返回剔除异常值后的子集。参数说明:`np.percentile`用于计算分位数,逻辑判断通过布尔索引实现高效过滤。

3.2 使用coord_cartesian()实现视觉裁剪而不删除数据

在数据可视化中,有时需要聚焦于特定范围的数据显示,但又不希望丢失原始数据信息。coord_cartesian() 函数提供了一种视觉裁剪机制,仅调整坐标轴的显示范围,而不会从数据集中删除任何观测值。
函数基本用法
ggplot(data, aes(x = x_var, y = y_var)) +
  geom_point() +
  coord_cartesian(xlim = c(0, 10), ylim = c(5, 15))
上述代码将图形的横轴限制在0到10之间,纵轴限制在5到15之间。与subset()filter()不同,所有数据仍参与统计计算,仅视图被裁剪。
与scale_*()裁剪的区别
  • scale_x/y_continuous(limits = ...)会剔除范围外的数据点
  • coord_cartesian()仅改变观察窗口,保留完整数据结构
  • 适用于需保持统计完整性的同时实现局部放大

3.3 自定义stat_summary结合几何对象替代默认boxplot

在ggplot2中,`stat_summary`允许用户通过自定义函数替换默认箱线图的统计逻辑,实现更灵活的数据可视化。
核心优势与应用场景
相比标准`geom_boxplot`,`stat_summary`可精确控制显示的统计量,如均值、标准差或置信区间,适用于需要突出特定指标的场景。
代码实现示例

ggplot(mtcars, aes(x = factor(cyl), y = mpg)) +
  stat_summary(fun.y = mean, geom = "point", size = 3, color = "blue") +
  stat_summary(fun.data = mean_cl_normal, geom = "errorbar", width = 0.2)
该代码使用`mean_cl_normal`计算均值及95%置信区间,`fun.y`指定中心点,`fun.data`返回上下限。`geom="errorbar"`绘制误差线,实现对传统箱线图的精简替代。
参数说明
  • fun.y:接收单个数值输出的函数,如mean、median;
  • fun.data:返回数据框的函数,如mean_cl_boot;
  • geom:指定几何对象类型,支持point、linerange等。

第四章:异常值的智能标注与可视化增强技巧

4.1 保留箱线图结构同时高亮关键outlier点

在数据可视化中,箱线图能有效展示数据分布与异常值。为突出关键离群点,可在保留原始结构基础上进行视觉增强。
高亮策略设计
通过颜色和形状区分普通与关键outlier点,提升可读性:
  • 普通outlier:默认标记(如小圆点)
  • 关键outlier:红色三角或星形标记
  • 使用透明度避免视觉拥挤
实现代码示例
import matplotlib.pyplot as plt
import numpy as np

data = np.random.normal(0, 1, 100)
outliers = data[np.abs(data) > 2.5]

plt.boxplot(data, showfliers=False)  # 隐藏默认异常点
plt.scatter([1]*len(outliers), outliers, color='red', marker='^', zorder=5)
plt.show()
该代码先关闭默认异常点显示,再用散点图单独绘制关键outlier,zorder确保其位于顶层,marker='^'实现三角标记,从而实现结构保留与重点突出的平衡。

4.2 结合geom_text或geom_label标记特定异常值

在数据可视化中,识别并标注异常值是提升图表洞察力的关键步骤。`ggplot2` 提供了 `geom_text()` 和 `geom_label()` 函数,可在散点图中精准标注特定数据点。
基础用法对比
`geom_text()` 在指定位置添加文本标签,而 `geom_label()` 会为文本添加背景框,增强可读性。两者常与条件子集结合使用,仅标注满足条件的异常点。

# 示例:标记高残差异常值
ggplot(data, aes(x = x_var, y = y_var)) +
  geom_point() +
  geom_text(data = subset(data, residual > 3),
            aes(label = rownames(data)), color = "red")
上述代码通过 `subset()` 筛选出残差大于3的观测,并用红色文字标注其行名。参数 `aes(label = ...)` 指定标签内容,`color` 控制字体颜色。
优化标注布局
为避免标签重叠,可使用 `ggrepel::geom_text_repel()` 自动调整位置,提升图表整洁度。

4.3 分面(facet)与分组中outlier标注的一致性处理

在数据可视化中,分面(facet)与分组操作常用于多维度数据的对比分析。当涉及异常值(outlier)标注时,保持跨子图或分组间标注逻辑的一致性至关重要。
统一的outlier判定标准
为确保一致性,应采用全局阈值而非局部统计量来识别outlier。例如,使用整体IQR(四分位距)而非每个facet独立计算:

import numpy as np
Q1 = np.percentile(data, 25)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
上述代码计算全局上下界,所有分面共享该阈值,避免因局部分布差异导致误标。
标注策略同步机制
  • 统一标记符号:所有facet使用相同形状(如红色三角形)表示outlier
  • 坐标映射对齐:确保各子图坐标轴范围一致,使outlier位置可比
  • 图例集中管理:通过共享图例说明标注含义,提升可读性

4.4 使用alpha和size实现异常值密度感知表达

在可视化高维数据分布时,识别异常值的关键在于捕捉局部密度差异。通过调整散点图中点的透明度(alpha)和尺寸(size),可有效增强对数据密度的感知能力。
视觉编码原理
低 alpha 值使重叠点叠加更明显,密集区域自然显现为颜色更深的簇;而异常值因孤立存在,即使透明度低也不易融合,形成视觉对比。同时,根据点的局部密度动态调整 size,能进一步放大稀疏区域的观察权重。
代码实现示例
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde

# 计算密度
x, y = np.random.randn(2, 1000)
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)

plt.scatter(x, y, c=z, s=10+z*50, alpha=0.5, cmap='viridis')
plt.colorbar(label='Density')
plt.show()
该代码利用核密度估计(KDE)计算每点局部密度,并将密度映射到点的大小与透明度。高密度区域点更大、更不透明,异常值则表现为小而淡的离群点,实现直观的密度感知表达。

第五章:综合应用建议与进阶可视化思路

构建可复用的监控组件库
在大型系统中,重复编写相似的监控图表配置会降低运维效率。建议将常用的 Prometheus 查询与 Grafana 面板封装为可复用的组件。例如,针对 HTTP 服务的延迟、错误率和流量(黄金三指标)可定义统一模板:

{
  "title": "HTTP 服务 SLO 监控",
  "targets": [
    {
      "expr": "rate(http_request_duration_seconds_count{job='api'}[5m])",
      "legendFormat": "QPS"
    },
    {
      "expr": "histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket{job='api'}[5m])) by (le))",
      "legendFormat": "P99 Latency"
    }
  ]
}
引入机器学习进行异常检测
传统阈值告警易产生误报。可结合 Prometheus 数据导出至时序分析平台(如 Thanos 或 VictoriaMetrics),利用 Facebook Prophet 或 LSTM 模型预测正常区间。例如,使用 Python 对磁盘增长率建模:

// 示例:获取连续7天的磁盘使用数据
query := `avg by(instance) (node_filesystem_usage{job="node"})`
// 输入时间序列后,使用滑动窗口计算增长斜率,识别突增趋势
多维度下钻分析设计
在 Grafana 中配置变量(Variables)实现动态过滤。例如添加 clusternamespaceservice 变量,使同一仪表板适用于多环境。关键字段应支持点击下钻,从集群视图逐层进入 Pod 级别资源使用。
可视化层级核心指标推荐图表类型
集群概览CPU/Memory/Load热力图 + 时间序列
服务性能延迟、错误率、吞吐直方图叠加曲线
单实例诊断GC 时间、线程数、FD 使用条形图 + 状态标记
内容概要:本文档围绕六自由度机械臂的ANN人工神经网络设计展开,涵盖正向逆向运动学求解、正向动力学控制,并采用拉格朗日-欧拉法推导逆向动力学方程,所有内容均通过Matlab代码实现。同时结合RRT路径规划B样条优化技术,提升机械臂运动轨迹的合理性平滑性。文中还涉及多种先进算法仿真技术的应用,如状态估计中的UKF、AUKF、EKF等滤波方法,以及PINN、INN、CNN-LSTM等神经网络模型在工程问题中的建模求解,展示了Matlab在机器人控制、智能算法系统仿真中的强大能力。; 适合人群:具备一定Ma六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)tlab编程基础,从事机器人控制、自动化、智能制造、人工智能等相关领域的科研人员及研究生;熟悉运动学、动力学建模或对神经网络在控制系统中应用感兴趣的工程技术人员。; 使用场景及目标:①实现六自由度机械臂的精确运动学动力学建模;②利用人工神经网络解决传统解析方法难以处理的非线性控制问题;③结合路径规划轨迹优化提升机械臂作业效率;④掌握基于Matlab的状态估计、数据融合智能算法仿真方法; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解运动学建模神经网络控制的设计流程,关注算法实现细节仿真结果分析,同时参考文中提及的多种优化估计方法拓展研究思路。
<think>我们参考了多个引用,其中引用[1]和[2]介绍了使用ggplot2geom_boxplot函数绘制基础分组箱图的方法。引用[3]展示了一个更复杂的例子,包括添加统计显著性标记。引用[4]则介绍了缺口箱图(notch boxplot)的绘制,并解释了异常值的处理。 用户需求:获取geom_boxplot的使用方法指南。 我们将从以下几个方面进行说明: 1. 基本语法和参数 2. 绘制基础分组箱图 3. 绘制缺口箱图(notch boxplot) 4. 异常值的处理 5. 添加统计显著性标记(参考引用[3]) 注意:所有代码示例均使用R语言和ggplot2包。 ### 1. 基本语法和参数 `geom_boxplot`函数的基本语法如下(参考引用[4]): ```r geom_boxplot( mapping = NULL, data = NULL, stat = "boxplot", position = "dodge2", ..., outlier.colour = NULL, outlier.color = NULL, outlier.fill = NULL, outlier.shape = 19, outlier.size = 1.5, outlier.stroke = 0.5, outlier.alpha = NULL, notch = FALSE, notchwidth = 0.5, varwidth = FALSE, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE ) ``` 常用参数说明: - `outlier.colour`, `outlier.shape`, `outlier.size`: 分别设置异常点的颜色、形状和大小。 - `notch`: 逻辑值,是否绘制缺口箱图(用于中位数的置信区间比较)。 - `varwidth`: 逻辑值,是否使箱图的宽度样本量的平方根成比例。 ### 2. 绘制基础分组箱图 以下是一个基础分组箱图的示例(参考引用[2]): ```r library(ggplot2) # 使用ToothGrowth数据集,将dose转换为因子 ToothGrowth$dose <- as.factor(ToothGrowth$dose) # 基础箱图 p <- ggplot(ToothGrowth, aes(x = dose, y = len)) + geom_boxplot() p ``` 在这个例子中,x轴是剂量(dose),y轴是牙齿长度(len)。由于dose被转换为因子,因此每个剂量水平都会绘制一个箱图。 ### 3. 绘制缺口箱图 缺口箱图(notch boxplot)可以显示中位数周围的置信区间,用于比较不同组的中位数是否有显著差异(参考引用[4])。如果两个箱图的缺口不重叠,则表明中位数可能有显著差异。 ```r # 缺口箱图 p_notch <- ggplot(ToothGrowth, aes(x = dose, y = len)) + geom_boxplot(notch = TRUE) p_notch ``` ### 4. 异常值的处理 在箱图中,异常值outliers)通常被定义为超出四分位距(IQR)1.5倍的范围。在`geom_boxplot`中,我们可以通过设置异常点的颜色、形状等来突出显示。 - 温和异常值:在内限外限之间的值(1.5倍IQR到3倍IQR) - 极端异常值:在外限以外的值(超过3倍IQR) 在绘制时,我们可以通过参数调整异常点的外观,例如: ```r p_outlier <- ggplot(ToothGrowth, aes(x = dose, y = len)) + geom_boxplot(outlier.colour = "red", outlier.shape = 8, outlier.size = 3) p_outlier ``` ### 5. 添加统计显著性标记 引用[3]展示了如何添加组间比较的显著性标记。我们可以使用`geom_signif`函数(需要`ggsignif`包)来添加统计检验结果。 ```r # 安装ggsignif包(如果未安装) # install.packages("ggsignif") library(ggsignif) # 假设我们有两个组进行比较 compaired <- list(c("0.5", "1"), c("1", "2")) ggplot(ToothGrowth, aes(x = dose, y = len)) + geom_boxplot() + geom_signif(comparisons = compaired, map_signif_level = TRUE, test = wilcox.test, # 使用Wilcoxon秩和检验 step_increase = 0.1) ``` ### 总结 以上是`geom_boxplot`函数的基本使用指南,包括基础分组箱图、缺口箱图、异常值处理以及添加统计显著性标记。用户可以根据实际需求调整参数和图形细节。 §§相关问题§§ 1. 如何调整ggplot2箱图的颜色和样式? 2. 箱线图中的异常值如何处理? 3. 如何比较多个分组箱图之间的统计显著性? </think>以下是`geom_boxplot`函数的使用指南,基于R语言ggplot2包的应用实践: ### 1. 基础分组箱图绘制 ```r library(ggplot2) # 使用内置数据集 p <- ggplot(ToothGrowth, aes(x = dose, y = len)) + geom_boxplot() print(p) ``` - 📌 **核心参数**: - `x`:分组变量(需转为因子) - `y`:数值型变量 - `outlier.colour`:异常点颜色(默认`"black"`) - `outlier.shape`:异常点形状(默认`16`实心圆) - `outlier.size`:异常点大小(默认`1.5`) - 📊 **输出**:展示不同剂量组(dose)牙齿长度(len)的分布[^2] --- ### 2. 缺口箱图(Notch Boxplot) ```r ggplot(ToothGrowth, aes(x = dose, y = len)) + geom_boxplot( notch = TRUE, # 启用缺口 notchwidth = 0.5, # 缺口宽度 outlier.color = "red" # 异常点设为红色 ) ``` - ⚠️ **缺口意义**: - 缺口显示中位数95%置信区间:$中位数 \pm 1.58 \times \frac{IQR}{\sqrt{n}}$ - 若两箱图缺口不重叠,表明组间中位数差异显著[^4] - 📈 **应用场景**:组间中位数差异的直观统计检验 --- ### 3. 多分组箱图统计检验 ```r # 添加分组颜色和显著性标记 ggplot(data, aes(x = group1, y = value, fill = group2)) + geom_boxplot() + ggsignif::geom_signif( comparisons = list(c("A", "B"), c("B", "C")), # 比较组 test = wilcox.test, # 统计检验方法 map_signif_level = TRUE, # 自动标注星号 step_increase = 0.1 # 标注位置调整 ) ``` - 🔍 **高级功能**: - `fill`参数:按第二分组变量着色 - `geom_signif`:添加组间统计检验结果(需安装ggsignif包) - `stat_boxplot(geom = "errorbar")`:添加误差线[^3] --- ### 4. 异常值处理策略 箱图自动识别两类异常值(基于IQR): - 🟡 **温和异常值**:$1.5IQR < |x| \leq 3IQR$ - 建议保留或用缺失值处理 - 🔴 **极端异常值**:$|x| > 3IQR$ - 可直接删除或替换为缺失值[^4] --- ### 5. 最佳实践技巧 1. **数据预处理**: ```r ToothGrowth$dose <- as.factor(ToothGrowth$dose) # 连续变量转因子 ``` 2. **美学定制**: ```r geom_boxplot(color = "black", # 箱线边框色 alpha = 0.7, # 透明度 width = 0.6) # 箱体宽度 ``` 3. **组合图形**: ```r ggplot(...) + geom_boxplot() + geom_jitter(width = 0.1) # 添加数据点避免重叠 ``` > 💡 完整文档见[ggplot2官方文档](https://ggplot2.tidyverse.org/reference/geom_boxplot.html)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值