MATLAB Answers

Plot Solid Positive-Valued/Dashed Negative-Valued Contour Plot

12 views (last 30 days)
Prince Alex
Prince Alex on 23 Oct 2020
Commented: Star Strider on 23 Oct 2020
How is it possible to plot a contour plot with solid lines for positive values (above zero) and dashed lines for negative values. An example plot is attached.

  0 Comments

Sign in to comment.

Accepted Answer

Star Strider
Star Strider on 23 Oct 2020
The contour function itself cannot do that, however it is srtaightforward to adapt it:
[X,Y,Z] = peaks;
figure
hold on
[CM,cc] = contour(X,Y,Z,'ShowText','on');
cc.LineStyle = ':';
cc.Color = 'w';
Lvls = cc.LevelList;
PosIdx = find(ismember(CM(1,:),Lvls(Lvls>=0)));
PosLen = CM(2,PosIdx);
NegIdx = find(ismember(CM(1,:),Lvls(Lvls<0)));
NegLen = CM(2,NegIdx);
for k = 1:numel(PosIdx)
IdxRng = PosIdx(k)+1:PosIdx(k)+PosLen(k);
plot(CM(1,IdxRng), CM(2,IdxRng), '-k')
end
for k = 1:numel(NegIdx)
IdxRng = NegIdx(k)+1:NegIdx(k)+NegLen(k);
plot(CM(1,IdxRng), CM(2,IdxRng), '--k')
end
hold off
axis('equal')
producing:
This overplots the original contours so that any text values remain visible (ini case you want them shown).

  4 Comments

Show 1 older comment
Star Strider
Star Strider on 23 Oct 2020
Offline for an hour because some idiot ISP technician disconnected the entire neighbourhood!
Try this:
xy = readmatrix('xy.txt');
Z = readmatrix('Z.txt');
[xl,xh] = bounds(xy(:,1));
[yl,yh] = bounds(xy(:,2));
[zl,zh] = bounds(Z);
xv = linspace(xl, xh, 150);
yv = linspace(yl, yh, 150);
[Xm,Ym] = ndgrid(xv, yv);
Zm = griddata(xy(:,1),xy(:,2),Z, Xm, Ym, 'natural');
figure
hold on
[CM,cc] = contour(Xm,Ym,Zm,'ShowText','on');
cc.LineStyle = ':';
cc.Color = 'w';
Lvls = cc.LevelList;
PosIdx = find(ismember(CM(1,:),Lvls(Lvls>=0)));
PosLen = CM(2,PosIdx);
NegIdx = find(ismember(CM(1,:),Lvls(Lvls<0)));
NegLen = CM(2,NegIdx);
for k = 1:numel(PosIdx)
IdxRng = PosIdx(k)+1:PosIdx(k)+PosLen(k);
plot(CM(1,IdxRng), CM(2,IdxRng), '-k')
end
for k = 1:numel(NegIdx)
IdxRng = NegIdx(k)+1:NegIdx(k)+NegLen(k);
plot(CM(1,IdxRng), CM(2,IdxRng), '--k')
end
hold off
grid
axis('equal')
producing:
.
Star Strider
Star Strider on 23 Oct 2020
As always, my pleasure!
And thanks for an interesting problem!

Sign in to comment.

More Answers (0)

Tags

Community Treasure Hunt

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

Start Hunting!