Поскольку люди, похоже, обращаются к этому вопросу, когда речь заходит об ошибках компоновщика, я собираюсь добавить это здесь.
Одной из возможных причин ошибок компоновщика с GCC 5.2.0 является то, что новая библиотека libstdc ++ ABI теперь выбран по умолчанию.
Если вы получаете ошибки компоновщика о неопределенных ссылках на символы, которые включают типы в пространстве имен std :: __ cxx11 или теге [abi: cxx11], то это, вероятно, указывает на то, что вы пытаетесь связать файлы объектов, которые были скомпилированы с различными значениями для макроса _GLIBCXX_USE_CXX11_ABI. Это обычно происходит при подключении к сторонней библиотеке, которая была скомпилирована с более старой версией GCC. Если сторонняя библиотека не может быть перестроена с новым ABI, вам нужно будет перекомпилировать свой код со старым ABI.
blockquote>. Если вы вдруг получите ошибки компоновщика при переключении на GCC после 5.1.0 это было бы замечательно.
Если вы хотите сохранить фигуру после ее отображения, вам нужно удержать экземпляр фигуры. Причина, по которой 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')
pyplot.show блокирует и разрушает график при закрытии. Вы можете использовать
plt.show(block=False)
, после чего будет сохранено сохранение в fig2.pdf, или вы можете его распечатать еще до сохранения
plt.plot(x,y)
plt.savefig('fig2.pdf')
Я должен был запустить plt.cla()
и plt.clf()
перед построением второго. Очистить текущие оси и график четкого тока соответственно.