Экспорт графика с полными данными или сохранение в виде сценария

Я использую python с matplotlib для создания графиков из данных, и я хотел бы сохранить эти графики в файле pdf (но я мог бы использовать и более конкретный формат). Я использую в основном эту инструкцию:

plt.plot(data)
figname = ''.join([filename, '_', label, '.pdf'])
plt.savefig(figname)

Но что это делает, так это создает изображение графика с увеличением, в котором он отображается; Я хотел бы создать копию, которая показывает все точки (> 10000), которые я рисую, чтобы я мог масштабировать до любого уровня. Каков правильный способ сделать это?

РЕДАКТИРОВАТЬ: существует ли формат (например, «.fig» для Matlab), который напрямую вызывает средство просмотра Matplotlib с данными, которые я сохранил? Может быть, можно создать скрипт .py, который сохраняет точки и который я могу вызвать, чтобы быстро повторно отобразить их? Я думаю, что это то, что делает файл .fig Matlab.

Это деталь графика, экспортированного в формате pdf

И это то, что я хотел бы получить, по-прежнему имея возможность видеть весь сюжет, то есть больше


person clabacchio    schedule 04.01.2012    source источник
comment
я использовал этот метод, потому что метка обычно представляет собой список строк, в зависимости от того, сколько кривых я рисую на одном графике.   -  person clabacchio    schedule 04.01.2012


Ответы (2)


Я не знаю ни одного собственного формата файла Matplotlib, который включает ваши данные; на самом деле, я не уверен, что у объектов Matploblib даже определена функция записи.

Вместо этого для имитации концепции Matlab .fig я сохраняю обработанные данные (в виде пустого массива или маринованного) и запускаю отдельный скрипт .py для воссоздания графиков Matplotlib.

Итак по шагам:

  1. Обработайте свои данные и сделайте несколько красивых графиков, пока не будете полностью довольны
  2. Сохраните/соберите обработанные данные как можно ближе к командам графика (вы даже можете сохранить данные, поступающие в гистограмму, если создание гистограммы занимает много времени)
  3. Напишите новый сценарий, в котором вы импортируете данные и копируете/вставляете команды построения графиков из исходного сценария.

Это немного неуклюже, но это работает. Если вы действительно хотите, вы можете встроить маринованные данные в виде строки в свой сценарий построения графика (Встроить данные pickle (или произвольные) в скрипт Python). Это дает вам преимущество работы с одним скриптом Python, содержащим как данные, так и код построения.

Редактировать

Вы можете проверить наличие сохраненного файла обработанных данных и пропустить этапы обработки, если этот файл существует. Так:

if not processed_data.file exists:
   my_data = process_raw_data()
else:
   my_data = read_data_from_file(processed_data.file)

plot(my_data)

Таким образом, у вас может быть один сценарий как для создания графика в первую очередь, так и для повторного построения графика с использованием предварительно обработанных данных.

Возможно, вы захотите добавить аргумент времени выполнения для принудительной повторной обработки данных на случай, если вы что-то измените в сценарии обработки и не хотите вручную удалять обработанный файл данных.

person Daan    schedule 05.01.2012
comment
И (извините, но я все еще новичок в python), могу ли я создать скрипт python из другого таким образом, чтобы я мог назвать его просто двойным щелчком? Потому что мне приходится делать это для многих файлов, а создание каждый раз скрипта потребовало бы слишком много времени. - person clabacchio; 05.01.2012
comment
Может быть, есть функция, которая хранит переменную (список) в файле и одну для ее восстановления, сохраняя ту же структуру? Я знаю, как это сделать с файлом .csv, но нет более простого способа? - person clabacchio; 05.01.2012
comment
Ну, есть концепция "рассола", или, если у вас есть массивы numpy, вы можете использовать numpy.save. Точно так же вы можете сохранять и загружать переменные Matlab. Не уверен, что вы имеете в виду под «Потому что я должен сделать это для многих файлов»; это один и тот же скрипт для разных входных данных, или у вас есть сотни разных скриптов, создающих разные фигуры без общих элементов? - person Daan; 05.01.2012
comment
Да, я думаю, что последнее: у меня много наборов данных, и мне нужно создать из них несколько графиков, поэтому, если есть способ динамического создания этих сценариев, было бы здорово. - person clabacchio; 05.01.2012
comment
Используйте один скрипт и проверьте наличие обработанных данных (см. редактирование выше) - person Daan; 05.01.2012

Используйте plt.xlim и plt.ylim для установки домена и диапазона. Установите figsize, чтобы косвенно контролировать разрешение конечного изображения в пикселях. (figsize задает размер фигуры в дюймах; значение по умолчанию — 100 точек на дюйм.) Вы также можете управлять dpi в вызове plt.savefig.

С figsize = (10, 10) и dpi = 100 изображение будет иметь разрешение 1000x1000.


Например,

import matplotlib.pyplot as plt
import numpy as np

x, y = np.random.random((2,10000))
plt.plot(x, y, ',')
figname = '/tmp/test.pdf'
xmin, xmax = 0, 1
ymin, ymax = 0, 1
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.savefig(figname)

Ваша программа просмотра PDF должна иметь возможность масштабировать любую область, чтобы можно было различить отдельные точки.

person unutbu    schedule 04.01.2012
comment
спасибо, что рассказали мне о xlim и ylim, я тоже искал это :), но мне нужна возможность сохранить график с разрешением, которое позволяет мне видеть отдельные точки. С этой реализацией у меня есть только форма сюжета, но реальное разрешение сюжета теряется. - person clabacchio; 04.01.2012
comment
Вы можете управлять разрешением, устанавливая параметры figsize и/или dpi. Я отредактировал свой ответ, чтобы показать, что я имею в виду. - person unutbu; 04.01.2012
comment
я думаю, что это не имеет значения, потому что я рисую в векторном формате (pdf); то, что я хотел бы, это сохранить точки, а не голое изображение - person clabacchio; 04.01.2012