Create black line on colorbar to mark specific value
24 次查看(过去 30 天)
显示 更早的评论
Hi again.
I have been working on a GUI that creates a contour depending on certain slider values.
I have elevated a specific isoline in the contour by marking it black.
Is it possible to elevate the corresponding position on the colorbar? I have uploaded two images. The first one shows the contour as it is, the second one shows it as I would like it to be, with the colorbar elevation added manually by hand:
as I would like it to be: http://s1329.photobucket.com/user/mrcjkb89/media/Capture2_zps08df0db3.jpg.html
Here is the code for my contour (p_nb is the value of the elevated isoline):
contour(handles.SKosten,x1,x1,p_sk,'LevelStep',2,'Fill','on')
hold on
contour(handles.SKosten,x1,x1,p_sk, [p_nb p_nb], 'Color','k','LineWidth',1.45)
And here's the code for the colormap:
b = [.091 .153 0;...
.114 .159 0;...
.137 .166 .001;...
.160 .172 .001;...
.184 .178 .001;...
.207 .184 .001;...
.230 .191 .002;...
.253 .197 .002;...
.253 .181 .003;...
.253 .166 .005;...
.253 .150 .006;...
.254 .134 .007;...
.254 .118 .008;...
.254 .103 .010;...
.254 .087 .011];
b = b*1000;
b = b/255;
caxis([20 50]);
cmp = colormap(b);
cbr = colorbar;
set(cbr,'YTick',20:2:50,'FontSize',9)
b actually changes with a switch (depending on the value of p_nb), so that the inside of the elevated isoline is always green and the outside always yellow/red. I think it would be too much to post the whole thing here, but knowing that could be relevant..
Thanks in advance!
Marc
0 个评论
采纳的回答
Sean de Wolski
2013-9-9
编辑:Sean de Wolski
2013-9-9
Good Monday morning brain stimulator!
% Level we care about
level = 0;
% Plot and store colorbar handles
contourf(peaks,-3:3);
hCbar = colorbar;
% Add line to colorbar
line('parent',hCbar,'xdata',[-5 5],...
'ydata',[level level],'color','k','LineWidth',3)
% Note you'll have to swap x/ydata for a horizontal colorbar
% Plot a second contour plot with just the level we care about. Make it
% transparent with a nice thick line
hold on
[~,hCont] = contourf(peaks,[level level]); %contour handles
set(allchild(hCont),'FaceAlpha',0,...
'LineWidth',3,'EdgeColor','k'); %children are patches
4 个评论
Dennis
2016-11-24
编辑:Dennis
2016-11-24
Here's one way to plot a line over the colorbar starting from R2014b:
level = 0.45;
h_colorbar = colorbar;
h_axes = axes('position', h_colorbar.Position, 'ylim', h_colorbar.Limits, 'color', 'none', 'visible','off');
line(h_axes.XLim, level*[1 1], 'color', 'white', 'parent', h_axes);
Ryan Stanyard
2020-6-7
This works beautifully, but when I maximise the figure, the lines are both too elongated and distal from the colorbar. Any thoughts?
I.E.
Versus default (non-maximised)
更多回答(2 个)
Adam Stooke
2015-10-23
Somewhere around R2014, colorbar is no longer an axes object. Oi. So my first thought was to pull the colorbar inside the axes, where we can draw another line over it anyway. But the colorbar 'position' property gives the location in terms of figure units--hardly helpful for locating a line over it. Instead, here is some code that manually creates a colorbar within an axes object, using patches.
This setup locates the colorbar using the plot values, so if your axes need to change limits during an animation, this won't work. I guess in that scenario we could create a separate axes object to contain this colorbar.
% colorbar code test.
figure;
axes;
%
% Set up the axes size.
axLim = 1;
axMaxX = 1.2*axLim;
xlim([-axLim,axMaxX])
ylim([-axLim,axLim])
%
% Define the colormap
colormap jet
colorLim = 20;
caxis([-colorLim, colorLim])
nColors = 30;
%
% Get colormap plotting data ready.
% Making these in units of whatever values are plotted on the axes,
% hopefully this doesn't need to change for you (or for me later)!
cbarWidth = axLim*0.1;
cbarHeight = axLim*0.9; % actually half height
cbarLeft = axMaxX-3*cbarWidth;
cbarRight = cbarLeft + cbarWidth;
cbarX = [cbarLeft,cbarRight,cbarRight,cbarLeft];
cbarSeg = cbarHeight*2/nColors;
cbarY = [-cbarSeg,-cbarSeg,0,0] - cbarHeight;
cDataList = linspace(-colorLim,colorLim,nColors);
%
% Create a patch to make the border around the bar.
patch(cbarX,cbarHeight*[-1,-1,1,1],[1,1,1],'linewidth',3)
%
% Create each of the patches in the colorbar.
for iColor = 1:nColors
patch(cbarX,cbarY+iColor*cbarSeg,cDataList(iColor),'edgecolor','none')
end
%
% Put some kind of label on it.
text('String','\leftarrow Label \rightarrow ',...
'Position',[axMaxX-cbarWidth, 0],'HorizontalAlignment','center',...
'Rotation',90,'fontsize',14)
%
% Draw the line on it.
h_line_cbar = line([cbarLeft,cbarRight],[0,0],'color','k','linewidth',4);
%
% Move the line around.
lineHeights = sin(2*pi*(1:100)/50)*cbarHeight;
for i = 1:numel(lineHeights)
set(h_line_cbar,'ydata',[lineHeights(i),lineHeights(i)])
pause(0.05)
end
Moreno, M.
2024-8-31
My workaround to this problem is to create a second figure for the colorbar. I would then either interpolate a colored region in the new colorbar, or find the closest element to my desired band and color it as desired. The simplest implementation of this approach would replace the colormap values inside of the band by the desired color. Here is my suggestion:
% Create dummy data
figure
tiledlayout(1,100)
nexttile([1,99]);
hold on
contourf(peaks,10,'EdgeColor','none')
contour3(peaks,[5,5],'k')
% Color a specific band in 'val'
val = 5;
lim = caxis;
col = parula(200);
idx = lim(1):(lim(2)-lim(1))/199:lim(2);
[~,idx] = min(abs(idx-val));
col(idx,:) = 0;
% Plot colorbar
nexttile([1,1])
colormap(col)
colorbar
axis off
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Colormaps 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!