Removing the edge line on a contour plot

杀马特。学长 韩版系。学妹 提交于 2019-12-05 02:49:11

问题


I used Matlab to create a polar coordinate and converted it into Cartesian coordinate.

[th,r] = meshgrid((0:0.5:360)*pi/180,0:.02:1);
[X,Y] = pol2cart(th,r);

I get data on this mesh and produce a contourf plot over it.

My problem is that I get a center line in my contourf plot which I would like to remove, could some help me with this

Thank you


回答1:


If I extend a little bit your example to get something I can plot, I do reproduce the problem:

[th,r] = meshgrid((0:0.5:360)*pi/180,0:.02:1);
[X,Y] = pol2cart(th,r);
Z = sqrt( X.^2 + Y.^2 ) ;

isoLevel = 0:0.1:10 ;
[C ,hc] = contourf(X,Y,Z,isoLevel) ;

The black line at the interface is because the function contourf create patch objects and these objects tend to "close" themselves (they will create a line between the first and last point defined in their profile).

This is easier to observe if you do not complete the definition of your profile over 360 degrees. The picture on the right shows you the same example but with the grid only from 0:350 and with the LineStyle set to :.

As you can see, it is difficult to control how Matlab will actually render this specific profile limit. There are ways to control specific edges of patch objects but in this case it would involve retrieving the handle of each patch object (10 in my case but many more in more complex cases), locating the edge you want to control and basically redefining the patch (each of them). You'd be better off drawing the patches from scratch yourself.


Fortunately, there is a simple ways out of that: Get rid of all the patch edge lines...

but then you may miss your isolines! No problem, just plot them on top of the patches ! You get all your colored patches (with no border) and a set of (iso)lines over which you have full control.

Two easy way to get you patch without lines (i) set the shading to shading flat, or (ii) specify 'EdgeColor','none' in the parameter of the contourf function.

To get your isolines on top, use the sister contour function.

So using the same X,Y and Z data than previously:

isoLevel = 0:0.1:10 ;
[C ,hc] = contourf(X,Y,Z,isoLevel,'EdgeColor','none') ;  %// set of patches without border
% shading flat %// use that if you didn't specify ('EdgeColor','none') above
hold on
[C2 ,hc2] = contour(X,Y,Z,isoLevel,'LineColor','k') ;    %// now get your isolines

will render:

It's a good idea to store the handle hc2 in case you want to modify your isolines properties (color, style, thicknes etc ...).

Also, specifying the isoline levels is recommended. This way you can make sure both contour and contourf will use the same set of isovalues. It could probably work without this (because the underlying dataset is the same), but personally I always prefer to be explicit and not rely on background calculations.



来源:https://stackoverflow.com/questions/28239826/removing-the-edge-line-on-a-contour-plot

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!