сохранение изображений в Python в очень высоком качестве

110

Как я могу сохранить графики Python в очень высоком качестве?

То есть, когда я продолжаю увеличивать масштаб объекта, сохраненного в файле 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 отображаются по умолчанию, но заменяются двумя углами, когда вы начинаете щелкать + перетаскивать + вращать изображение.

spencerlyon2
источник
@ 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 dpi, потому что во многих научных журналах требуются изображения с разрешением 1200/600/300 dpi в зависимости от того, что это за изображение. Преобразуйте в желаемое dpi и отформатируйте в GiMP или Inkscape.

РЕДАКТИРОВАТЬ: Очевидно, что dpi не имеет значения, поскольку .svg - это векторная графика и имеет «бесконечное разрешение».

Grofte
источник
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)
Джонатан Иван
источник
7

Если вы работаете с морскими графиками , вместо matplotlib вы можете сохранить изображение .png следующим образом:

Предположим, у вас есть matrixобъект (pandas или numpy), и вы хотите получить тепловую карту:

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

Этот код совместим с последней версией seaborn. Другие коды, связанные с stackoverflow, работали только для предыдущих версий.

Мне нравится еще один способ. Я установил размер следующего изображения следующим образом:

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

А позже я рисую вывод в консоли, откуда могу скопировать и вставить его куда захочу. (Поскольку seaborn построен поверх matplotlib, проблем не возникнет.)

Лево
источник
5

Вы можете сохранить изображение с разрешением 1920x1080 (или 1080p), используя:

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

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

Имонн Кенни
источник