-->

How to plot an equilateral color triangle?

2019-08-08 17:59发布

问题:

I would like to make a color plot in MATLAB similar to this plot:

I have managed to create all the points [x,y] needed in order to create the vertexes and I have a map with colors of each vertex, so I can get the following.

But I do not get it how to make the axis work.

Code so far:

% Equilateral grid 
tcorner = [0.0, 0.5,           1.0;
           0.0, 1.0*sqrt(3)/2, 0.0];
tg = triangle_grid( 1/0.05, tcorner );
tgx = tg(1,:);
tgy = tg(2,:);

% Create triangles
tri = delaunay(tgx,tgy);

% Plot
h = trisurf(tri, tgx, tgy, colorvector);

And the grid function:

function triangle_grid(n, tcorner)
    ng = ( ( n + 1 ) * ( n + 2 ) ) / 2;
    tg = zeros ( 2, ng );

    p = 0;

    for i = 0 : n
        for j = 0 : n - i
            k = n - i - j;
            p = p + 1;
            tg(1:2,p) = ( i * t(1:2,1) + j * t(1:2,2) + k * t(1:2,3) ) / n;
        end
    end
end

回答1:

The main problem is that you can't rotate the axes to the right position, because the always flip to the lower side. So, you need to create them.

Here is how:

% Equilateral grid 
tcorner = [0.0, 0.5, 1.0; % x
           0.0, 1.0*sqrt(3)/2,   0.0]; % y
tg = triangle_grid( 1/0.05, tcorner);
tgx = tg(1,:);
tgy = tg(2,:);

% Create triangles
tri = delaunay(tgx,tgy);
col = rand(size(tgx));
trisurf(tri,tgx,tgy,col)
view(0,90)
colormap('lines')

% setting the axes:
ax = gca;
grid off
ax.YAxis.Visible = 'off';
ticks = (0:20:80).';

% bottom axis:
tickpos = linspace(tcorner(1,1),tcorner(1,3),numel(ticks)+1);
ax.XAxis.FontSize = 14;
ax.XAxis.TickValues = tickpos(1:end-1);
ax.XAxis.TickLabels = ticks;
ax.XAxis.TickLabelRotation = 45;
xlabel('X axis title');

% left & right axis:
ticksxpos = linspace(tcorner(1,1),tcorner(1,3),numel(ticks)*2+1);
ticksypos = linspace(tcorner(2,1),tcorner(2,2),numel(ticks)+1);
text(ticksxpos(numel(ticks)+1:-1:2)-0.03,... % left
    ticksypos(end:-1:2)+0.03,...
    num2str(ticks),'FontSize',14,...
    'VerticalAlignment','bottom',...
    'HorizontalAlignment','left',...
    'Rotation',-45)
text(ticksxpos(end:-1:numel(ticks)+2)+0.05,... % right
    ticksypos(1:end-1)-0.03,...
    num2str(ticks),'FontSize',14,...
    'VerticalAlignment','bottom',...
    'HorizontalAlignment','right')
ax.Parent.Color = 'w';

% titles:
text(tcorner(1,2)/2-0.06,tcorner(2,2)/2+0.06,...
    'Left title','FontSize',14,...
    'HorizontalAlignment','center',...
    'Rotation',45)
text(tcorner(1,2)+tcorner(1,2)/2+0.06,tcorner(2,2)/2+0.06,...
    'Right title','FontSize',14,...
    'HorizontalAlignment','center',...
    'Rotation',-45)

and we get...