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

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.

 採用された回答

Star Strider
Star Strider 2020 年 10 月 23 日

0 投票

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).

8 件のコメント

Prince Alex
Prince Alex 2020 年 10 月 23 日
編集済み: Prince Alex 2020 年 10 月 23 日
your program works very well. Seems like its not working for my data. My x,y and z are not grided data. I created a grid and tried. But it failed. Here I have attached my xy and z datas. If you can give some direction?
Star Strider
Star Strider 2020 年 10 月 23 日
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:
.
Prince Alex
Prince Alex 2020 年 10 月 23 日
Thats fantastic. Thanks a lottttt.
Star Strider
Star Strider 2020 年 10 月 23 日
As always, my pleasure!
And thanks for an interesting problem!
doruk isik
doruk isik 2022 年 9 月 26 日
I know it's been quite a while since you posed this solution but it works perfectly until I try to set the contour levels manually.
For example if I change the cc.LevelList or cc.LevelStep, it does not show anything. Of course I can see everything with solid lines if I set the color to 'k', but how can I have dashed negatives while controlling the contour levels?
@doruk isik — I can’t determine what the problem is with your implementation.
Another approach could be —
[X,Y,Z] = peaks(50);
Zext = [min(Z(:)) max(Z(:))];
Zneg = linspace(Zext(1), -0.5, 7);
Zpos = linspace(0.5, Zext(2), 7);
lblfmt = '%.2f';
figure
contour(X, Y,Z, Zneg, '--', 'ShowText',1, 'LabelFormat',lblfmt, 'DisplayName','Negative Contours')
hold on
contour(X, Y, Z, Zpos, '-', 'ShowText',1, 'LabelFormat',lblfmt, 'DisplayName','Positive Contours')
contour(X, Y, Z, [0 0], ':k', 'ShowText',1, 'LabelFormat',lblfmt, 'DisplayName','Zero Contours')
hold off
colormap(turbo(14))
legend('Location','northoutside','Orientation','horiz')
It depends on what you want to do and how you want to do it.
.
doruk isik
doruk isik 2022 年 9 月 27 日
I was just testing different stuff with the code you provided in 2020. If I use it as is, it gives me the following
If I modify the contour handle cc by manually defining the levels as such
[CM,cc] = contour(Xm,Ym,Zm,'ShowText','on');
cc.LineStyle = ':';
cc.Color = 'w';
cc.LevelList=-0.1:0.02:0.1; % this is my addition
Lvls = cc.LevelList;
it gives me the following
Star Strider
Star Strider 2022 年 9 月 27 日
The contour function chooses the contour level values and number of levels itself if they aren’t specified. It likely specifies more contours than the colon operator chooses. To get more of them,, either use a smaller step size than 0.02 or use the linspace function. The colon operator fixes the step increment and lets the length (number of elements) vary. The linspace function fixes the number of elements and varies the step increment.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File ExchangeContour Plots についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by