Нет изображения всплывающего окна или отображения для 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')

и все должно быть хорошо.

Другие вопросы по тегам