# Two-dimensional colormap

6 views (last 30 days)
Richard Wood on 20 Feb 2020
Commented: Richard Wood on 20 Feb 2020
Hello everyone,
I have the following arrays: spatial_grid(30001x1 elements), physical_time_elastic (2431x1 elements), and data_set_elastic (30001x4x2431 elements). What I want to is to plot a something like the figures that appears here: https://blogs.mathworks.com/steve/2016/04/25/clim-caxis-imshow-and-imagesc/. In my case, the x-th axis will be spatial_grid, the y-th axis the physical_time_elastic array, and the magnitude that will be encoded by colors will data_set_elastic (:,2,i), where i runs over the elements of physical_time_elastic (note that length(physical_time_elastic)=2431, as the number of elements of data_set_elastic in the third dimension). For each i, therefore, I have the value that corresponds to (spatial_grid, physical_time_elastic). What I have tried to do is the following, but it does not work:
outputdir='Figures';
u1=figure(1)
for i=1:length(physical_time_elastic)
image(spatial_grid.*(10^6),physical_time_elastic(i).*(10^(12)),data_set_elastic(:,2,i))
end
colormap jet;
axis xy;
clr1=colorbar;
xlabel('Track position, $x \, \, \left( \mu\mathrm{m} \right)$','FontSize',14,'interpreter','latex')
ylabel('Time, $t \, \, \left( \mathrm{ps} \right)$','FontSize',14,'interpreter','latex')
ylabel(clr1,'$m_x$','Interpreter','Latex','FontSize',14);
t1=title('Elastic scattering, $w_{1,2}=1/2$','FontSize',14,'interpreter','latex')
set(t1,'interpreter','latex','FontSize',14)
set(gca,'TickLabelInterpreter','latex','FontSize',14)
set(u1,'Units','Inches');
posu1=get(u1,'Position');
set(u1,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[posu1(3),posu1(4)])
saveas(gcf,fullfile(outputdir,['In-Plane_Magnetization_Distribution_Elastic_Scattering.pdf']))
Any idea? I have attached a sample of what I get. The values that appears in the colorbar are completly wrong, because the variable that it is encoded in the color has values between -1 and +1. Also the track position begins in 0 and goes to a value like 3000, increasing its value linearly.

Joseph Cheng on 20 Feb 2020
Edited: Joseph Cheng on 20 Feb 2020
I'm puzzeled by your first portion and the need for a for loop. unless you have a hold somewhere the images shouldn't be stacking and you're only doing it per item in physical_time_eleastic so you're imaging a single index at a time but without hold.... i'm not sure what is going on there.
outputdir='Figures';
u1=figure(1)
for i=1:length(physical_time_elastic)
image(spatial_grid.*(10^6),physical_time_elastic(i).*(10^(12)),data_set_elastic(:,2,i))
end
colormap jet;
in each loop you are imaging a 1x30001 image and overwriting it. as well as axes are not set correctly as your x and y do not match column row of data_set_elastic. so something else is going on there.
why don't you image the whole 2nd dimension?
here is dummy data
spatial_grid = [0:300]';
physical_time_elastic = [0:10:1000]';
data_set_elastic = 2*rand(301,3,101)-1;
u1=figure(1)
% hold on
% for i=1:length(physical_time_elastic)
% image(spatial_grid.*(10^6),physical_time_elastic(i).*(10^(12)),data_set_elastic(:,2,i))
% end
imagesc(spatial_grid,physical_time_elastic,squeeze(data_set_elastic(:,2,:))');
colormap jet;
colorbar
note squeezing data_set_elastic(:,2,:) which for you is (30001 x 1 x 2431 elements) would turn out to be (30001 x 2431 elements) which then doesn't match your 30001 for x (ie columns of the image) and 2431 for y. which is why there is a transpose of squeezing data_set_elastic(:,2,:)' .
also i'm not sure image deals with negative values which you should then use imagesc or other functions which you define the color scale.

Richard Wood on 20 Feb 2020
Thank you for your comment. I have tried it, and I obtain something very strange.
u1=figure(1)
imagesc(spatial_grid.*(10^6),physical_time_elastic.*(10^(12)),mx_elastic')
AxesH=axes('CLim',[-1, 1]);
clr1=colorbar('peer',AxesH,...
'YTickLabel',{'-1','-0.5','0','0.5','1'},'YTick',[-1:0.5:1]);
% clr1=colorbar(axes('CLim',[-1,1]),'YTickLabel',{'-1','-0.5','0','0.5','1'},'YTick',[-1:0.5:1]);
xlabel('Track position, $x \, \, \left( \mu\mathrm{m} \right)$','FontSize',14,'interpreter','latex')
ylabel('Time, $t \, \, \left( \mathrm{ps} \right)$','FontSize',14,'interpreter','latex')
ylabel(clr1,'$m_x$','Interpreter','Latex','FontSize',14);
t1=title('Elastic collision, $w_{\mathrm{overall}}=1$','FontSize',14,'interpreter','latex')
set(t1,'interpreter','latex','FontSize',14)
set(gca,'TickLabelInterpreter','latex','FontSize',14)
set(gca,'Ydir','normal')
set(u1,'Units','Inches');
posu1=get(u1,'Position');
set(u1,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[posu1(3),posu1(4)])
saveas(gcf,fullfile(outputdir,['In-Plane_Magnetization_Distribution_Elastic_Collision.pdf']))
Maybe I am still misunderstanding something from the Jan's post.
Joseph Cheng on 20 Feb 2020
you shouldn't just implement but digest what is going on. by doing axes afer imagesc you created a new axes inside the figure.
again just use caxis() function like you would xlim, ylim or zlim to set the limits in a plot if you are not familiar with matlab graphical handles.
see example:
figure(1);
dummydata = randi(10,10,10);
subplot(121),imagesc(dummydata )
caxis([0 10])
colorbar
subplot(122),imagesc(dummydata ),caxis([0 50])
colorbar
Richard Wood on 20 Feb 2020
I see your point about creating additional axis. The function caxis works as expected. Nothing more to ask, thank you very much for everything.