Нет изображения всплывающего окна или отображения для plt.imshow() и plt.show()
Я пытался воссоздать демонстрационный скрипт cocoapi, скопировав его в свой собственный локальный скрипт вместо того, чтобы запускать его на ноутбуке Jupyter. Все работает нормально, и определенно изображение читается и может отображаться, потому что я протестировал его с помощью функции imshow() openCV (и изображение появляется). Однако, когда я попытался открыть изображение с помощью plt.imshow() и plt.show(), изображение не появилось.
Я пошел в Интернете, чтобы найти решение в, они предложили его бэкэнд-проблему? Однако когда я запустил matplotlib.get_backend(), он вернул: 'TkAgg'.
Я также запустил: sudo apt-get install tcl-dev tk-dev python-tk python3-tk без ошибок и проблем.
from __future__ import print_function
from pycocotools.coco import COCO
import os, sys, zipfile
import urllib.request
import shutil
import numpy as np
import skimage.io as io
import matplotlib.pyplot as plt
import pylab
pylab.rcParams['figure.figsize'] = (8.0, 10.0)
...
# load and display image
I = io.imread('%s/images/%s/%s'%(dataDir,dataType,img['file_name']))
plt.axis('off')
plt.imshow(I)
plt.show()
Версии
* Операционная система: Ubuntu 16.04
* Matplotlib версия: 2.2.3
* Matplotlib backend (print(matplotlib.get_backend())
): TkAgg
* Python версия: 3.5.2
1 ответ
Есть два решения для этого. Первое решение любезно указано @ImportanceOfBeingErnest и заключается в переключении бэкэндов. Решение указано в этой теме
Как указал @ImportanceOfBeingErnest, второе решение менее идеально, поскольку включает в себя изменение исходного кода. Но если по каким-либо причинам первый метод не работает, не стесняйтесь попробовать второй.
Второе решение: когда я запустил matplotlib.get_backend(), он вернул: "TkAgg", поэтому я был озадачен, почему он все еще не работает. Оказывается, он вернул TkAgg, потому что я сделал что-то подобное в терминале:
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
import matplotlib
matplotlib.get_backend()
Но с линией
from pycocotools.coco import COCO
С терминала:
This call to matplotlib.use() has no effect because the backend has already
been chosen; matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.
В файле cocoapi/PythonAPI/pycocotools/coco.py третья строка импорта была:
import matplotlib; matplotlib.use('Agg')
Измените это на:
import matplotlib; matplotlib.use('TkAgg')
и все должно быть хорошо.