2015-06-16 12 views
6

MATLABs nowym silniku graficznym, HG2, nie drukować prawidłowo łat za pomocą renderujący artystów:trójkątne płaty split z malarzy renderujący w Matlab 2014b i powyżej

hist(randn(1,1000)); 
colorbar('Location','SouthOutside'); 
print('test.pdf','-dpdf'); 

Powstały łatek, czy wygenerowany przez hist lub colorbar mają trójkątne podziały:

Triangular splits in patches

problem został omówiony na MATLAB Central here i here, gdzie sugerowano wyłączenie opcji "płynnego rysowania linii" w przeglądarce pdf powinno rozwiązać problem. To ukrywa problem w niektórych czytnikach (np. W Adobe Reader, ale nie w Apple Preview), ale trudno jest poprosić współpracowników i czytelników o skorzystanie z określonej przeglądarki plików PDF z domyślnymi ustawieniami graficznymi. Patrząc na wynikowy plik w Inkscape, jasne jest, że podział jest obecny w wektorowej grafice wyjściowej. Tutaj przeniosłem połowę colorbar, udowadniając, że jest w rzeczywistości rozstali się w połowie, a nie tylko błędnie interpretowane przez pdf widza:

enter image description here

Problem nie występuje przy użyciu renderer OpenGL (print('test.pdf','-opengl') , ale wtedy dane wyjściowe nie są wektoryzowane). Problem nadal występuje w MATLAB 2015a.

Czy istnieje sposób na eksport grafiki wektorowej bez artefaktów w programie MATLAB 2014b lub nowszym?

+0

Jedyne rozwiązanie, które do tej pory znalazłem, to przetwarzanie końcowe, np. w programie Adobe Illustrator. Dla paska kolorów pomaga po prostu usunąć maskę przycinającą. Dla histogramu musisz wybrać wszystkie trójkąty (poprzez wybór tego samego wyglądu) i dodać cienki obrys konturu. Nie pomaga to, że MATLAB nie eksportuje trójkątów jako zamkniętych ścieżek, więc potencjalnie trzeba ręcznie zamknąć każdą ścieżkę, aby to działało. Jest to oczywiście możliwe tylko dla niezbyt skomplikowanych danych końcowych ... – zeeMonkeez

Odpowiedz

1

Oto wątpliwe obejście aż rzeczywisty problem jest rozwiązany:

Te ukośne linie są po prostu pusta przestrzeń między trójkątów, więc to, co widzimy jest biała przestrzeń za plastry zajrzeć przez. Głupi pomysł: Wypełnijmy tę przestrzeń pasującymi kolorami zamiast białymi.

W tym celu skopiujemy wszystkie obiekty i zrównujemy nowe za pomocą zaledwie tiiiiny.

Kod:

hist(randn(1,1000)); 
colorbar('Location','SouthOutside'); 
print('test.pdf','-dpdf');    %// print original for comparison 

f1 = gcf; 
g = get(f1,'children'); 
n = length(g); 
copyobj(g,f1);       %// copy all figure children 

Skopiowane obiekty są teraz pierwsi n elementy w tablicy 2*nf1.Children. Są one dokładnie na górze starych obiektów.

g=get(f1,'children'); 
for i=1:n; 
    if strcmpi(g(i).Type,'axes'); 
     set(g(i),'color','none','position',g(i).Position+[0.0001 0 0 0]); 
     set(g(i+n),'position',g(i+n).Position);       %// important! 
    end; 
end; 
print('test2.pdf','-dpdf'); 

Objaśnienie:

g = get(f1,'children'); pobiera wszystkie osie, colorbars itd obrębie bieżącego rysunku.

colorbar obiekty są połączone z osiami, dlatego będziemy musieli przenosić tylko dzieci typu axes.

Ustawienie color na none powoduje, że tło nowych osi jest przezroczyste (ponieważ znajdują się one na wierzchu starych).

g(i).Position+[0.0001 0 0 0] przesuwa nowe osie o 0.0001 znormalizowane jednostki w prawo.

set(g(i+n),'position',g(i+n).Position); Ta linia wydaje się niepotrzebna, ale ostatni obraz poniżej pokazuje, co dzieje się podczas drukowania, jeśli go nie dodasz.

W zależności od rodzaju wykreślanych obiektów graficznych, może być konieczne dostosowanie ich do własnych potrzeb, ale kod ten powinien działać, jeśli masz tylko obiekty barw i osi.

oryginalny:

original

Z Hack:

enter image description here

Bez %// important! line:

enter image description here

0

W R2015b, histogram wydawało się nie pokazać białe linie, ale fill zrobił.

przypadku prostych działek prostu wkleić dane ponownie:

x = 0:pi/100:pi; 
y = sin(x); 
f = fill(x,y,'r'); 
hold on; 
f2 = fill(x,y,'r'); %// Worked like magic 

Jeśli magia nie spróbować podobny do Geoffa odpowiedź: f2 = fill(x+0.0001,y,'r');

0

zależności od wersji Matlab używasz, możesz spróbować użyć epsclean. Wygląda na to, że nie działa z najnowszymi wersjami Matlaba, takimi jak 2017a.

W przeciwnym razie program epsclean można uruchomić na istniejącym pliku eps (nie w formacie PDF) wyeksportowanym za pomocą opcji -painters w celu wygenerowania postaci wektoryzowanej i zostanie ona przepisana (lub utworzony inny plik) z usuniętymi białymi liniami.