MATLAB Answers

18

Why is vector graphics chopped into pieces?

A wise scientist knows, that if they wants their data to be published with best quality then they must publish their figures in PostScript (vector) format.
For Matlab they would need to use 'Painters' render function when exporting their figure (either with print, saveas, export_fig commands). This way the figure becomes independent of resolution (and other benefits concerning line widths and types).
After graphical engine upgrade in Matlab 2014b items on PostScript figures have become fragmented. Patches have become combination of triangles and rectangles and lines have become weakly joint polygons. I can't find a single note about it in update notes -.-
There are many inquiries about mysterious lines appearing on figures:
However proper answer or solution is still absent.
Is it a MATLAB issue, or some kind of general PostScript issue? Have this happened with other graphics software also?
Why such "upgrade", which made eps format unusable, was necessary?
What can users do to avoid or fix such poor graphics? (beside switching software)
There is a striking number of earth science (probably also in other fields) papers already published with fragmented "vector graphics" (eg. Article1 , Article2 fig7-8 ,). Not the mentioning increase in size of figure/document/publication that is result of retaining information for each subelement on figure.
See how does your MATLAB handle this issue:
contourf(peaks(100));saveas(gcf,'figure.eps','epsc')
Is it an issue after all?

  댓글 수: 7

표시 이전 댓글 수: 4
Ilja,
true - it is only a grouping. But by doing so at least some of the graphical glitches are resolved (see examples in my github project). If you have some Matlab code for output graphics which cannot be repaired I would like to have a look, maybe it can be improved.
Please re-post it as answer - so it could be marked as potential solution :)
Yes, this is a major issue. Anyone who has more information about the issue; is a solution from MathWorks coming soon, or is it not a prioritized matter?
Anyway, thanks for the work-arounds! Especially, the epsclean function which I find very useful. Thanks!

로그인 to comment.

답변 수: 6

Answer by Stefan Spelitz on 9 Apr 2017
 Accepted Answer

Yes, this problem is all over the internet.
It seems to be an internal Matlab problem, maybe related to their graphics engine HG2. A discussion about this can be found here.
As a workaround I proposed a Matlab script for post-processing .eps files. Of course this does not solve problems with .svg or .pdf files. But .eps files could be manually converted to these formats by using other software (e.g. Illustrator, Inkscape).
Be aware that my tool groups elements according to their properties (e.g. line color, width, ...) which might not be what you want, since two separate lines with the same color might be grouped together in the same layer.
The underlying problem in Matlab seems to be that the exported data is separated into different path elements although logically they should be grouped together. As a result some vector graphics viewers have problems visually merging these clearly separated paths.
As a conclusion:
  • This issue needs to be fixed by MathWorks
  • The internal reasons why this happens are not visible to us

  댓글 수: 1

Hi Stefan,
Since you have already prepared this useful script, I'd like to ask, would it be possible to make this script .ps compatible as well? This is especially useful for printing multiple pages into a single file.
Thanks Abbas

로그인 to comment.


Answer by Steve Hansen on 27 Oct 2017

Mathworks proceeded to break their own software three years ago and has done little to respond to the needs of their customers, except for denying the problem and blaming the issue on other people/software.
This issue has been eye opening for me. I used to strongly support Matlab and suggest that everyone use it due to the increased productivity it provided. However, there are very real dangers posed by vendor lock-in, particularly as it applies to science and publishing. Even if it requires more effort, I think open source alternatives are critical for maintaining autonomy.

  댓글 수: 0

로그인 to comment.


Answer by Pavaman
on 11 Oct 2018

Using R2018a, the file sizes are 10 times smaller. However, when converted to pdf, the filesizes are 100 times smaller (comparing to filesizes created in R2016a).

  댓글 수: 0

로그인 to comment.


Answer by Evelina Thunell on 15 Dec 2017
Edited by Evelina Thunell on 15 Dec 2017

I exported a matlab figure with a shaded area made with "fill" from matlab, and kept getting line artifacts on the shaded area for vector formats. Very annoying! epsclean did not solve my problem (the artifacts are less pronounced but still there). Then I found this solution:
https://github.com/dfarrel1/fix_matlab_vector_graphics
I did this in Windows 7 with Adobe Illustrator CC 2018 and Matlab 2017a: Save your figure in matlab as a pdf file. Download the stuff from the link above. Open your pdf file in Illustrator and do File-Scripts-Other scripts: pick the file fixMatlabPDFOutput.jsx that you have downloaded. And voila, your artifact pdf is now overwritten by a nice-looking one (and it's still vectorized).

  댓글 수: 0

로그인 to comment.


Answer by Preetish Kakkar on 7 Apr 2018
Edited by Preetish Kakkar on 7 Apr 2018

I think this shall be working (for e.g. contourf(peaks(100));saveas(gcf,'figure.eps','epsc') ) starting from 17b. The example I gave shall not produce white line.

  댓글 수: 3

You're saying these painters rendering issues are fixed?
Yes, I won't say every painter issue is fixed but we have made considerable progress on not producing white line in some cases such as contourf example I gave above. I would recommend trying latest matlab release and report any issues you find. We are diligently working on improving the quality and we expect more fixes to come in upcoming releases.
For the sake of clarity... it's the issue is about "producing" gaps, not white lines.

로그인 to comment.


Answer by Gerrit Ecke on 19 May 2019

First of all: incredible, Mathworks. You are really trying to sell this as a feature/improvement over the old renderer? If there are oblique borders you render tons of triangles. I am really annoyed, this thing has made my plots ugly for some time now and I have spent ages to fix this thing manually in some cases.
with 2017b the post-processing script doesn't work any more. I found a solution that works for me when I display stuff with contourf. Inkscape (after taking ages to load the 3.5MB svg file MATLAB generates) has the option to select everything of the same color. Hit F2 to enter "edit paths by nodes" mode, select one of the many triangles, right click on it and navigate to "Select Same" --> "Fill Color". The myriads of triangles should be selected now. In the menu bar select "Path" --> "Union". After all paths of the same color are joined you can try "Path" --> "Simplify", for me this usually also works and reduces the number of nodes to a decent number.
Only flaw so far is that sometimes there are additional objects that will also be selected with this method and have to be attended to manually.
Mathworks, please implement a postprocessing in this line for svg export (not based on color I mean of course)!
Cheers.

  댓글 수: 5

표시 이전 댓글 수: 2
This comment was flagged by Helen Barron
@Gerrit , use painters renderer to save your figure in vector format e.g
print(gcf,'-depsc','-painters','sine_test.eps')
saveas does not save vector format by deafult.
That gap issue is indeed fixed for 19a. At least for the contourf patches.
The vector format of pcolor gives nice rasterized result. Well done! Even the colorbars appear without a gap (they seems to be rasterized aswell)!
Simple curvy lines using plot function seem to be also unified.
Hopefully contour lines are next in task list so it would be possible to plot nice coastlines in geosciences. Possible workaround is to create contour lines with contourc function and plot the contour matrix using plot function.
As dedicated Inkscape user I'm also looking forward for a decent .svg output of Matlab artwork.
Edit: svg output seems to be implemented - nice and clean. print(gcf,'-dsvg','test.svg')
@llja, can you give me an example of what you are referring for contour lines, what issues are you facing with contour lines? Please give an example of contour I can try it with.
Dear all,
apologies for my bad tamper in my original e-mail. I know how it is with these things. However, I feel that this particular issue should have high priority, given the price of the product.
Same experience like Ilja: I have also once re-rendered heat plots generically as pixel graphics and combined it with custom vector graphic outline on top. I think it was a Robinson projection. This would be an adequate general solution in my opinion, however, my code was not general enough, I am afraid.
I do not have the opportunity to try the latest Matlab release, unfortunately. I am not sure whether I understand Ilja right that the problems in contourf are already fixed. If not, I think my solution is very easy and quick to implement. I guess the individually colored panels, i.e. the surfaces between contour lines, have separate representations internally. The "union" opreation here would be sth. like the hull of all nodes of this object.

로그인 to comment.



Translated by