Linking line plot and map (geoshow) together MATLAB
11 views (last 30 days)
Show older comments
Poulomi Ganguli
on 5 Jun 2024
Commented: Austin M. Weber
on 10 Jun 2024
Hello all:
I wish to combine the MATLAB spatial plot generated through mapping function and the line plot on the same axis scale. However, the linkprop function is not working in this case. Please suggest how to make both axis similar?
Here is my code:
figure(1);
AX1 = subplot(1,2,1);
ax=axesm('mercator','MapLatLimit',[-65 65],'MapLonLimit',[-180 180]);
f=worldmap([-60 80],[-180 180]);
h = geoshow(coast1, 'DisplayType', 'polygon','facecolor','w');
oceanColor = [.7 .8 .9];%[.5 .7 .9];
setm(ax,'FFaceColor',oceanColor);
setm(ax, 'meridianlabel', 'on', 'parallellabel', 'on');
setm(gca,'mlabelparallel',-90);
hold on;
%Define coordinates for tropical lines
yvec = -180:180;
xvec = ones(size(yvec));
geoshow(23.5*xvec,yvec,'DisplayType','Line','LineWidth',1,'LineStyle','--','Color','k'); hold on;
geoshow(-23.5*xvec,yvec,'DisplayType','Line','LineWidth',1,'LineStyle','--','Color','k'); hold on;
geoshow(35*xvec,yvec,'DisplayType','Line','LineWidth',0.8,'LineStyle','--','Color','r'); hold on;
geoshow(-35*xvec,yvec,'DisplayType','Line','LineWidth',0.8,'LineStyle','--','Color','r'); hold on;
AX2 = subplot(1,2,2);
h1 = plot(B1,X_dist(:,2),'r--','linew',0.8); hold on;
h2 = plot(B,X_dist(:,2),'r-','linew',1.8); hold on;
h3 = plot(B2,X_dist(:,2),'r--','linew',2); hold on;
set(gca,'fontsize',14,'fontname','arial');
degreetick 'y';
linkprop(AX1,'YLim');
linkprop(AX2,'YLim');
However, I am unable to adjust the size and Y-labels of both subplots. The latitudes of both subplots should match.
0 Comments
Accepted Answer
Austin M. Weber
on 8 Jun 2024
Assuming that I am understanding correctly, if the y-axis of your second subplot is supposed to represent latitude values, then you can try plotting the data using the same map axes specifications as the first subplot. Although, depending on the "x" values in your second subplot you may need to normalize the values so that they fit along the axis as if they were longitude coordinates. Hopefully that makes sense. Here is an example:
load coastlines
figure(1)
subplot(1,2,1)
ax1=axesm('mercator','MapLatLimit',[-65 65]);
tightmap, framem
fillm(coastlat,coastlon,'w','EdgeColor','none')
plabel on
hold on
% Add tropical lines
lonvec = -180:1:180;
latvec = ones(size(lonvec));
plotm( 23.5 .* latvec, lonvec, 'LineW',1.0,'LineS','--','Color','k')
plotm(-23.5 .* latvec, lonvec, 'LineW',1.0,'LineS','--','Color','k')
plotm( 35.0 .* latvec, lonvec, 'LineW',0.8,'LineS','--','Color','r')
plotm(-35.0 .* latvec, lonvec, 'LineW',0.8,'LineS','--','Color','r')
hold off
set(gca,'Color','#03719c') % Sets background color to ocean blue
subplot(1,2,2) % Use the map axes specifications as the previous subplot
ax2=axesm('mercator','MapLatLimit',[-65 65]);
tightmap, framem
B1 = normalize(rand(size(lonvec)),'Range',[-180 180]);
X_dist = normalize(rand(size(B1)),'Range',[-45 45]);
% Sort the data so that the longitudes are sequential
[B1,idx] = sort(B1,'ascend');
X_dist = X_dist(idx);
% Plot your line
plotm(X_dist,B1)
plabel on
As you can see, the y-axis of the second subplot is now aligned with that of the first subplot.
2 Comments
Austin M. Weber
on 10 Jun 2024
The plotm function does work, but the latitude data needs to be sorted so that it is in sequential order. However, you are correct that the function assumes the "values" are in units of longitudinal degrees, and unfortunately that means when you add tick labels the values will have degree symbols next to them, which you don't want (although the values themselves will be correct).
In the code block below, I tried adding my own x-tick labels using textm, but there is probably a better way to go about this. If I think of another solution I will let you know.
% Import data from the Excel file
data = readtable('test1.xlsx','FileType','Spreadsheet');
lat = data.Latitude;
% Sort the latitudes
[lat,idx] = sort(lat,'descend');
val = data.Value;
% Sort the corresponding values
val = val(idx);
% Plot the data
figure
ax2=axesm('mercator','MapLatLimit',[-65 65],'MapLonLimit',[0 40]);
tightmap, framem
plotm(lat, val, '.-',...
'MarkerEdgeColor','#03719c','MarkerSize',8,...
'LineWidth', 1, 'Color', '#04a7e7')
xlabel('Value')
hold on
% Add custom x-tick labels
textm(-63.5, 1, '0', 'HorizontalAlignment','left')
textm(-63.5, 20, '20', 'HorizontalAlignment','center')
textm(-63.5, 39, '40', 'HorizontalAlignment','right')
hold off
plabel on % Latitude tick labels
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!