Matplotlib: boxplot останавливает выполнение программы

Я написал небольшую программу для чтения в CSV-файле и по его содержимому пытается сохранить коробочную диаграмму в файл:

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv('Data.csv')

plt.ioff()
fig1, ax1 = plt.subplots()
ax1.set_title('Test Plot')
ax1.boxplot(data)
fig1.savefig('testGraph.pdf')   # save the figure to file
plt.close(fig1, bbox_inches='tight')

Содержимое файла Data.csv выглядит так:

"VarA","VarB"
"0.17930210790378986","886.9933011822859"
"0.01364054450557276","1139.6074779392254"
"0.17926365089066673","887.0276399462234"
"0.013813899304885247","1139.5782227339264"
"0.3265506417295615","2403.651444000035"
"0.5276772326905425","550.0787718046192"
"0.3266505322109829","2403.473910859639"
"0.5270364628724318","550.3655399414718"
"0.301951691229673","2447.2094472630693"
"0.5592257235158642","536.8017995252469"
"0.3020484011262961","2447.0390369668467"
"0.5584914299935637","537.1205945626922"
"0.2778648677077672","2489.339898509246"
"0.5928427006170575","523.2229700948385"
"0.2779586849926319","2489.177223805282"
"0.5919947811607554","523.5775073154801"
"0.2542483867446956","2529.825433671251"
"0.6287276395737614","509.40461834459865"
"0.2543395881647406","2529.6710855743004"
"0.6277398978255627","509.7994161108826"

Либо через интерактивную консоль, либо через прямую передачу кода интерпретатору выполнение останавливается на строке ax1.boxplot(data), без каких-либо сообщений об ошибках или выдачи исключений. Пример в консоли:

$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import pandas as pd
>>> import matplotlib.pyplot as plt
>>> hammer = pd.read_csv('Hammer.csv')
>>> plt.ioff()
>>> fig1, ax1 = plt.subplots()
>>> ax1.set_title('Basic Plot')
Text(0.5,1,'Basic Plot')
>>> ax1.boxplot(hammer)

После этого консоль перестает отвечать. Если я убью консоль, выдается исключение, но это не объясняет причину остановки:

^CTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/matplotlib/__init__.py", line 1718, in inner
    return func(ax, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/matplotlib/axes/_axes.py", line 3378, in boxplot
    manage_xticks=manage_xticks, zorder=zorder)
  File "/usr/lib/python3/dist-packages/matplotlib/axes/_axes.py", line 3730, in bxp
    boxes.extend(doplot(box_x, box_y, **final_boxprops))
  File "/usr/lib/python3/dist-packages/matplotlib/axes/_axes.py", line 3648, in doplot
    return self.plot(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/matplotlib/__init__.py", line 1718, in inner
    return func(ax, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/matplotlib/axes/_axes.py", line 1376, in plot
    self.autoscale_view(scalex=scalex, scaley=scaley)
  File "/usr/lib/python3/dist-packages/matplotlib/axes/_base.py", line 2280, in autoscale_view
    y_stickies = sum([sticky.y for sticky in stickies], [])
  File "/usr/lib/python3/dist-packages/matplotlib/axes/_base.py", line 2280, in <listcomp>
    y_stickies = sum([sticky.y for sticky in stickies], [])
KeyboardInterrupt

Что мешает полноценному выполнению программы? Или выдача сообщений об ошибках?

@ImportanceOfBeingErnest вы правы, значения из CSV должны быть преобразованы в числа перед нанесением на график. Не могли бы вы оставить свой комментарий в качестве ответа?

Luís de Sousa 11.12.2018 19:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
176
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я взял ваш код инициализации с небольшими изменениями, и он сработал ..

import pandas as pd
import matplotlib.pyplot as plt


def main():
    hammer = pd.read_csv('data.csv')

    plt.ioff()
    fig1, ax1 = plt.subplots()
    ax1.set_title('Test Plot')
    ax1.boxplot(hammer)
    fig1.savefig('testGraph.pdf')   # save the figure to file
    plt.close(fig1)


if __name__ == '__main__': main()

я тестировал его на python 3.7 Кроме того, я запускаю его на машине с Windows, а не на Linux

Этот пример также блокируется инструкцией ax1.boxplot(hammer). Во фрагменте действительно были некоторые проблемы, которые, по общему признанию, не тестировались. Но пример в интерактивной консоли изначально был правильным.

Luís de Sousa 11.12.2018 19:17
Ответ принят как подходящий

Я могу представить, что вы не преобразовали свои строки в числа, так что boxplots пытается выполнять статистику по строкам, и на это уйдет целая вечность.

Можешь попробовать

ax1.boxplot(hammer.values.astype(float))

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