PostProcess: using color with Matlab plots

Contents

Show results using color values

Matlab allow us to plot the results on the nodes of one element using color interpolation. The main function is FILL.

Color in general is defined as a triplet RGB values [r,g,b]

red: 0 <= r <= 255 (integer) or 0.0 <= r <= 1.0 (float) is the first channel [r,0,0]

green: 0 <= g <= 255 (integer) or 0.0 <= g <= 1.0 (float) is the second channel [0,g,0]

blue: 0 <= b <= 255 (integer) or 0.0 <= b <= 1.0 (float) is the third channel [0,0,b]

Color in Matlab can be specified using RGB but it also uses colormap which is an array of colors according to certain rules (jet, gray, copper, etc.) (see doc colormap in Matlab for more information)

x=1:10;
y=x.^2;
plot(x,y,'.-','Color',[0.0,0.0,0.0]) %black color
hold on;
plot(x,y+5,'s','Color',[1.0,1.0,0.0]) %yelow color
hold off;

Colormap

When only one value is associated to each point, Matlab offers the possibility of chossing a color scale named colormap ( jet by default). It consist of a table of 64 RGB different colors associated from the maximum value (red) to the minimum one (blue).

Let's see an exemple considering only one element: We consider a simple example where a Triangle is defined by its nodes and a numerical value is associated to each node.

Using the FILL function a color representation is obtained where each point on the triangle has an interpolated color computed from the vertices values and the colormap.

nodes=[1,1;  %define the nodes of a triangle
    3,2;
    2,4];
elem=[1,2,3]; %define the triangle it self as an element
X=nodes(:,1);
Y=nodes(:,2);
values=[0;128;255]; %can be temperature, stress, etc.
fill(X,Y,values);
colormap('jet') %one of the standar color maps for FEM
colorbar %it is optional, shows the bar with the color scale
hold on;
p=[2,3]; %consider a point
plot(p(1,1),p(1,2),'ko'); %plot the point using a black o
hold off;

Exercise 1:

Use the same value for all nodes and you will get a flat color triangle

Use also colormap('gray') to obtain a gray color image

A color triangle mesh

Using the previous approach one can represent the color interpolation of each triangle in a triangle mesh.

We have build a general function plotContourSolution.m in this case.

Consider the triangle mesh in meshHole.m and assign a value of temperature for each node (like in one of our previous practices).

eval('meshHole');
numNodes=size(nodes,1);
numElem=size(elem,1);

% Just as an example we gave a temperature value for each node
Temp=1:numNodes; %temperature for node i is assigned as T(i)=i;

titol='Temperature Plot';
colorScale='jet';
% We will use our own function for plotting a colored mesh
% it can plot both triangular and quadrangular meshes.
plotContourSolution(nodes,elem,Temp,titol,colorScale);

Exercise 2:

Plot the quadrangular mesh meshTwoHolesQuad.m using the above function.

Selection of a set of points: Boundaries

From the nodes of a mesh, we can select different set of points from a mathematical equation or condition.

The Matlab function to use is find. It allow us to recover the indices (row and column) of a table that meets a condition. The sintax is:

[indRow, indCol]= find(condition)

Example: Select the left boundary nodes according their x-coordinate. Instead of using =0, we introduce a small tolerance (better when using floats)

[indexLeft, indCol]=find(nodes(:,1)<0.01); %index are the node numbers
hold on;
plot(nodes(indexLeft,1),nodes(indexLeft,2),'mo')

Exercise 3:

Compute the index set for all points in the boundary of the meshHole example. Make different selection for the left, rigth, top, botton and circle segment boundaries and build an indexBoundary vector using all of them. You must obtain the following number of nodes:

indexLeft: 10, indexRight:17, indexTop: 9, indexBottom: 9, indexCircle: 11

indexBoundary: 50

Hint. Use the Matlab function unique to erase repeated nodes in the global indexBoundary vector.

Recovering all boundary points

We have also a function to obtain all the boundary nodes and elements.

[indNodBd, indElemBd, indLocalEdgBd, edges] = boundaryNodes(nodes, elem);
fprintf(' number of Boundary nodes = %d \n',length(indNodBd));
fprintf(' number of Boundary elements = %d \n',length(indElemBd));

% show the elements and nodes at the boundary
figure()
plotElements(nodes, elem, 0);
hold on;
for i=1:length(indElemBd)
    fill(nodes(elem(indElemBd(i),:),1),nodes(elem(indElemBd(i),:),2),'y')
end
plot(nodes(indNodBd,1), nodes(indNodBd,2),'rs');
hold off;

%
% You can substract some of the boundary node sets
% using the *setdiff* Matlab function
%
newNodesBd=setdiff(indNodBd,indexLeft);
figure()
plotElements(nodes, elem, 0);
hold on;
plot(nodes(newNodesBd,1), nodes(newNodesBd,2),'rs');
hold off;
 number of Boundary nodes = 50 
 number of Boundary elements = 50 

Exercise 4:

Compute the number of nodes in the boundary of the meshTwoHolesQuad.m example. using the boundaryNodes function.

Sol= 170

% *(c)Numerical Factory 2019*