核心内容摘要
浴火重生,味蕾绽放:苏州美食津贴,一场味觉的盛宴
三元图Ternary Plot 或 Ternary Diagram是一种特殊的图表用于展示三个变量之间的关系这三个变量的总和是一个常数通常为100%或1。
我来详细解释一下。
三元图主要用于展示三种成分、特性或属性之间的相对比例关系在需要分析三个互补变量的情况下提供直观的可视化展示数据点在三种成分组合下的分布或聚类情况三元图是一个等边三角形其中三个顶点分别代表三个变量的100%或最大值三角形的边表示其对应顶点的变量为0%三角形内的任何点表示三个变量的某种组合且这三个变量的总和始终为100%三元图的用法绘制数据点每个数据点由三个值确定(a, b, c)且a b c 100%点的位置由三个变量的比例决定读取图表从一个点画三条平行于三角形边的线这些线与刻度相交的位置表示各个变量的值添加额外信息可以使用颜色、大小或形状编码第四个变量可以添加等值线来显示第四个变量的趋势三元图适合在以下情况使用材料科学和地质学展示矿物、岩石、土壤或合金的成分比例相图分析用于展示不同温度和压力下的物相化学和工程显示三元混合物或溶液的组成优化工艺参数生态学和环境科学展示生态系统中三个相互依存的参数土壤粒径分布砂、淤泥、黏土的比例市场研究和社会科学分析三种互补选择的偏好展示人口统计学中的三变量关系游戏开发和图形设计表示RGB或其他三色组合展示技能或属性平衡三元图在需要同时分析三个互补变量总和为常数的情境下特别有价值它能帮助识别趋势、模式和聚类是复杂三变量关系的强大可视化工具。
导入库python# 导入pandas库用于数据处理numpy库用于数学运算plotly.express库用于绘图import pandas as pd # 导入pandas库用于数据操作和分析import numpy as np # 导入numpy库用于数值计算import plotly.express as px # 导入plotly.express库用于绘制图形pandas用于处理结构化数据特别是表格数据DataFrame提供了强大的数据读取、清洗和操作功能。
numpy用于科学计算和数组处理尽管在此代码中并没有直接使用但通常在数据处理中非常有用。
plotly.express是一个快速绘制交互式图表的库这里用它来绘制三元图。
数据读取部分文件路径和读取数据python# 读取数据数据来自于之前运行的 RF_XG.ipynb 生成的 CSV 文件# XC_RD.csv 和 XC_XG.csv 文件包含了样本的数据fp1 XC_RD.csv # 定义第一个文件路径fp2 XC_XG.csv # 定义第二个文件路径# 使用 pandas 的 read_csv 方法读取 CSV 文件并将其存入 DataFrame 中RD_Data pd.read_csv(fp
# 读取 XC_RD.csv 数据并存入 RD_Data DataFrameXG_Data pd.read_csv(fp
# 读取 XC_XG.csv 数据并存入 XG_Data DataFramefp1和fp2分别设置了两个 CSV 文件的路径。
通过pandas的read_csv()方法读取 CSV 文件并存储为DataFrameRD_Data和XG_Data。
这样做可以方便后续对数据的操作和分析。
数据筛选部分按样本分组python# 将 RD_Data 数据按 Cui 和 Xiao 的样本分组# Cui 的样本: Hy31, Hy59, Hy55, Hy1_Flo, Hy1_CoroRD_Data_Cui RD_Data[RD_Data[Sample No].isin([Hy31, Hy59, Hy55, Hy1_Flo, Hy1_Coro])]# Xiao 的样本: JLW
2
5, JLW
1
1, JLW76, JLW
3
8, SX
8
15RD_Data_Xiao RD_Data[RD_Data[Sample No].isin([JLW
2
5, JLW
1
1, JLW76, JLW
3
8, SX
8
15])]# 将 XG_Data 数据按 Cui 和 Xiao 的样本分组XG_Data_Cui XG_Data[XG_Data[Sample No].isin([Hy31, Hy59, Hy55, Hy1_Flo, Hy1_Coro])]XG_Data_Xiao XG_Data[XG_Data[Sample No].isin([JLW
2
5, JLW
1
1, JLW76, JLW
3
8, SX
8
15])]使用isin()方法筛选出RD_Data和XG_Data中符合特定样本编号的行分为Cui 样本和Xiao 样本。
对RD_Data和XG_Data两个 DataFrame 分别进行筛选生成新的 DataFrameRD_Data_Cui、RD_Data_Xiao、XG_Data_Cui和XG_Data_Xiao。
绘图部分生成三元图每个三元图的绘制代码结构相同只是数据源、颜色和符号的不同。
绘制 Cui 样本的三元图RD_Data_Cuipythonfig px.scatter_ternary(RD_Data_Cui, a0, b1, c2, colorSample No, symbolSample No,color_discrete_map{Hy31: peru, # Hy31 样本显示为 peru 颜色Hy59: steelblue, # Hy59 样本显示为 steelblue 颜色Hy55: peru, # Hy55 样本显示为 peru 颜色Hy1_Flo: peru, # Hy1_Flo 样本显示为 peru 颜色Hy1_Coro: steelblue # Hy1_Coro 样本显示为 steelblue 颜色},opacity
0.
# 设置透明度为
5fig.update_traces(marker{size: 8}) # 设置标记的大小为 8fig.show() # 显示图形fig.write_image(Ternary_RD_Cui.svg) # 将图形保存为 SVG 文件scatter_ternary这是 Plotly 中用来绘制三元图的函数。
三元图是一种用三个变量展示数据的图形通常用在三组数据加总为常数的情况下。
a0,b1,c2指定三元图的三个坐标轴分别对应 DataFrame 中的列
0、
2。
colorSample No和symbolSample No根据样本编号的不同为每个样本赋予不同的颜色和符号。
color_discrete_map自定义颜色映射将特定的样本与指定颜色关联。
opacity
5设置透明度为 50%使得点变得半透明。
update_traces(marker{size: 8})设置标记点的大小为 8。
fig.show()显示图形。
fig.write_image(Ternary_RD_Cui.svg)将生成的图形保存为 SVG 文件。
绘制 Xiao 样本的三元图RD_Data_Xiaopythonfig px.scatter_ternary(RD_Data_Xiao, a0, b1, c2, colorSample No, symbolSample No,color_discrete_map{JLW
2
5: steelblue, # JLW
2
5 样本显示为 steelblue 颜色JLW
1
1: steelblue, # JLW
1
1 样本显示为 steelblue 颜色JLW76: steelblue, # JLW76 样本显示为 steelblue 颜色SX
8
15: steelblue, # SX
8
15 样本显示为 steelblue 颜色JLW
3
8: steelblue, # JLW
3
8 样本显示为 steelblue 颜色},opacity
0.
# 设置透明度为
5fig.update_traces(marker{size: 8}) # 设置标记的大小为 8fig.show() # 显示图形fig.write_image(Ternary_RD_Xiao.svg) # 将图形保存为 SVG 文件这部分代码与前一部分相似但使用的是Xiao 样本数据并且颜色映射不同。
绘制 Cui 样本的三元图XG_Data_Cuipythonfig px.scatter_ternary(XG_Data_Cui, a0, b1, c2, colorSample No, symbolSample No,color_discrete_map{Hy31: peru, # Hy31 样本显示为 peru 颜色Hy59: steelblue, # Hy59 样本显示为 steelblue 颜色Hy55: peru, # Hy55 样本显示为 peru 颜色Hy1_Flo: peru, # Hy1_Flo 样本显示为 peru 颜色Hy1_Coro: steelblue # Hy1_Coro 样本显示为 steelblue 颜色},opacity
0.
# 设置透明度为
5fig.update_traces(marker{size: 8}) # 设置标记的大小为 8fig.show() # 显示图形fig.write_image(Ternary_XG_Cui.svg) # 将图形保存为 SVG 文件同样的绘图过程但数据源为XG_Data_Cui。
这部分与前面绘制 Cui 样本图的结构相同。
绘制 Xiao 样本的三元图XG_Data_Xiaopythonfig px.scatter_ternary(XG_Data_Xiao, a0, b1, c2, colorSample No, symbolSample No,color_discrete_map{JLW
2
5: steelblue, # JLW
2
5 样本显示为 steelblue 颜色JLW
1
1: steelblue, # JLW
1
1 样本显示为 steelblue 颜色JLW76: steelblue, # JLW76 样本显示为 steelblue 颜色SX
8
15: steelblue, # SX
8
15 样本显示为 steelblue 颜色JLW
3
8: steelblue, # JLW
3
8 样本显示为 steelblue 颜色},opacity
0.
# 设置透明度为
5fig.update_traces(marker{size: 8}) # 设置标记的大小为 8fig.show() # 显示图形fig.write_image(Ternary_XG_Xiao.svg) # 将图形保存为 SVG 文件这一部分与前两部分的结构相同只是数据源是XG_Data_Xiao使用了不同的颜色映射。
5 鸢尾花数据集绘制三元图import pandas as pdimport numpy as npimport plotly.express as pxfrom sklearn.datasets import load_iris# 加载鸢尾花数据集iris load_iris()iris_df pd.DataFrame(datairis.data, columnsiris.feature_names)# 创建目标映射字典target_map {0: setosa, 1: versicolor, 2: virginica}# 将目标值映射到物种名称iris_df[species] iris.targetiris_df[species] iris_df[species].map(target_map)# 为了使用三元图需要确保三个变量的和为1# 选择三个特征花瓣长度、花瓣宽度和萼片长度selected_features [petal length (cm), petal width (cm), sepal length (cm)]iris_scaled iris_df[selected_features].copy()# 对数据进行归一化使每行的和为1iris_scaled iris_scaled.div(iris_scaled.sum(axis
, axis
# 创建用于绘图的数据框plot_df pd.DataFrame({a: iris_scaled[petal length (cm)],b: iris_scaled[petal width (cm)],c: iris_scaled[sepal length (cm)],Species: iris_df[species]})# 创建三元图fig px.scatter_ternary(plot_df,aa, bb, cc,colorSpecies,labels{a: 花瓣长度,b: 花瓣宽度,c: 萼片长度},title鸢尾花数据集的三元图)# 更新图形样式fig.update_traces(marker{size: 8})fig.update_layout(ternarydict(aaxisdict(title花瓣长度),baxisdict(title花瓣宽度),caxisdict(title萼片长度)))# 显示图形并保存fig.show()尾花数据集的三元图展示了三个特征之间的关系花瓣长度Petal Length、花瓣宽度Petal Width和花萼长度Sepal Length。
图中的每个点代表一个鸢尾花样本颜色表示其所属的种类Species。
图的解读坐标轴花瓣长度Petal Length从图的左下角到右上角。
花瓣宽度Petal Width从图的右下角到左上角。
花萼长度Sepal Length从图的左上角到右下角。
数据点分布蓝色setosa主要分布在花瓣长度和宽度都较低的区域。
红色versicolor分布在中间区域花瓣长度和宽度适中。
绿色virginica主要分布在花瓣长度和宽度都较高的区域。
特征关系花瓣长度与花瓣宽度从图中可以看出花瓣长度和宽度在不同种类之间有明显的差异。
setosa的花瓣通常较短且窄而virginica的花瓣较长且宽。
花萼长度与其他特征花萼长度在三个种类之间也有一定的分布差异但不如花瓣长度和宽度那么明显。
可以直观地看到不同种类的鸢尾花在花瓣和花萼特征上的分布差异有助于分类和识别。
Githup项目地址:https://github.com/junyaok/ML_Pyrite