pythonic生物人

熬到凌晨画的相图,导师说像“儿童涂鸦”?

本期主角-三元相图

三元相图(Ternary Phase Diagram)用于展示三个组分体系在特定条件(如温度或压力)下的相平衡关系。其以等边三角形为框架,各顶点分别代表一种纯组分,三角形内部的点则对应三组分的各种比例组合。

下面使用R实现简单的三元相图。


数据格式

ImageImage


简单分组三元相图

这里使用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# 点大小放大
)

Image

这张三元相图展示了铝(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# 文字大小
)
Image

这样,就能直观知道合金的的熔点了。


简单分组三元相图+文本注释+连线

这里只是将上一节的文本移动到了三角形外部,通过直线和数据点连接,

## 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# 连接线更细
)
Image

将熔点文本移动到三角形外部后,图变得更加清爽了。


获取绘图代码+测试数据+数据处理方法+依赖包安装方法,

👇(备注:626)

图片