Matlab: colorbar of contourplot only for specified contour levels

조회 수: 7 (최근 30일)
Contour
Contour 2023년 10월 19일
편집: Florian Bidaud 2023년 10월 19일
I plotted a contour plot in Matlab with data stored in in A, B and C.
contourf(A,B,C,'LineColor','none')
The data stored in C contains values which are 1, 45, 600 and 1000. So the contour plot has only 4 different contour levels. So far as good.
No my issue: I want to show a colorbar with only the 4 contour levels and only the particular colors for 1, 45, 600 and 1000. Therefore I used the code:
colorbar('Ticks',[1,45,600,1000]);
Unfortunatly, Matlab is now plotting a gradient colorbar from 0 to 1000 (gradient colors) and shows only the ticks defined in the code above at the position between 0 and 1000.
How can I get a colorbar showing only the 4 contour levels without a colorgradient?
Thanks in advance!
  댓글 수: 1
Dyuman Joshi
Dyuman Joshi 2023년 10월 19일
Could you share the data you are working with? Use the paperclip button to attach.

댓글을 달려면 로그인하십시오.

답변 (2개)

Florian Bidaud
Florian Bidaud 2023년 10월 19일
편집: Florian Bidaud 2023년 10월 19일
f = figure(1);
c = colorbar;
f.Children(2).CLim = [0 1000];
c.Ticks = [2 45 600 1000];
color_array = [0 0 1; 0 1 0; 1 1 0; 1 0 0];
f.Colormap = [repmat(color_array(1,:),c.Ticks(1)+1,1); repmat(color_array(2,:),c.Ticks(2)-c.Ticks(1)-1,1); repmat(color_array(3,:),c.Ticks(3)-c.Ticks(2),1); repmat(color_array(4,:),c.Ticks(4)-c.Ticks(3),1)];
You can choose the colors with the color_array, with 1x3 vectors of values from 0 to 1.
Then you can plot your contour :)
EDIT: if you know you have only these four values, you could even do something like this:
f = figure(2);
c = colorbar;
f.Children(2).CLim = [0 1000];
c.Ticks = [2 45 600 1000];
c.TickDirection = 'none';
color_array = [0 0 1; 0 1 0; 1 1 0; 1 0 0];
f.Colormap = [repmat([0 0 0],max(0,c.Ticks(1)-10),1); repmat(color_array(1,:),18,1); repmat([0 0 0],max(0,c.Ticks(2)-c.Ticks(1)-20),1); repmat(color_array(2,:),18,1); repmat([0 0 0],max(0,c.Ticks(3)-c.Ticks(2)-20),1); repmat(color_array(3,:),18,1); repmat([0 0 0],max(0,c.Ticks(4)-c.Ticks(3)-12),1); repmat(color_array(4,:),18,1)];
  댓글 수: 2
Contour
Contour 2023년 10월 19일
Hi Florian,
Thank you for the fast reply! When I plot the contour plot the colorbar colors are not matching the color of the contour levels. :/
In addition, is there a way so that the colorbar is separated in cells of the same size? So the cell between 0 and 1 should have the same size as between 600 and 800 and so on?
Florian Bidaud
Florian Bidaud 2023년 10월 19일
편집: Florian Bidaud 2023년 10월 19일
Try ploting the contour before everything else like this, and with the right levels.
f = figure(2);
contour([45 45 45; 45 600 1000; 1000 45 2;1000 1000 0; 1000 500 400],[2 45 600 1000])
c = colorbar;
f.Children(2).CLim = [0 1000];
c.Ticks = [2 45 600 1000];
c.TickDirection = 'none';
color_array = [0 0 1; 0 1 0; 1 1 0; 1 0 0];
f.Colormap = [repmat([0 0 0],max(0,c.Ticks(1)-10),1); repmat(color_array(1,:),18,1); repmat([0 0 0],max(0,c.Ticks(2)-c.Ticks(1)-20),1); repmat(color_array(2,:),18,1); repmat([0 0 0],max(0,c.Ticks(3)-c.Ticks(2)-20),1); repmat(color_array(3,:),18,1); repmat([0 0 0],max(0,c.Ticks(4)-c.Ticks(3)-12),1); repmat(color_array(4,:),18,1)];

댓글을 달려면 로그인하십시오.


Star Strider
Star Strider 2023년 10월 19일
I cannot get the ticks exactly where I would like them, even doing my best to interpolate them.
Perhaps this —
[X,Y,Z] = peaks(20); % Create Data
[z1,z2] = bounds(Z(:));
Z = (Z-z1*0.95) * 2E+2;
Lvls = [1 45 600 1000]; % Define Levels
figure
% contour(X, Y, Z, Lvls, 'ShowText',1)
contourf(X, Y, Z, Lvls, 'ShowText',1)
colormap(turbo(numel(Lvls)))
hcb = colorbar;
tx = hcb.Ticks;
txv = interp1([0 1],[min(tx) max(tx)],(0:numel(Lvls)-1)/(numel(Lvls)-1)); % Interpolate Tick Positions
hcb.Ticks = txv;
hcb.TickLabels = Lvls;
.

카테고리

Help CenterFile Exchange에서 Contour Plots에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by