熬到凌晨画的相图,导师说像“儿童涂鸦”?
本期主角-三元相图
三元相图(Ternary Phase Diagram)用于展示三个组分体系在特定条件(如温度或压力)下的相平衡关系。其以等边三角形为框架,各顶点分别代表一种纯组分,三角形内部的点则对应三组分的各种比例组合。
下面使用R实现简单的三元相图。
数据格式
简单分组三元相图
这里使用R Ternary实现,
## 22.1_01
# 未经过允许禁止转载!
# @Author : 公众号:pythonic生物人
# @Desc : 22.1 简单三元相图
# 创建一个三元图
TernaryPlot(
alab = "Al (%)", blab = "Cu (%)", clab = "Mg (%)", # 轴标签
grid.lines = 6, grid.minor.lines = 2, # 网格线设置
axis.labels = seq(0, 100, by = 10), # 轴刻度
axis.col = "grey50", # 三个边的颜色
grid.col = "grey70", # 主网格线颜色
grid.minor.col = "grey85"# 副网格线颜色
)
# 在三元图上添加数据点
TernaryPoints(
ternary_data[, c("Al", "Cu", "Mg")],
col = "black", # 边框颜色
lwd = 0.6, # 边框线宽
bg = colors, # 背景填充色
pch = 21, # 使用带边框的圆点
cex = ternary_data$MeltingPoint / 500 * 1.5# 点大小放大
)
这张三元相图展示了铝(Al)-镁(Mg)-铜(Cu)合金体系在不同成分比例下的相组成(固溶体、沉淀相、混合相)。
这个图怎么读?
首先,看三角形的三个角:
左下角是纯铝(0% Mg,100% Al,0% Cu) 右下角是纯镁(100% Mg,0% Al,0% Cu) 最上面那个角是纯铜(0% Mg,0% Al,100% Cu)
然后,看三个边上的部分,表示两种金属的混合:
左边那条边是铝和铜的配比 右边那条边是镁和铜的配比 底下那条边是铝和镁的配比
然后,看三角形里面的部分,就是三种金属的混合了:
从你想看的那个点,往三条边分别画平行线。每条平行线在边上截取的长度,就是对应金属的含量比例。三个数字加起来正好是常数100%。 例如,如果有个点特别靠近左下角,那肯定铝含量特别高;如果有个点在镁和铜中间的位置,那就说明镁和铜的比例差不多,铝含量比较少。
最后,图中不同颜色的点代表不同相态:
红色点(Solid Solution,固溶体):单相均匀合金(如 Al 基固溶体)。 黑色点(Precipitate,沉淀相):析出第二相(如 Mg₂Cu、Al₂Cu 等)。 蓝绿色点(Mixed,混合相):多相共存(如固溶体+沉淀相)。
简单分组三元相图+文本注释
为上面的图添加数据中的第4列数据-熔点(MeltingPoint),单位为摄氏度(°C),范围在500-700°C之间,表示合金的熔化温度。
## 22.2_01
# 未经过允许禁止转载!
# @Author : 公众号:pythonic生物人
# @Desc : 22.2 注释三元相图(添加文本)
# 创建一个三元图
TernaryPlot(
alab = "Al (%)", blab = "Cu (%)", clab = "Mg (%)", # 轴标签
grid.lines = 6, grid.minor.lines = 2, # 网格线设置
axis.labels = seq(0, 100, by = 10), # 轴刻度
axis.col = "grey50", # 三个边的颜色
grid.col = "grey70", # 主网格线颜色
grid.minor.col = "grey85"# 副网格线颜色
)
# 在三元图上添加数据点
TernaryPoints(
ternary_data[, c("Al", "Cu", "Mg")],
col = "black", # 边框颜色
lwd = 0.6, # 边框线宽
bg = colors, # 背景填充色
pch = 21, # 使用带边框的圆点
cex = ternary_data$MeltingPoint / 500 * 1.5# 点大小放大
)
# 添加注释(显示MeltingPoint)
TernaryText(
ternary_data[, c("Al", "Cu", "Mg")],
labels = round(ternary_data$MeltingPoint, 1), # 显示熔点值,保留1位小数
col = colors, # 注释颜色与点一致
pos = 3, # 文字位置(3表示上方)
offset = 0.5, # 文字与点的偏移量
cex = 0.5# 文字大小
)
这样,就能直观知道合金的的熔点了。
简单分组三元相图+文本注释+连线
这里只是将上一节的文本移动到了三角形外部,通过直线和数据点连接,
## 22.3_01
# 未经过允许禁止转载!
# @Author : 公众号:pythonic生物人
# @Desc : 22.3 注释三元相图(添加文本+连线)
# 创建三元图
TernaryPlot(
"Al (%)", "Cu (%)", "Mg (%)", # 轴标签
grid.lines = 6, grid.minor.lines = 2, # 网格线设置
axis.labels = seq(0, 100, by = 10), # 轴刻度
axis.col = "grey50", # 三个边的颜色
grid.col = "grey70", # 主网格线颜色
grid.minor.col = "grey85"# 副网格线颜色
)
# 添加数据点
TernaryPoints(
ternary_data[, c("Al", "Cu", "Mg")],
col = "black", # 边框颜色
lwd = 0.6, # 边框线宽
bg = colors, # 背景填充色
pch = 21, # 使用带边框的圆点
cex = ternary_data$MeltingPoint / 500 * 1.5# 点大小放大
)
# 添加注释
Annotate(
ternary_data[, c("Al", "Cu", "Mg")],
col = colors, # 注释颜色与点一致
labels = round(ternary_data$MeltingPoint, 1), # 显示MeltingPoint,保留1位小数
offset = 0.6, # 文字与点的距离
cex = 0.9, # 文字大小
lwd = 0.5# 连接线更细
)
将熔点文本移动到三角形外部后,图变得更加清爽了。
获取绘图代码+测试数据+数据处理方法+依赖包安装方法,
👇(备注:626)