代码之家  ›  专栏  ›  技术社区  ›  gran_profaci

根据列的高度绘制具有x轴值的直方图

  •  2
  • gran_profaci  · 技术社区  · 11 年前

    所以,假设我有以下内容:

    [1,5,1,1,6,3,3,4,5,5,5,2,5]
    
    Counts: {1:3, 2:1, 3:2, 4:1, 5:5, 6:1}
    

    现在,我想打印一个在x轴上排序的直方图,如图所示:

    传统的直方图是:

            X  
            X
    X       X  
    X   X   X
    X X X X X X
    1 2 3 4 5 6
    

    我想要的是:

            X  
            X
          X X  
        X X X
    X X X X X 
    2 4 3 1 5 
    

    我当前的绘图代码是:

    plt.clf()
    plt.cla()
    plt.xlim(0,1)
    plt.axvline(x=.85, color='r',linewidth=0.1)
    plt.hist(correlation,2000,(0.0,1.0))
    plt.xlabel(index[thecolumn]+' histogram')
    plt.ylabel('X Data')
    
    savefig(histogramsave,format='pdf')
    

    请帮我想想我该怎么做。。。我知道我之前也发过类似的问题,但我相信我对此不清楚。。。。

    1 回复  |  直到 11 年前
        1
  •  4
  •   askewchan bogatron    11 年前

    直方图不是您要查找的图形。使用条形图。

    import numpy as np
    import matplotlib.pyplot as plt
    
    data = [1, 5, 1, 1, 6, 3, 3, 4, 5, 5, 5, 2, 5]
    correlation = [(i, data.count(i)) for i in set(data)]
    correlation.sort(key=lambda x: x[1])
    
    labels, values = zip(*correlation)
    
    indexes = np.arange(len(correlation))
    width = 1
    
    plt.bar(indexes, values, width)
    plt.xticks(indexes + width * 0.5, labels)
    plt.show()
    

    bar chart

    编辑: 对于大数据集更好地使用 collections.Counter 而不是列表理解 count .


    这是一种更快地归档相同结果的方法(既没有条形图也没有历史记录):

    from collections import Counter
    import numpy as np
    import matplotlib.pyplot as plt
    data = np.random.random_integers(0, 10**4, 10**5)
    correlation = Counter(data).items()
    correlation.sort(key=lambda x: x[1])
    labels, values = zip(*correlation)
    indexes = np.arange(len(correlation))
    
    plt.plot(indexes, values)
    plt.fill_between(indexes, values, 0)
    plt.show()