Python: CSV для Barchart с использованием Matplotlib - PullRequest
0 голосов
/ 24 октября 2019

Я хотел бы нарисовать Гистограмму из файла CSV, который имеет следующий формат:

#Number of Occurrences, Occurrences of A, Occurrences of B, Occurrences of C
30,1,3,26
...

Я совершенно новичок в Matplotlib, и я пытаюсь понять, каксделать это. Мне бы хотелось, чтобы у оси Y было значение # Количество вхождений (30 для предоставленного примера) и три бара;Бар A, B и C с соответствующими значениями.

Как я могу это сделать?

Мой код:

#!/usr/bin python



import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import sys

def main():

    table  = pd.read_csv(sys.argv[1])

    final = table.tail(1)

    names_list = list(final)
    values     = [ final.values[0][1], final.values[0][2], final.values[0][3] ]

    position = np.arange(len(names_list)) 

    plt.title(sys.argv[1].split('.')[0])

    plt.bar(position,values,align='center')

    plt.yticks(position,names_list)

    plt.show()



if __name__ == '__main__':
    main()

Но я получаю **ValueError: shape mismatch: objects cannot be broadcast to a single shape**

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

ValueError: несоответствие формы: объекты не могут быть переданы одной фигуре


Отладка вашего кода:

  1. Смотреть лен (положение)
  2. Смотреть len (значения)
  3. Сравнить len (положение) и len (значения)
  4. Вы можете найти свой len (положение)! = Len (значения)

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

0 голосов
/ 24 октября 2019

Ошибка в том, что «values» содержит 3 значения, а position содержит 4 значения. Итак, несоответствие формы. Есть и другие вещи с осями X и Y. Проверьте этот код и дайте мне знать, если он делает то, что вы ожидаете:

def main():

    table  = pd.DataFrame([[30, 1, 3, 26]], columns=['Number Oc', 'Oc A', 'Oc B', 'Oc C'])

    final = table.tail(1)

    names_list = list(final)
    values     = [ final.values[0][1], final.values[0][2], final.values[0][3] ]

    position = np.arange(len(names_list)-1)

    plt.title(sys.argv[1].split('.')[0])

    plt.bar(position,values,align='center')

    plt.xticks(position, names_list[1:4])

    plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...