【实战指南】如何用Python绘制带置信椭圆的PCA双标图?附完整代码
1. PCA双标图与置信椭圆的核心价值主成分分析PCA是数据降维的经典方法但在生物信息学和多组学数据分析中单纯展示样本点在二维空间的分布往往不够。我第一次处理基因表达数据时就踩过坑——虽然能看到样本聚类但完全不明白哪些基因在驱动这种分布模式。这就是为什么我们需要双标图Biplot和置信椭圆的组合可视化。双标图的精妙之处在于它同时呈现了两个维度的信息样本分布展示降维后的数据点聚类情况变量载荷用箭头表示原始高维特征对主成分的贡献度而置信椭圆则像给每个类别画了个势力范围椭圆大小反映类内离散程度。实测下来这种组合能快速回答三个关键问题不同组别的样本是否显著分离哪些原始变量如基因、代谢物主导了这种分离组内变异程度如何2. 环境准备与数据模拟2.1 安装必要库建议使用conda创建虚拟环境conda create -n pca_plot python3.8 conda activate pca_plot pip install numpy matplotlib scikit-learn pandas2.2 模拟多组学数据我们模拟三类代谢组学样本每类包含20个代谢物特征import numpy as np from sklearn.decomposition import PCA # 设置随机种子保证可复现 np.random.seed(42) # 定义三类样本的均值和协方差矩阵 class_params { A: {mean: [5, 10], cov: [[2, 1.5], [1.5, 2]]}, B: {mean: [10, 5], cov: [[1, -0.8], [-0.8, 1]]}, C: {mean: [15, 15], cov: [[3, 0], [0, 1]]} } # 生成模拟数据每类50个样本 samples [] for class_name, params in class_params.items(): samples.append( np.random.multivariate_normal( meanparams[mean], covparams[cov], size50 ) ) X np.vstack(samples) y np.array([k for k in class_params.keys() for _ in range(50)]) # 添加20个模拟代谢物特征 n_features 20 feature_loadings np.random.randn(n_features, 2) * 2 # 随机生成特征载荷3. PCA计算与双标图绘制3.1 执行PCA降维pca PCA(n_components2) X_pca pca.fit_transform(X) # 获取主成分解释方差比 explained_var pca.explained_variance_ratio_ print(f主成分解释方差: PC1{explained_var[0]:.1%}, PC2{explained_var[1]:.1%})3.2 绘制基础双标图import matplotlib.pyplot as plt plt.figure(figsize(10, 8), dpi120) # 绘制样本散点 colors {A: #FF6B6B, B: #4ECDC4, C: #45B7D1} for class_name, color in colors.items(): mask y class_name plt.scatter( X_pca[mask, 0], X_pca[mask, 1], colorcolor, labelclass_name, alpha0.7 ) # 绘制特征载荷箭头 for i in range(n_features): plt.arrow( 0, 0, # 从原点出发 feature_loadings[i, 0] * 8, feature_loadings[i, 1] * 8, # 放大显示 colorgray, alpha0.5, head_width0.2 ) plt.text( feature_loadings[i, 0] * 8.5, feature_loadings[i, 1] * 8.5, fF{i1}, fontsize9, colorblack ) plt.xlabel(fPC1 ({explained_var[0]:.1%})) plt.ylabel(fPC2 ({explained_var[1]:.1%})) plt.title(PCA Biplot with Feature Loadings) plt.legend() plt.grid(alpha0.3) plt.show()4. 置信椭圆的计算与绘制4.1 椭圆参数计算原理置信椭圆基于多元正态分布假设关键参数包括中心点类内样本均值长/短轴由协方差矩阵的特征值决定旋转角度由特征向量方向决定数学表达式 $$(x-\mu)^T \Sigma^{-1} (x-\mu) \chi^2_{crit}(p)$$ 其中$\chi^2_{crit}$是卡方分布的临界值对应置信水平。4.2 Python实现代码from matplotlib.patches import Ellipse from scipy.stats import chi2 def plot_confidence_ellipse(ax, points, color, alpha0.3, level0.95): # 计算协方差矩阵 cov np.cov(points.T) # 计算椭圆参数 lambda_, v np.linalg.eig(cov) angle np.degrees(np.arctan2(v[1,0], v[0,0])) width, height 2 * np.sqrt(lambda_ * chi2.ppf(level, df2)) # 绘制椭圆 ellipse Ellipse( xynp.mean(points, axis0), widthwidth, heightheight, angleangle, colorcolor, alphaalpha, lw2, fillFalse, zorder0 ) ax.add_patch(ellipse) # 在之前图形上添加椭圆 fig, ax plt.subplots(figsize(10, 8), dpi120) for class_name, color in colors.items(): mask y class_name class_points X_pca[mask] ax.scatter(class_points[:,0], class_points[:,1], colorcolor, labelclass_name) plot_confidence_ellipse(ax, class_points, colorcolor) # 添加特征箭头略 plt.title(PCA with 95% Confidence Ellipses) plt.show()5. 高级定制技巧5.1 双标图箭头优化原始箭头可能重叠严重可以只显示重要特征载荷绝对值前10%添加透明度避免遮挡# 计算特征重要性 loading_norms np.linalg.norm(feature_loadings, axis1) threshold np.percentile(loading_norms, 90) # 取前10% for i in range(n_features): if loading_norms[i] threshold: plt.arrow(0, 0, feature_loadings[i,0]*7, feature_loadings[i,1]*7, colorpurple, alpha0.3, width0.05) plt.text(feature_loadings[i,0]*7.2, feature_loadings[i,1]*7.2, fF{i1}, fontsize8, colordarkred)5.2 多椭圆样式定制ellipse_styles { A: {color: #FF6B6B, linestyle: --, linewidth: 1.5}, B: {color: #4ECDC4, linestyle: -, linewidth: 2}, C: {color: #45B7D1, linestyle: :, linewidth: 2} } for class_name, style in ellipse_styles.items(): mask y class_name points X_pca[mask] # 计算椭圆参数同上 ... ellipse Ellipse(..., **style) ax.add_patch(ellipse)5.3 3D PCA可视化扩展from mpl_toolkits.mplot3d import Axes3D pca_3d PCA(n_components3) X_3d pca_3d.fit_transform(X) fig plt.figure(figsize(10, 8)) ax fig.add_subplot(111, projection3d) for class_name, color in colors.items(): mask y class_name ax.scatter(X_3d[mask,0], X_3d[mask,1], X_3d[mask,2], colorcolor, labelclass_name, alpha0.7) ax.set_xlabel(PC1) ax.set_ylabel(PC2) ax.set_zlabel(PC3) plt.legend() plt.show()6. 实战注意事项数据标准化至关重要from sklearn.preprocessing import StandardScaler X_scaled StandardScaler().fit_transform(X)当特征量远大于样本量时考虑稀疏PCAfrom sklearn.decomposition import SparsePCA spca SparsePCA(n_components2, alpha0.1) X_spca spca.fit_transform(X_scaled)置信水平选择建议探索性分析95%默认严格验证99%调整方法修改chi2.ppf()中的level参数图形标注最佳实践主成分轴标注解释方差比特征箭头用不同颜色标识正负贡献添加图例说明椭圆置信水平我在实际项目中遇到过椭圆形状异常的情况通常是因为样本量过少每类建议至少30个样本数据存在极端异常值协方差矩阵计算不稳定解决方法包括增加样本量、进行数据清洗或使用稳健协方差估计方法。

相关新闻

C++面向对象单链表实现:从封装、RAII到迭代器的完整指南

C++面向对象单链表实现:从封装、RAII到迭代器的完整指南

1. 项目概述:为什么我们需要面向对象的单链表?如果你写过C语言的数据结构,对单链表一定不陌生。malloc、free、指针指来指去,一个不小心就是内存泄漏或者野指针。那时候的链表,更像是一堆散落的零件,你得小…

2026/7/15 20:04:54 阅读更多 →
从ADC读数到PPM:MQ-2烟雾传感器的电压-浓度转换实战解析

从ADC读数到PPM:MQ-2烟雾传感器的电压-浓度转换实战解析

1. MQ-2传感器基础认知与硬件连接MQ-2烟雾传感器是典型的半导体气敏元件,核心部件是涂有二氧化锡(SnO2)的陶瓷管。当环境中存在可燃气体时,其电导率会随浓度升高而增大。这种特性使得它成为检测液化气、甲烷、烟雾等物质的低成本方案。硬件连接要点&…

2026/7/15 20:04:54 阅读更多 →
ChatGPT写周报月报:从“凑字数”到“领导主动转发”的5步质变法(附可即用Prompt库)

ChatGPT写周报月报:从“凑字数”到“领导主动转发”的5步质变法(附可即用Prompt库)

更多请点击: https://intelliparadigm.com 第一章:ChatGPT写周报月报:从“凑字数”到“领导主动转发”的5步质变法(附可即用Prompt库) 过去写周报,常陷入“流水账—删减—硬凑—焦虑—交差”的死循环&…

2026/7/15 20:02:53 阅读更多 →

最新新闻

P8661日志统计题解复盘

P8661日志统计题解复盘

P8647 [蓝桥杯 2018 省 A] 日志统计 题解复盘 基本信息项目内容题目编号、来源P8647 洛谷 / 蓝桥杯 2018 年省赛 A/B/C 组训练层级B变式题 双指针 / 滑动窗口 排序知识版块滑动窗口、双指针、排序、哈希表/桶排序 解题前・关键信号识别维度分析目标、约束、底层结构目标&#…

2026/7/15 21:01:13 阅读更多 →
YOLOv11n模型压缩到2MB以下:通道剪枝、量化训练与结构重参数化的组合拳

YOLOv11n模型压缩到2MB以下:通道剪枝、量化训练与结构重参数化的组合拳

一、前言:2MB,一个让人又爱又恨的数字 兄弟们,今天聊一个让无数边缘端开发者夜不能寐的话题——如何把YOLOv11n塞进2MB的存储空间。 先看一组硬核数据。根据Ultralytics官方发布的信息,YOLO11n是YOLO11系列中最小巧的目标检测模型,拥有260万个参数,在COCO数据集上达到了…

2026/7/15 21:01:13 阅读更多 →
AI因果推断:从相关性到因果性的跨越

AI因果推断:从相关性到因果性的跨越

AI因果推断:从相关性到因果性的跨越"相关性不等于因果性"是统计学第一课,但在实际决策中,我们真正需要的是因果知识。AI因果推断致力于从数据中发现因果关系,回答"如果...会怎样"(What if&#xf…

2026/7/15 20:59:12 阅读更多 →
C++函数全解析:从基础概念到高级应用与实战技巧

C++函数全解析:从基础概念到高级应用与实战技巧

1. 函数基础:从“黑盒子”到程序基石如果你刚开始接触C,或者已经写过一些代码,那么“函数”这个概念你一定不陌生。它就像你厨房里的一个多功能料理机——你把食材(参数)放进去,按下开关(调用&a…

2026/7/15 20:55:12 阅读更多 →
API网关、微服务、Service Mesh——ChatGPT一句话讲清本质,92%工程师看完直呼“早该这么教!”

API网关、微服务、Service Mesh——ChatGPT一句话讲清本质,92%工程师看完直呼“早该这么教!”

更多请点击: https://codechina.net 第一章:API网关、微服务、Service Mesh——ChatGPT一句话讲清本质,92%工程师看完直呼“早该这么教!” API网关是系统的“统一门面”,负责流量入口的认证、限流、路由与协议转换&a…

2026/7/15 20:53:11 阅读更多 →
DeepSeek    LeetCode 3559. 给边赋权值的方案数 II Python3实现

DeepSeek LeetCode 3559. 给边赋权值的方案数 II Python3实现

根据题目要求,对于树中任意两个节点 u 和 v,路径长度为 d(边数),使路径总代价为奇数的赋值方案数为 2^(d-1)。因此核心是快速求树上两点距离。Python3 实现python class Solution:MOD 10**9 7def assignEdgeWeights(…

2026/7/15 20:53:11 阅读更多 →

日新闻

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向红外小目标检测的时空特征融合模块——STFFM,用于增强复杂背景下目标与噪声、杂波的区分能力。该方法通过拼接空间特征与时间/运动特征,并结合通道注意力、空间注意力和残差增强机制,实现对关键语义通道与疑似目标区域的…

2026/7/15 0:01:00 阅读更多 →
YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向复杂背景小目标检测的时空特征融合模块——STFFM。该模块通过空间分支与时间/运动分支的特征拼接,引入通道注意力和空间注意力对融合特征进行自适应筛选,并结合残差增强与通道压缩,突出目标区域、抑制背景噪声。我们将 S…

2026/7/15 0:01:00 阅读更多 →
行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

一、为什么减速以后扭矩会增大 旋转机械的功率、转速和扭矩之间存在以下关系: T 9550 P n 其中: T为扭矩,单位Nm; P为功率,单位kW; n为转速,单位r/min。 在功率基本不变的情况下:…

2026/7/15 0:03:00 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/14 16:53:23 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/15 19:42:20 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/15 17:52:08 阅读更多 →

月新闻