2013-04-16 8 views
12

Produkuję jakościową publikację do osadzenia w lateksie i chciałbym być bardzo dokładny pod względem rozmiarów i czcionek (aby czcionki są tego samego rozmiaru w artykule, co w działce). Aby zapobiec skalowaniu lateksu, chciałbym mieć dokładny rozmiar, ale nie mogę. Oto mój kod:pad_inches = 0 i bbox_inches = "tight" powodują, że wykres jest mniejszy niż zadeklarowany figsize

import matplotlib.pyplot as plt 
from matplotlib import rc, rcParams 
from numpy import sin 

rc('text', usetex=True) 
rc('font', family='serif', serif='Computer Modern Roman', size=8) 
rc('legend', fontsize=10) 

width_in = 5 
fig = plt.figure(1, figsize=(width_in, 2)) 
ax = fig.add_subplot(111) 
ax.plot(range(0,100), sin(range(0,100))) 

fig.tight_layout() 
fig.savefig('test.eps', bbox_inches='tight', pad_inches=0) 
plt.close() 

Problem dotyczy bbox_inches = "tight" i pad_inches = 0. Dodanie tych opcji powoduje, że mój wykres ma szerokość 4,76 cali zamiast zadeklarowanych 5 cali. Ale chcę, żeby oszczędzali miejsce. Jak go rozwiązać?

Edytuj: Cóż, odpowiedzi sugerują usunięcie bbox_inches='tight' i pad_inches=0 i użycie tylko tight_layout(). Obrazy mają odpowiednią wielkość, ale wciąż mają trochę białego obicia. Mogę go usunąć za pomocą fig.tight_layout(pad=0), ale wtedy tytuł figurki został przeniesiony do pudełka, które wygląda brzydko. Z drugiej strony mogę użyć tight_layout(rect=[...]) i uzyskać pożądany wynik, ale jest to praca ręczna, aby uzyskać prawidłowe liczby - nie podoba mi się to. Dlatego obecnie nie widzę łatwego i ogólnego rozwiązania mojego problemu.

Odpowiedz

13

Problem polega na tym, że bbox_inches='tight' po prostu usuwa całą dodatkową białą przestrzeń wokół twojej figury, tak naprawdę nie zmienia położenia niczego na twojej figurze, po jej wyrenderowaniu.

Może być konieczne dostosowanie parametrów przekazywanych do tight_layout (tutorial), aby uzyskać pożądany efekt.

Mam nadzieję, że to pozwoli ci wskazać właściwy kierunek.

+0

Mam następujące pytanie: Mam tekst powyżej domyślnego bboxa, więc jeśli zapiszę go bezpośrednio, tekst zostanie przycięty. Jeśli użyję opcji bbox_inches = 'tight', marginesy na rysunku zostaną obcięte. Czy istnieje sposób na wykonanie tylko bbox_inches = "tight" w kierunku pionowym? –

+0

Następnie zadaj nowe pytanie – tacaswell

+0

Dzięki! Zrobiłem i to jest tutaj: http://stackoverflow.com/questions/23532036/showing-text-outside-the-figure-limits –

0

Twój pierwotny spisek musi zawierać spacje, inaczej bbox_inches = tight nie usunie żadnego z obszarów. Istnieją dwa rozwiązania tego, które znam:

  1. Prosta metoda jest użycie tight_layout jak wspomniano przez tcaswell.

  2. Im bardziej skomplikowane, ale bardziej kontrolowany sposób jest unikać fig.add_subplot(111) i zamiast używać fig.add_axes() który pozwala na znacznie bardziej rygorystyczne pod względem jak duży osie są podczas definiowania instancji osi. Następnie możesz dostosować rozmiar swoich osi, aby uzyskać tyle powierzchni, ile jest wymagane do utrzymania obszaru rysunku o wielkości 5 cali. Gdy to zrobisz, poleciłbym po prostu nie używać bbox_inches lub ustawić go na Brak (ustawienie domyślne) aby uniknąć unnessicary przycinanie fig.add_axes() wymaga parametru rect jako pierwszy argument, który składa się z [left_position, bottom_position, width, height] z których każdy w przedziale od 0 do 1.

Edit. Po przejściu samouczka tight_layout ponownie, zdałem sobie sprawę, że obejmuje Niemalże nie zdawałem sobie sprawy, że udało mi się z łatwością utrzymać proporcje osi, nawet jeśli proporcje figur są inne niż w przypadku osi, staram się być bardzo wyraźna, gdy Definiuję obszary moich osi, ponieważ mam do czynienia z obrazami satelitarnymi i staram się zachować je jako natywną rozdzielczość czujnika lub jakiś czynnik tej rozdzielczości czujnika, który wymaga nieco większej kontroli.

0

Mam ten sam problem z tworzeniem wykresów matplotlib dla LaTeXa. Ponieważ moje działki nie zezwalały na używanie tight_layout, dając ostrzeżenie this, skończyło się na użyciu fig.subplots_adjust(bottom=bottom_pos, top=top_pos, left=left_pos, right=right_pos). Zobacz to tutorial. Wymaga ręcznego znalezienia najlepszych wartości dla bottom_pos itp., Ale w moim przypadku wydaje się, że jest to jedyna możliwość uzyskania obrazów bez dużej ilości spacji, nie zmieniając wielkości rysunku na wyjściu.

Powiązane problemy