使用 MATLAB 绘制三元相图

Plotting Ternary Phase Diagram with MATLAB

我想绘制一个基于从头算能量输入的三元相图。在那里,我找到了一个可能对我有帮助的有用工具:

https://de.mathworks.com/matlabcentral/fileexchange/2299-alchemyst-ternplot

有几个问题需要修改:

  1. 我喜欢在绘图上看到我的输入阶段 "name labels",我在数据中输入了坐标。 (不只是单独图中的蓝点)

  2. 我在terndemo.m中输入了正能量值,如下图。然而,它们实际上是负值,当我输入负值时,表面没有正确显示。

  3. 我需要给热谱贴个标签吗?

  4. 最后,我的轴标签没有开始正确。例如0不在三角形的边缘点。

我也附上了图上的所有问题

任何人都可以对这些问题发表一些评论吗?

--- 这是我的 demotern.m 输入:

%% Ti Ce Fe
% Name of the phases in coordinates below: Ti, Ce, Fe, FeTi, Fe2Ti,
% CeFe2,CeFe5, Ce2Fe17 and CeFe11Ti
experimental = [...

    1.000   0.000   0.000
    0.000   1.000   0.000
    0.000   0.000   1.000
    0.500   0.000   0.500
    0.340   0.000   0.660
    0.000   0.340   0.660
    0.000   0.160   0.840
    0.000   0.110   0.890
    0.0765  0.0765  0.847
   ];
% data values are actually negative, here I enter positive value
data = [...

    0.0
    0.0
    0.0
    0.419
    0.273
    0.090
    0.014
    0.010
    0.068
    ];

A = experimental(:, 1)';
B = experimental(:, 2)';
C = 1 - (A + B);

figure
subplot(2, 2, 1)
ternplot(A, B, C, '.'); ternlabel('Content of Titanium', 'Content of Cerium', 'Content of Iron');
subplot(2, 2, 2)
ternpcolor(A, B, data); ternlabel('Content of Titainum', 'Content of Cerium', 'Content of Iron');
shading interp
subplot(2, 2, 3)
terncontour(A, B, data); ternlabel('Content of Titanim', 'Content of Cerium', 'Content of Iron');
subplot(2, 2, 4)
ternsurf(A, B, data);

Here is the image

我是ternplot的作者

这是我能做到的最好的:

  1. 为绘图添加了标签
  2. 我在 ternpcolor 中绘制曲面图的方式很难使用负值。有一个解决方案涉及从下面查看该图,但我会把它留给另一个问题
  3. 向颜色栏添加了标签
  4. 在我的图中,标签是正确的。检查您是否拥有最新版本。

--

names = {'Ti', 'Ce', 'Fe', 'FeTi', 'Fe2Ti', 'CeFe2', 'CeFe5', ...
         'Ce2Fe17', 'CeFe11Ti'};
figure
ternpcolor(A, B, data); 
vertexlabel('Titainum', 'Cerium', 'Iron');
shading interp
c = colorbar();
ylabel(c, 'Formation energy per atom (eV)')
hold on
for i = 1:length(names)
    [x, y] = terncoords(experimental(i, 1), experimental(i, 2));
    z = data(i);

    scatter3(x, y, z+0.4, 100, 'filled', 'ks');
    t = text(x + 0.01, y-0.02, z+0.03, names{i}, 'fontsize', 20);
end
hold off

未经手工编辑的结果如下:

但稍微调整一下(真的只是四处移动标签)它非常有用: