Mam figurę z dość delikatnymi rysami, które są wrażliwe na szerokość linii. Chcę zapisać tę liczbę jako plik PDF, który można łatwo wydrukować (tj. Bez skalowania po stronie odbiorcy, wystarczy polecenie + P i przejść). Niestety, kiedy ustawiam figsize = (8.5,11) w celu poprawnego rozmiaru pliku PDF do wydruku, matplotlib wybiera bardzo grubą domyślną szerokość linii i rozmiar tekstu, który zepsuje wykres (legenda jest zbyt duża, a linie na wykresie słupkowym zakładka). Jeśli ustawię figsize = (17,22) otrzymam bardzo funkcjonalną domyślną szerokość linii i textize po skalowaniu pliku PDF do 50% w celu drukowania. Właśnie tego używałem, ale to rozwiązanie stało się niemożliwe z powodu polityki i naprawdę nie chcę skalować pliku PDF w programie Illustrator za każdym razem, gdy wprowadzam zmiany.W przypadku matoffotlib przy zapisywaniu pliku PDF
Gdybym mógł pracować z bitmapami, mógłbym osiągnąć pożądany rezultat, ustawiając figsize = (17,22) i ustawiając dpi na połowę docelowej dpi, ale to nie działa dla plików PDF, ponieważ parametr dpi wydaje się być zignorowany . Chciałbym PDF że
- wygląda boxes_good.png (rozmiar-oszukany bitmapy z cienkich linii, mały tekst)
- ma wymiary 8.5x11in (lub wydruki jak to robi)
- można edytować w programie Illustrator (nie jest bitmapą zawiniętą w pdf)
Nie mogę pomóc, ale podejrzewam, że istnieje łatwy sposób na pobranie "podwójnego rozmiaru, półdpiowej" sztuczki podczas zapisywania jako PDF, ale ja zrezygnowali z tego, aby to zadziałało i zaczęli próbować bezpośrednio manipulować linewidthami i tekstami. Udało mi się zmodyfikować tekst w tekstach, ale nie w całej linii. Oto zapis z rzeczy, ja próbowałem:
# Tried:
# fig.set_size_inches(17,22)
# fig.savefig('boxes.pdf', dpi=100,150,300)
# dpi parameter has no effect on linewidth, text size, or the PDF's dimensions
# 'markerscale=.5' on plt.legend and pax.legend
# no effect
# mp.rcParams['font.size']=8
# worked! made text smaller, now for linewidth...
# mp.rcParams['lines.linewidth']=5
# no effect
# fig.set_linewidth(5)
# no effect
# pax.axhline(linewidth=5)
# only changes x axis not box surrounding subplot
# fig.set_size_inches(8.5,11) immediately before plt.savefig('boxes.pdf')
# identical results to calling plt.figure(figsize=(8.5,11)) in the first place
# I tried passing plt.figure(figsize=(17,22)) and swapping it to 8.5x11 using
# fig.set_size_inches right before saving, but the lines were thick and the text
# was large in the PDF, exactly as if I had set figsize=(8.5,11) to begin with
Oto SourceFile (I zmniejszyły działkę do zasadniczych, więc oczywiste obejścia stylizacji prawdopodobnie nie są wykonalne rozwiązania)
import numpy as np
import matplotlib as mp
import matplotlib.pyplot as plt
x = np.arange(200)
bottom_red_bar = -np.random.random(200)
bottom_black_bar = np.random.random(200) * bottom_red_bar
fig = plt.figure()
for subplotnum in [1,2,3]:
pax = plt.subplot(310+subplotnum)
pax.set_ylim([-1,1])
bot_rb = pax.bar(x, bottom_red_bar,1,color='r')
bot_bb = pax.bar(x+(1-.3)/2,bottom_black_bar,.3,color='k')
pax.legend([bot_rb,bot_bb],['Filler Text 1','Filler Text 2'],loc=4)
fig.set_size_inches(8.5,11)
fig.savefig('boxes_bad.png',dpi=300) # Lines are too thick
fig.set_size_inches(17,22)
fig.savefig('boxes_good.png',dpi=150) # Lines are just right
fig.set_size_inches(8.5,11)
plt.savefig('boxes.pdf') # Lines are too thick
fig.set_size_inches(17,22) # Lines are just right
plt.savefig('boxes.pdf') # but the PDF needs scaling before printing
Więc m po sposobie, by dostosować szerokość linii całej figury lub sposób na matplotlib zapisać pdf z metadanymi wymiaru innymi niż figsize. Jakieś sugestie?