Использование функций plt для фигур в matplotlib или передача plt в mpld3

Многие примеры определяют fig и ax с помощью fig, ax = plt.subplots(), а затем они напрямую вызывают функции на объекте-фигуре. Напротив, другие примеры работают напрямую с plt. Этот ответ объясняет некоторые различия, но мне все еще неясны две вещи. Во-первых, если я не создаю отдельный объект-фигуру, как передать его другой функции. Например, когда я создаю объект-фигуру, я могу передать его mpld3 для создания визуализации D3:

d3plot = mpld3.fig_to_html(fig,template_type="simple")

Во-вторых, если я действительно создаю объект-фигуру, как мне вызвать функции, которые я могу вызвать на plt на фигуре? Например, я хотел бы запустить следующий код, а затем передать его в виде рисунка в mpld3, как указано выше.

plt.imshow(wordcloud)
plt.axis("off")
plt.show()

Другой ответ гласит, что plt.subplots () распаковывает кортеж. Я не был уверен, распакует ли он то, что уже было на плате. Итак, я попробовал:

wordcloud = WordCloud().generate(text)
plt.imshow(wordcloud)
plt.axis("off")
fig, ax = plt.subplots()
d3plot = mpld3.fig_to_html(fig,template_type="simple")

Однако это дает мне только черный график, который согласуется с моим предыдущим пониманием того, что plt.subplots() создает совершенно новые фигуры.

Обновление На основе комментариев я попробовал следующее:

wordcloud = WordCloud().generate(text)
figTopicWordCloud, ax = plt.subplots()
ax.imshow(wordcloud)
ax.axis('off')
d3plot = mpld3.fig_to_html(figTopicWordCloud, template_type="simple")

Хотя это успешно произвело сюжет, оно не удалило оси с фигуры.


person Michael    schedule 02.03.2017    source источник
comment
Я бы рекомендовал всегда работать с объектами осей. После создания фигуры получите текущую ось, вызвав ax=plt.gca() или - для конкретного объекта фигуры - вызвав ax=fig.gca(). Если ваш макет включает подзаголовки, вы можете получить объекты осей подзаголовка, например, вызвав ax=fig.add_subplot(111). Методы объектов осей вызываются иначе, чем функции plt, см. Этот документ: matplotlib.org/ api / axes_api.html   -  person Sven Festersen    schedule 03.03.2017
comment
Я не понимаю, какой порядок вы предлагаете, я придерживаюсь приведенного выше примера. Я также не могу передать оси в mpld3.fig_to_html, поэтому я не уверен, в чем заключается различие, которое вы проводите, и как оно решает данный случай.   -  person Michael    schedule 03.03.2017
comment
Извините, я неправильно понял часть вашего вопроса. Вы ищете fig=plt.gcf(). Подробности смотрите в моем ответе.   -  person Sven Festersen    schedule 03.03.2017
comment
Обратитесь к этому видео с объяснением matplotlib Андреаса Мюллера, это может помочь. youtube.com/   -  person tjt    schedule 30.09.2020


Ответы (1)


Когда вы запускаете что-то вроде

plt.imshow()

без явного создания фигуры раньше, matplotlib создает новый объект фигуры и новый объект оси. Для доступа к рисунку используйте

fig = plt.gcf()

Это возвращает текущую цифру. Так же,

ax = fig.gca()

дает вам ссылку на текущие активные оси на этом рисунке. Звонок

fig, ax = plt.subplots()

однако это сокращение от следующего:

fig = plt.figure()
ax = fig.add_subplot(111)

Первая строка создаст совершенно новый объект-фигуру.

Быстрое решение для вашего случая - построить график данных и получить доступ к неявно созданной фигуре после этого, например:

plt.imshow(wordcloud)
plt.axis("off")
fig = plt.gcf()
d3plot = mpld3.fig_to_html(fig, template_type="simple")

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

fig = plt.figure()
ax = fig.gca()
ax.imshow(wordcloud)
ax.set_axis_off()
d3plot = mpld3.fig_to_html(fig, template_type="simple")

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

person Sven Festersen    schedule 02.03.2017
comment
Ваш первый метод действительно портит другие сюжеты. Второй метод - нет, но полученная фигура все еще имеет оси. - person Michael; 03.03.2017
comment
Я обновил последнюю часть ответа. Этот код должен создавать фигуру без видимых осей. - person Sven Festersen; 03.03.2017
comment
Добавление ax.set_axis_off() по-прежнему не подавляет оси. Я подумал, что мне, возможно, придется добавить fig.add_axes(ax), и я это сделал, но это тоже не сработало. - person Michael; 03.03.2017
comment
Это странно. Решение, которое я опубликовал в ответе, отлично подходит для меня. Какую версию Python и matplotlib вы используете? - person Sven Festersen; 03.03.2017
comment
Python 2.7.6. и matplotlib 1.4.3. Вероятно, я мог бы обновить matplotlib, ничего не сломав. Я только что попробовал, и в версии 2.0.0 это все еще не работает. Когда вы говорите, что это работает для вас, я предполагаю, что вы делаете последний шаг, просматривая график d3, отображаемый в браузере, а не просто смотрите на рисунок? Спасибо за вашу помощь. - person Michael; 03.03.2017
comment
На самом деле я не пробовал отображать график d3. Однако я провел небольшое исследование и обнаружил эту проблему в системе отслеживания проблем mpld3: github.com/mpld3/ mpld3 / issues / 197 Похоже, mpld3 просто игнорирует то, что вы отключили видимость оси. Думаю, с этим мало что можно сделать. За исключением окраски оси в цвет фона: stackoverflow.com/a/12059429/5480526 mpld3 также может игнорировать цвет, но ты мог бы попробовать - person Sven Festersen; 03.03.2017