PCA绘图哪家强?R和Python都玩出花来了

文摘   2024-11-13 09:02   爱尔兰  
PCA(主成分分析)是一种经典的数据降维方法,它通过转换数据变量来提取数据的主要特征,以便在降低维度的同时保持尽可能多的数据信息。PCA在数据探索、可视化和特征工程中非常常用,特别是当面对高维数据集时,PCA能够帮助我们更直观地理解数据的内在结构。然而,简单的PCA图经常显得平淡无奇,那么,如何让PCA图更具视觉吸引力?R和Python又有哪些不同的绘图特点?今天的更新将带你一起探索如何用Python和R生成漂亮的PCA图,并进行个性化设置,来提升图表的表达力。

选择R还是Python?

  • 如果你的目标是生成符合科研出版需求的图表,且希望有更直观的调色和布局调整,R的ggplot2会是一个不错的选择。其主题设置和颜色手动调整非常适合需要快速生成多样化可视化效果的科研工作。
  • 如果你正在进行机器学习或深度学习项目的原型开发,Python则更加合适。它的matplotlibseaborn提供了丰富的可视化支持,同时与机器学习库如scikit-learn无缝集成,更便于数据预处理与建模的联合开发。
接下来,我们将分别使用Python和R来绘制一个基于Iris数据集的PCA图,并对图形进行细致的个性化设置,包括标题、坐标轴、图例大小以及颜色的优化,让图形更适合科研和论文的需求。

使用Python绘制个性化PCA图

在Python中,我们使用scikit-learn进行PCA计算,并利用matplotlibseaborn进行可视化。这两个库的组合能够让我们灵活地调整点的颜色、形状、大小等,生成一个清晰直观的PCA图。

Python代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris

# 数据加载和预处理
data = load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['target'] = data.target

scaler = StandardScaler()
df_scaled = scaler.fit_transform(df.iloc[:, :-1])

# PCA计算
pca = PCA(n_components=2)
pca_result = pca.fit_transform(df_scaled)
df['PC1'] = pca_result[:, 0]
df['PC2'] = pca_result[:, 1]

# 设置图形美化风格
sns.set(style="whitegrid")

# 绘制PCA图
plt.figure(figsize=(10, 8)) # 设置图形尺寸
pca_plot = sns.scatterplot(
x="PC1", y="PC2", hue="target", style="target", data=df,
palette="Dark2", s=120, edgecolor="black", alpha=0.8 # 配色和透明度优化
)

# 添加轴标题和图标题,设置字体大小和加粗
pca_plot.set_title("PCA of Iris Dataset", fontsize=18, weight='bold', pad=20)
pca_plot.set_xlabel(f"PC1 ({pca.explained_variance_ratio_[0]*100:.2f}% Variance)", fontsize=14, labelpad=10)
pca_plot.set_ylabel(f"PC2 ({pca.explained_variance_ratio_[1]*100:.2f}% Variance)", fontsize=14, labelpad=10)

# 设置坐标刻度字体大小
pca_plot.tick_params(axis='x', labelsize=12)
pca_plot.tick_params(axis='y', labelsize=12)

# 图例优化
legend = pca_plot.legend(title='Species', title_fontsize='13', loc='upper right', fontsize='11')
legend.get_frame().set_edgecolor('black') # 图例边框颜色
legend.get_frame().set_linewidth(1.2)

plt.show()

Python个性化设置说明

  1. 颜色方案:设置palette="Dark2",选择深色调的调色板,以增强区分类别的对比度,使图形更易于辨识。
  2. 标题和坐标轴:通过fontsizeweight='bold'设置字体大小和加粗,并使用pad参数优化标题和坐标标签的间距。
  3. 点样式:设置edgecolor="black"和较大的alpha值,使得点的边缘更加清晰,增强视觉对比。
  4. 图例边框:为图例添加黑色边框,并通过linewidth参数设置边框粗细,增加图例的视觉分隔效果。

使用R绘制个性化PCA图

在R中,我们使用prcomp进行PCA计算,并利用ggplot2生成图形。ggplot2以其灵活的美学映射和组合设置能力,使R成为制作科学图表的首选之一。通过调整ggplot2的图形主题和颜色选项,可以使图形符合学术标准。

R代码

# 加载所需的包
library(ggplot2)
library(datasets)

# 数据加载和PCA计算
data <- iris
pca <- prcomp(data[, 1:4], center = TRUE, scale. = TRUE)
data$PC1 <- pca$x[, 1]
data$PC2 <- pca$x[, 2]

# 设置颜色和形状的个性化样式
p <- ggplot(data, aes(x = PC1, y = PC2, color = Species, shape = Species)) +
geom_point(size = 3.5, alpha = 0.8) + # 设置点大小和透明度
scale_color_manual(values = c("#E41A1C", "#377EB8", "#4DAF4A")) + # 使用手动配色
theme_minimal() + # 主题背景简化
labs(
title = "PCA of Iris Dataset",
x = paste("PC1 (", round(summary(pca)$importance[2, 1] * 100, 2), "% Variance)", sep=""),
y = paste("PC2 (", round(summary(pca)$importance[2, 2] * 100, 2), "% Variance)", sep="")
) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 20, margin = margin(b = 15)), # 标题
axis.title = element_text(size = 15), # 坐标轴标题字体
axis.text = element_text(size = 13), # 坐标轴刻度
legend.title = element_text(size = 13), # 图例标题
legend.text = element_text(size = 11), # 图例内容
legend.position = "right", # 图例位置
legend.background = element_rect(color = "black", size = 0.5), # 图例边框
panel.grid.major = element_line(color = "grey", size = 0.5), # 主网格线颜色和粗细
panel.grid.minor = element_blank() # 去除次要网格线
)

print(p)

R个性化设置说明

  1. 颜色调整:使用scale_color_manual设置手动配色,让每个类别的颜色对比明显且适合打印。
  2. 标题和坐标轴字体:通过element_text调整标题和坐标轴字体大小和加粗,确保视觉效果更符合科研需求。
  3. 图例边框:为图例添加黑色边框,使其与图表背景分开,更便于理解。
  4. 网格线:通过设置panel.grid.major的颜色和粗细,降低次要网格的干扰。

小结

在这篇文章中,我们展示了如何使用Python和R分别绘制PCA图,并进行了细致的个性化设置。Python凭借seabornmatplotlib库,能提供多样化的个性化调整;而R中的ggplot2提供了丰富的美学映射,让R在统计数据的可视化上更加便捷和细致。
感谢关注,你的支持是我不懈的动力!

科研代码
专注R和Python的数据分析。
 最新文章