збереження зображень у python дуже високої якості


109

Як можна зберегти сюжети пітона на дуже високій якості?

Тобто, коли я продовжую збільшувати масштаб об’єкта, збереженого у файлі pdf, не виникає розмиття?

Крім того, який найкращий режим для його збереження?

png, eps? Або якийсь інший? Я не можу зробити це, pdfбо є приховане число, яке трапляється, що псується з Latexmkкомпіляцією.

Відповіді:


153

Якщо ви використовуєте matplotlibта намагаєтеся отримати хороші цифри в документі з латексу, збережіть як eps. Зокрема, спробуйте щось подібне після запуску команд для побудови зображення:

plt.savefig('destination_path.eps', format='eps')

Я виявив, що файли eps найкраще працюють, а dpiпараметр - це те, що дійсно робить їх добре виглядати в документі.

ОНОВЛЕННЯ:

Щоб вказати орієнтацію фігури перед збереженням, просто викличте наступне перед plt.savefigвикликом, але після створення сюжету (якщо припустити, що ви побудували графіку за допомогою осей з назвою ax):

ax.view_init(elev=elevation_angle, azim=azimuthal_angle)

Де elevation_angleє число (у градусах), що вказує полярний кут (вниз від вертикальної осі z) і azimuthal_angleвказує азимутальний кут (навколо осі z).

Я вважаю, що найпростіше визначити ці значення, спочатку побудувавши зображення, а потім повернувши його і спостерігаючи, як поточні значення кутів з’являються у нижній частині вікна трохи нижче фактичної ділянки. Майте на увазі, що позиції x, y, z з'являються за замовчуванням, але замінюються двома кутами, коли ви починаєте клацати + перетягувати + обертати зображення.


@ spencerlon2 Що робити, якщо я хочу змінити орієнтацію фігури перед збереженням?
dustin

13
Навіщо нам потрібен параметр DPI? Чи не векторний формат eps?
mkvoya

1
Добре - DPI не потрібен для таких форматів, як svg, pdf, eps
spencerlyon2

Ви можете опустити, format='eps'якщо хочете. У цьому випадку формат виводиться з імені файлу.
timgeb

72

Просто для додання моїх результатів, також використовуючи matplotlib.

.eps зробив увесь мій текст жирним і видалив прозорість. .svg подарував мені фотографії з високою роздільною здатністю, які насправді були схожі на мій графік.

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
# Do the plot code
fig.savefig('myimage.svg', format='svg', dpi=1200)

Я використовував 1200 точок на дюйм, оскільки для багатьох наукових журналів потрібні зображення в 1200/600/300 dpi, залежно від зображення. Перетворити на потрібний dpi та формат у форматі GiMP або Inkscape.

EDIT: Очевидно, що dpi не має значення, оскільки .svg є векторною графікою і має "нескінченну роздільну здатність".


2
DPI має велике значення, коли ми використовуємо imshow(..)десь на фігурі. Ці растрові карти зменшуються, коли вони вбудовуються у SVG. З DPI за замовчуванням результати навіть гірші, ніж ми бачимо на екрані, безумовно, непридатні для публікацій.
Євгеній Сергєєв

Я також дуже рекомендую Scour ( github.com/scour-project/scour ) для зменшення розміру файлу вашого svg. У найбільш агресивних налаштуваннях я можу зменшити розмір свого файлу до 50% від початкового - до 5%, якщо я використовую стислий формат .svgz.
grofte

8

Гаразд, я вважав, що відповідь spencerlyon2 працює, однак у випадку, якщо хтось не знайде себе, не знаючи, що робити з цим рядком, я повинен був зробити це таким чином:

beingsaved = plt.figure()

# some scatters
plt.scatter(X_1_x, X_1_y)
plt.scatter(X_2_x, X_2_y)

beingsaved.savefig('destination_path.eps', format='eps', dpi=1000)

6

Якщо ви працюєте з сюжетами для новонароджених , замість matplotlib, ви можете зберегти .png зображення таким чином:

Припустимо, у вас є matrixоб’єкт (або панди, або нуме), і ви хочете взяти теплову карту:

import seaborn as sb

image = sb.heatmap(matrix)   # this gets you the heatmap
image.figure.savefig("C:/Your/Path/ ... /your_image.png")   # this saves it

Цей код сумісний з останньою версією новонародженого. Інші коди навколо stackoverflow працювали лише для попередніх версій.

Ще один спосіб, який мені подобається, це такий. Я встановлюю розмір наступного зображення таким чином:

plt.subplots(figsize=(15,15))

А потім пізніше я конспектую висновок у консолі, з якого я можу скопіювати та вставити його куди хочу. (Оскільки у новонародженого побудований поверх матплотлібу, проблем не буде.)


5

Ви можете зберегти фігуру, яка становить 1920x1080 (або 1080p), використовуючи:

fig = plt.figure(figsize=(19.20,10.80))

Ви також можете піти набагато вище або нижче. Вищезазначені рішення добре працюють для друку, але в ці дні ви хочете, щоб створене зображення перейшло у формат PNG / JPG або з'явилося у широкоформатному форматі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.