How to make a discrete colorbar with specified intervals?
312 次查看(过去 30 天)
显示 更早的评论
Hi all,
I want to change the default colorbar to a discrete one (i.e. with blocks) of non-evenly spaced intervals.
I uploaded an image as an attechment to show what I would like.
I hope someone can help.
Thanks
0 个评论
采纳的回答
Cris LaPierre
2022-8-11
In re-reading the orginal question, it is worth clarifying that this solution only visually creates the colorbar. On its own that is not enough to make the data in the plot match the colorbar. Note that the tick locations are evenly spaced from 0 to 500. The code programmatically replaces the original labels with the new labels.
Separate code is necessary to rescale the values so that the colors in the colorbar correspond to values in the plot. Said another way, anything colored white has a value up to 31.25, not 0.01.
tickVals = linspace(0,500,17)
Apologies for that confusion. Here's sample code for how I would do this for my example. To work, you also have to specify the levels contourf should use.
% Create a data set with values from 0 to 600 (was 500 previously)
data = rescale(peaks,0,600);
% copy a copy of the data for rescaling
newdata = data;
% New tick values
newTickVals = [0 0.01 0.5 1 1.5 2 5 10 15 20 25 50 75 100 250 500 inf];
for tv = 2:length(newTickVals)
% find all data between the new tick ranges, one block at a time
ind = data>newTickVals(tv-1) & data<=newTickVals(tv);
% Change the corresponding values in the copied data to scale to the
% block edges
newdata(ind) = rescale(data(ind),tickVals(tv-1),tickVals(tv));
end
% The rest of the code remains the same (with addition of specifying
% levels)
contourf(newdata,tickVals)
C=parula(15);
C(end+1,:)=1;
colormap(flipud(C))
colorbar('Ticks',tickVals,...
'TickLabels',["" "0.01" "0.5" "1" "1.5" "2" "5" "10" "15" "20" "25" "50" "75" "100" "250" "500" ">500"]);
Now the colorbar colors correspond to the values in the original data variable
Note: Because this approach rescales the data to make a non-linear colorbar range possible, I think this approach only works for 2D plots (i.e. plots where only color is used to show the Z value. This approach will distort the appearance of the plot if it is plotted in 3D, e.g. a surface plot.)
0 个评论
更多回答(1 个)
Cris LaPierre
2021-2-7
Your colorbar is set by the resolution of your colormap. If you want a colobar with 16 colors, set a colormap that only has 16 defined colors. Here's an example that recreates the "block" colorbar.
contourf(rescale(peaks,0,500))
C=parula(15);
C(end+1,:)=1;
colormap(flipud(C))
colorbar('Ticks',linspace(0,500,17),...
'TickLabels',["" "0.01" "0.5" "1" "1.5" "2" "5" "10" "15" "20" "25" "50" "75" "100" "250" "500" ">500"]);
6 个评论
Cris LaPierre
2022-8-11
I'm going to create a new answer and unaccept the one that is currently accepted as it is misleading.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Colormaps 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!