Я пишу быстрый и грязный сценарий для создания графиков на лету. В качестве отправной точки я использую приведенный ниже код (из документации Matplotlib):
from pylab import figure, axes, pie, title, show
# Make a square figure and axes
figure(1, figsize=(6, 6))
ax = axes([0.1, 0.1, 0.8, 0.8])
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [15, 30, 45, 10]
explode = (0, 0.05, 0, 0)
pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True)
title('Raining Hogs and Dogs', bbox={'facecolor': '0.8', 'pad': 5})
show() # Actually, don't show, just save to foo.png
Я не хочу отображать график в графическом интерфейсе, вместо этого я хочу сохранить график в файл (скажем, foo.png), чтобы, например, его можно было использовать в пакетных скриптах. Как мне это сделать?
Хотя на вопрос уже был дан ответ, я'хотел бы добавить несколько полезных советов при использовании matplotlib.pyplot.savefig. Формат файла может быть указан расширением:
from matplotlib import pyplot as plt
plt.savefig('foo.png')
plt.savefig('foo.pdf')
Будет выдан растеризованный или векторизованный вывод соответственно, оба варианта могут быть полезны. Кроме того, вы обнаружите, что pylab
оставляет щедрое, часто нежелательное, пробельное пространство вокруг изображения. Удалите его с помощью:
savefig('foo.png', bbox_inches='tight')
Как другие сказали, ПЛТ.savefig()
или `рис. 1.savefig () - это действительно путь для сохранения изображения.
Однако я'ве обнаружили, что в определенных случаях эта цифра всегда показано. (например. с Спайдер у ПЛТ.Иона(): интерактивный режим = Вкл.) Я обойти это, заставив закрытия окна фигура в моей гигантской петли с ПЛТ.рядом(figure_object)
(см. документации), так что я Дон'т иметь миллион открытого фигуры во время цикла:
import matplotlib.pyplot as plt
fig, ax = plt.subplots( nrows=1, ncols=1 ) # create figure & 1 axis
ax.plot([0,1,2], [10,20,3])
fig.savefig('path/to/save/image/to.png') # save the figure to file
plt.close(fig) # close the figure window
Вы должны быть в состоянии вновь открыть рисунок позже, если необходимо, чтобы рис.показать()` (разве'т тест сам).
Решение следующее:
pylab.savefig('foo.png')
Просто нашел эту ссылку на библиотек matplotlib документация, касающаяся именно этого вопроса: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear
Говорят, что самый простой способ, чтобы предотвратить рис от всплывающих является использование неинтерактивных данных (например. Агг), через matplotib.использовать(<серверной>)`, например:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')
Я еще лично предпочитаю использовать `ПЛТ.закрыть( рис.), поскольку тогда у вас есть возможность скрывать определенные цифры (в цикле), но по-прежнему отображаться цифры после цикла обработки данных. Это, вероятно, медленнее, чем выбирая неинтерактивном бэкэнд хотя - бы интересно, если бы кто-то испытал это.
Обновление: для Спайдера, как правило, вы можете'т установить серверную часть таким образом (потому что Спайдер обычно загружает библиотек matplotlib рано, предотвращая вас от использования библиотек matplotlib.использовать()`).
Вместо этого, используйте ПЛТ.switch_backend('агг'), или выключить и"*включить поддержку*" в Спайдере префов и запустить
библиотек matplotlib.использовать('агг') команда` себя.
Если вам не нравится концепция "текущей" фигуры, сделайте:
import matplotlib.image as mpimg
img = mpimg.imread("src.png")
mpimg.imsave("out.png", img)
Другие ответы являются правильными. Тем не менее, я иногда нахожу, что я хочу открыть рисунок объект позже. Например, мне может потребоваться изменение размеров метки, добавить сетку, или сделать другую обработку. В идеальном мире, я бы просто еще раз выполнить код генерации сюжета, и скорректировать параметры. Увы, мир не совершенен. Поэтому, помимо сохранения в формате PDF или PNG, я добавляю:
with open('some_file.pkl', "wb") as fp:
pickle.dump(fig, fp, protocol=4)
Такой, я позже могу загрузить объект рисунок и управлять настройками, как я, пожалуйста.
Я тоже пишу на стек с исходным кодом и местные жители()` словаря для каждой функции/метода в стек, так что я позже могу точно сказать, что созданный рисунок.
Примечание: будьте осторожны, так как иногда этот метод создает огромные файлы.
После использования участка() и другие функции, чтобы создать контент, который вы хотите, вы могли бы использовать статью, как это выбирать между заговоры на экран или в файл:
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(4, 5)) # size in inches
# use plot(), etc. to create your plot.
# Pick one of the following lines to uncomment
# save_file = None
# save_file = os.path.join(your_directory, your_file_name)
if save_file:
plt.savefig(save_file)
plt.close(fig)
else:
plt.show()
import datetime
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
# Create the PdfPages object to which we will save the pages:
# The with statement makes sure that the PdfPages object is closed properly at
# the end of the block, even if an Exception occurs.
with PdfPages('multipage_pdf.pdf') as pdf:
plt.figure(figsize=(3, 3))
plt.plot(range(7), [3, 1, 4, 1, 5, 9, 2], 'r-o')
plt.title('Page One')
pdf.savefig() # saves the current figure into a pdf page
plt.close()
plt.rc('text', usetex=True)
plt.figure(figsize=(8, 6))
x = np.arange(0, 5, 0.1)
plt.plot(x, np.sin(x), 'b-')
plt.title('Page Two')
pdf.savefig()
plt.close()
plt.rc('text', usetex=False)
fig = plt.figure(figsize=(4, 5))
plt.plot(x, x*x, 'ko')
plt.title('Page Three')
pdf.savefig(fig) # or you can pass a Figure object to pdf.savefig
plt.close()
# We can also set the file's metadata via the PdfPages object:
d = pdf.infodict()
d['Title'] = 'Multipage PDF Example'
d['Author'] = u'Jouni K. Sepp\xe4nen'
d['Subject'] = 'How to create a multipage pdf file and set its metadata'
d['Keywords'] = 'PdfPages multipage keywords author title subject'
d['CreationDate'] = datetime.datetime(2009, 11, 13)
d['ModDate'] = datetime.datetime.today()
Я использовал следующие:
import matplotlib.pyplot as plt
p1 = plt.plot(dates, temp, 'r-', label="Temperature (celsius)")
p2 = plt.plot(dates, psal, 'b-', label="Salinity (psu)")
plt.legend(loc='upper center', numpoints=1, bbox_to_anchor=(0.5, -0.05), ncol=2, fancybox=True, shadow=True)
plt.savefig('data.png')
plt.show()
f.close()
plt.close()
Я нашел очень важно использовать ПЛТ.шоу после сохранения рисунка, в противном случае он выиграл'т работу.рисунок экспортировать в PNG
Вы можете сделать:
plt.show(hold=False)
plt.savefig('name.pdf')
и помните, чтобы savefig закончить до закрытия графического сюжета. Таким образом, вы можете заранее видеть изображения.
Кроме того, вы можете посмотреть его с ПЛТ.показать()
Затем закрыть GUI и запустить скрипт еще раз, но на этот раз заменить ПЛТ.показать()с
ПЛТ.savefig()`.
Кроме того, вы можете использовать
fig, ax = plt.figure(nrows=1, ncols=1)
plt.plot(...)
plt.show()
fig.savefig('out.pdf')
Решение :
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.style.use('ggplot')
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
plt.figure()
ts.plot()
plt.savefig("foo.png", bbox_inches='tight')
Если вы хотите, чтобы отобразить изображение, а также экономии использования изображения:
%matplotlib inline
после
импорт библиотек matplotlib
По данным вопрос https://stackoverflow.com/q/9012487/6329006.
Одно примечание: если вы используете ПЛТ.шоу
и после `ПЛТ.savefig, или вы дадите пустое изображение.
Подробный пример:
import numpy as np
import matplotlib.pyplot as plt
def draw_result(lst_iter, lst_loss, lst_acc, title):
plt.plot(lst_iter, lst_loss, '-b', label='loss')
plt.plot(lst_iter, lst_acc, '-r', label='accuracy')
plt.xlabel("n iteration")
plt.legend(loc='upper left')
plt.title(title)
plt.savefig(title+".png") # should before plt.show method
plt.show()
def test_draw():
lst_iter = range(100)
lst_loss = [0.01 * i + 0.01 * i ** 2 for i in xrange(100)]
# lst_loss = np.random.randn(1, 100).reshape((100, ))
lst_acc = [0.01 * i - 0.01 * i ** 2 for i in xrange(100)]
# lst_acc = np.random.randn(1, 100).reshape((100, ))
draw_result(lst_iter, lst_loss, lst_acc, "sgd_method")
if __name__ == '__main__':
test_draw()
#write the code for the plot
plt.savefig("filename.png")
Файл будет сохранен в том же каталоге, как файл python/Jupyter работает
import matplotlib.pyplot as plt
plt.savefig("image.png")
В тетради Jupyter вы должны удалить ПЛТ.показать()
и добавить ПЛТ.savefig()
, вместе с остальными ПЛТ-код в одну ячейку.
Изображение по-прежнему будет отображаться в вашем ноутбуке.
Учитывая, что сегодня (не было в наличии, когда этот вопрос) много людей используют Jupyter Notebook в консоли Python, существует очень простой способ для сохранения участков .формат PNG
, просто позвоните по библиотек matplotlib
'класса S pylab от ноутбука Jupyter, наносим рисунок 'встроенный' jupyter клетки, а затем перетащить фигуру/образ в локальный каталог. Дон'т забыть
%библиотек matplotlib инлайн` в первой строке!
Кроме того, указанным выше, я добавил `file, что за имя, картинку и файл python получить те же самые имена. Я также добавил несколько аргументов, чтобы заставить его выглядеть лучше: ``
ДПП.savefig(файл+" и.ПНГ" у,Т / Д=(250), bbox_inches='туго')
`` Последний совет найти ЗДЕСЬ.
Вы можете сохранить ваши изображения с любым расширением(PNG или JPG,и т. д.) и с этой резолюцией, которую вы хотите. Здесь's в функцию, чтобы сохранить свою фигуру.
import os
def save_fig(fig_id, tight_layout=True, fig_extension="png", resolution=300):
path = os.path.join(IMAGES_PATH, fig_id + "." + fig_extension)
print("Saving figure", fig_id)
if tight_layout:
plt.tight_layout()
plt.savefig(path, format=fig_extension, dpi=resolution)
'fig_id' - это имя, под которым вы хотите сохранить свою фигуру. Надеюсь, что это помогает:)