首页 > 解决方案 > Python:使用 Matplotlib 将 CSV 转换为条形图

问题描述

我想从具有以下格式的 CSV 文件中绘制条形图:

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

我对 Matplotlib 完全陌生,我正在尝试了解如何去做。我希望 y 轴具有#Number of Occurences值(提供的示例为 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**

标签: pythonpandasnumpymatplotlib

解决方案


错误是因为 '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()

推荐阅读