67 views (last 30 days)
Show older comments
Sean Morgan on 12 Jun 2024 at 14:57
-
-
Link
Direct link to this question
https://ms-intl.mathworks.com/matlabcentral/answers/2127941-how-can-i-put-a-custom-colorbar-into-a-figure-with-multiple-datasets-datatypes
Answered: Sean Morgan about 18 hours ago
Accepted Answer: Sean Morgan
I have an interesting situation where I am trying to overlay 3 different datatypes and make a custom colorbar for one of them.
For context, it first has and RBG image loaded using imagesc, scaled to lat/lon limits. The colors of the image are supposed to correlate with concentration and this is what I which to display in the color bar (the dark green to bright yellow).
Secondly, it has two contours (contourf): one for the depth contours and one for the coastline. This is overlayed so that it lines up with the RGB image. These contours also have their own colormap
Finally, it has 3 sets of data plotted using just 'plot' overtop of that.
I have created a custom color set corresponding to the range of colors in the RGB image, but I need the land and everything else to follow a different colormap. I also need to somehow scale the colorbar output to the corresponding concentrations. Currently, the colorbar only uses the depth data, and changing the colormap changes the colormap of all data sets. I hope the images below make the issue more clear.
I would like the colorbar to have the colors of the first picture, but scaled to the concentrations and not depth. And I would like the rest of the image to look like the second picture.
Thank you in advance! And sorry if this isn't super clear.
Sean
4 Comments Show 2 older commentsHide 2 older comments
Show 2 older commentsHide 2 older comments
Avni Agrawal on 18 Jun 2024 at 5:21
Direct link to this comment
https://ms-intl.mathworks.com/matlabcentral/answers/2127941-how-can-i-put-a-custom-colorbar-into-a-figure-with-multiple-datasets-datatypes#comment_3189071
Hi, can you share the code for better understanding?
Sean Morgan on 18 Jun 2024 at 14:42
Direct link to this comment
https://ms-intl.mathworks.com/matlabcentral/answers/2127941-how-can-i-put-a-custom-colorbar-into-a-figure-with-multiple-datasets-datatypes#comment_3189511
Open in MATLAB Online
Here is the code for the figure. I didn't upload it originally because its kind of complicated.
c_map = [0.2 0.1 0.0;0.25 0.15 0.0;0.3 0.2 0.05;0.35 0.25 0.1;0.45 0.3 0.1;0.5 0.35 0.1;0.55 0.4 0.1;0.6 0.45 0.1;
0.65 0.5 0.1;0.75 0.55 0.2;0.85 0.6 0.3;0.95 0.65 0.4;1 0.7 0.5;1 0.75 0.6;1 0.8 0.65;1 0.85 0.7;
0.2 0.2 0.2];
% c_map is originally for the depth contours and land mass. Now I am only
% using it for the land masses.
c_map2=[0.13 0.56 0.55; 0.19 0.71 0.47; 0.45 0.82 0.33; 0.51 0.83 0.30; 0.98 0.90 0.13];
% c_map2 corresponds to the colors of the green and yellow background
% image.
figure();
colormap(c_map) % c_map is the brown to black and then c_map2 is yellow to green
im=imagesc(lonlim_local,latlim_local_inv,A); % A is the RGB image for the green and yellow background
set(gca,'YDir','normal')
hold on
colorbar
% This is for the contour map of depth with labels.
contourf(m_lon,m_lat,m_bath',[0 -25 -50 -100 -200 -300], 'ShowText','on' ,"FaceAlpha",0);
hold on
% This is to show the land, starting at a depth of -0.5 m.
contourf(m_lon,m_lat,m_bath','LevelList',-0.5,'LineColor','black'); %
% This is to set the axis limits to a predefined latitude and longitude
% bounding box
ylim(latlim_local)
xlim(lonlim_local)
% The next three plots are to show the three colored line segments
hold on
r1=plot(shlw_rgn.("Lon (deg)"),shlw_rgn.("Lat (deg)"), 'LineWidth',5, "DisplayName","Near-shore Region");
hold on
r2=plot(zzg_rgn.("Lon (deg)"),zzg_rgn.("Lat (deg)"), 'LineWidth',5, "DisplayName","Off-shore Region");
hold on
r3=plot(rtrn_rgn.("Lon (deg)"),rtrn_rgn.("Lat (deg)"), 'LineWidth',5, "DisplayName","Return Region");
legend([r1 r2 r3]);
hold on
xlabel('Longitude (°)');
ylabel('Latitude (°)');
% This is to create the inset map with bounding box
axes('Position',[.15 .125 .15 .275])
box on
% Creates a contour of the north american coastline based at a depth of 0
contourf(i_lon,i_lat,i_bath','LevelList',0,'LineColor','black');
text(-82.5, 49, "Canada");
text(-87.5, 38, {"United", "States"});
hold on
% Shelf is the bounding box for the small box in the inset map
plot(shelf)
set(gca,'XTick',[], 'YTick', [])
Taylor on 18 Jun 2024 at 14:47
Direct link to this comment
https://ms-intl.mathworks.com/matlabcentral/answers/2127941-how-can-i-put-a-custom-colorbar-into-a-figure-with-multiple-datasets-datatypes#comment_3189536
I think you just need to define the axes target for your colorbar
Sean Morgan about 18 hours ago
Direct link to this comment
https://ms-intl.mathworks.com/matlabcentral/answers/2127941-how-can-i-put-a-custom-colorbar-into-a-figure-with-multiple-datasets-datatypes#comment_3191826
Open in MATLAB Online
I have tried, as shown in the following code, but when I do that the green and yellow RGB image doesn't show through the contour plot.
figure();
ax1=axes;
im=imagesc(ax1,lonlim_local,latlim_local_inv,A);
colormap(ax1,c_map2) % c_map is the brown to black and then c_map2 is yellow to green
set(gca,'YDir','normal')
colorbar(ax1)
hold on
ax2 = axes('position', ax1.Position);
contourf(ax2,m_lon,m_lat,m_bath',[0 -25 -50 -100 -200 -300], 'ShowText','on' ,"FaceAlpha",0);
colormap(ax2,c_map)
hold on
fontsize(16,"points")
contourf(ax2,m_lon,m_lat,m_bath','LevelList',-0.5,'LineColor','black'); %
ylim(latlim_local)
xlim(lonlim_local)
hold on
r1=plot(ax2,shlw_rgn.("Lon (deg)"),shlw_rgn.("Lat (deg)"), 'LineWidth',5, "DisplayName","Near-shore Region");
hold on
r2=plot(ax2,zzg_rgn.("Lon (deg)"),zzg_rgn.("Lat (deg)"), 'LineWidth',5, "DisplayName","Off-shore Region");
hold on
r3=plot(ax2,rtrn_rgn.("Lon (deg)"),rtrn_rgn.("Lat (deg)"), 'LineWidth',5, "DisplayName","Return Region");
legend([r1 r2 r3]);
hold on
xlabel('Longitude (°)');
ylabel('Latitude (°)');
ax3=axes('Position',[.15 .125 .15 .275]);
box on
contourf(ax3,i_lon,i_lat,i_bath','LevelList',0,'LineColor','black');
colormap(ax3,c_map)
text(-82.5, 49, "Canada");
text(-87.5, 38, {"United", "States"});
hold on
plot(shelf)
set(gca,'XTick',[], 'YTick', [])
Sign in to comment.
Sign in to answer this question.
Accepted Answer
Sean Morgan about 18 hours ago
I figured it out. I had to define axis targets as well as set the axis background color to 'none' and then align the axis limits.
Thanks!
0 Comments Show -2 older commentsHide -2 older comments
Show -2 older commentsHide -2 older comments
Sign in to comment.
More Answers (0)
Sign in to answer this question.
An Error Occurred
Unable to complete the action because of changes made to the page. Reload the page to see its updated state.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- Deutsch
- English
- Français
- United Kingdom(English)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)
Contact your local office