Сохранение сюжета в png-файл в Python [дубликат]

Поскольку люди, похоже, обращаются к этому вопросу, когда речь заходит об ошибках компоновщика, я собираюсь добавить это здесь.

Одной из возможных причин ошибок компоновщика с GCC 5.2.0 является то, что новая библиотека libstdc ++ ABI теперь выбран по умолчанию.

Если вы получаете ошибки компоновщика о неопределенных ссылках на символы, которые включают типы в пространстве имен std :: __ cxx11 или теге [abi: cxx11], то это, вероятно, указывает на то, что вы пытаетесь связать файлы объектов, которые были скомпилированы с различными значениями для макроса _GLIBCXX_USE_CXX11_ABI. Это обычно происходит при подключении к сторонней библиотеке, которая была скомпилирована с более старой версией GCC. Если сторонняя библиотека не может быть перестроена с новым ABI, вам нужно будет перекомпилировать свой код со старым ABI.

. Если вы вдруг получите ошибки компоновщика при переключении на GCC после 5.1.0 это было бы замечательно.

32
задан andreasdr 19 February 2014 в 18:24
поделиться

3 ответа

Если вы хотите сохранить фигуру после ее отображения, вам нужно удержать экземпляр фигуры. Причина, по которой plt.savefig не работает после вызова show, заключается в том, что текущий показатель был сброшен.

pyplot отслеживает, какие цифры, оси и т. Д. Являются «текущими» (т.е. имеют пока не отображается с show) за кадром. gcf и gca получают текущие экземпляры фигур и текущих осей соответственно. plt.savefig (и, по существу, любой другой метод pyplot) просто выполняет plt.gcf().savefig(...). Другими словами, получите текущий экземпляр фигуры и вызовите его метод savefig. Аналогично plt.plot в основном выполняет plt.gca().plot(...).

После вызова show список «текущих» фигур и осей пуст.

В общем, вы лучше прямое использование экземпляров фигур и осей для создания / сохранения / показа / etc, вместо использования plt.plot и т. д., чтобы неявно получить текущую цифру / оси и график на ней. Нет ничего плохого в использовании pyplot для всего (особенно в интерактивном режиме), но это облегчает стрельбу в ногу.

Используйте pyplot для plt.show() и для создания фигуры и объекта (ов) осей, но затем используйте методы с цифрами или осями напрямую. (например, ax.plot(x, y) вместо plt.plot(x, y) и т. д.) Основное преимущество этого заключается в том, что оно явное. Вы знаете, на каких объектах вы работаете, и не нужно рассуждать о том, что делает машина состояния pyplot (хотя и не так сложно понять интерфейс состояния и машины).

As пример «рекомендуемого» способа делать что-то вроде:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 100)
y = x**2

fig, ax = plt.subplots()
ax.plot(x, y)
fig.savefig('fig1.pdf')
plt.show()
fig.savefig('fig2.pdf')

Если вы предпочитаете использовать интерфейс pyplot для всего, то просто возьмите экземпляр фигуры, прежде чем вы вызовете show. Например:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 100)
y = x**2

plt.plot(x, y)
fig = plt.gcf()
fig.savefig('fig1.pdf')
plt.show()
fig.savefig('fig2.pdf')
40
ответ дан Joe Kington 26 August 2018 в 23:06
поделиться

pyplot.show блокирует и разрушает график при закрытии. Вы можете использовать

plt.show(block=False)

, после чего будет сохранено сохранение в fig2.pdf, или вы можете его распечатать еще до сохранения

plt.plot(x,y)
plt.savefig('fig2.pdf')
3
ответ дан miles82 26 August 2018 в 23:06
поделиться

Я должен был запустить plt.cla() и plt.clf() перед построением второго. Очистить текущие оси и график четкого тока соответственно.

1
ответ дан Nick Desaulniers 26 August 2018 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: