使用python以指定格式绘制大数据

时间:2015-03-01 01:42:22

标签: python matplotlib plot

我是Python的新手,需要一些关于如何以下列格式绘制数据的帮助(请参阅图片)

我将有这样的文件格式:

# of IDs \t start_time \t end_time
   428      1404238888      1404314624
   132      1404259731      1404346488
    77      1404347808      1404437873 
    63      1404432707      1404520913
    281     1404518967      1404605334
   .......

根据评论中的建议,我找到了一种通过按开始和结束时间对ID进行聚类来减少数据的方法。我的新文件将具有上述格式,其中第一列说明该时间范围内的ID(从开始到结束)。 所以我想这个案例的更好的图表表示是做条形图。

我的y轴是ID的数量,x轴是以天为单位的时间(我的总测量时间是〜3个月)

我想要展示的是在什么时间范围内ID聚集的数量最多。 我想要实现的是下面的图像,在我的文件的每一行,我将绘制一个条。

enter image description here

我希望上面的图片能够很好地解释我想要实现的目标。很高兴让我知道如何开始绘图并以我想要的单位设置y轴和x轴。对不起,这是我第一次尝试在Python中绘制图形。我为我的项目编写了其他代码,并且无法编写代码来绘制我的最终结果。

提前感谢您的任何帮助

1 个答案:

答案 0 :(得分:2)

这真的很简单。如果你在matplotlib的示例部分中挖了一些,那么你应该没有任何问题。plt.bar(left_edge, height, width)完全符合你的要求。

  1. 得到你需要的东西。

    import matplotlib.pyplot as plt
    import csv
    

    如果你的数据确实是一个制表符分隔文件,它应该是这样的:(你的看起来更像是一个多个空格分隔的文件tbh)

    id  start   end
    428 1404238888  1404314624
    132 1404259731  1404346488
    77  1404347808  1404437873 
    63  1404432707  1404520913
    281 1404518967  1404605334
    
  2. 读入您拥有的数据。

    file = open("test.txt", "r")
    reader = csv.DictReader(file, delimiter="\t")
    
    ids = [] #open 3 new lists to hold your data
    start = []
    end = [] 
    for data in reader:
        ids.append(float(data["id"]))
        start.append(float(data["start"]))
        end.append(float(data["end"])-float(data["start"])) #remember: it's "width" not "right edge coordinate"
    
  3. 这是实际的绘图。

    fig, ax = plt.subplots()
    w = sum(end)/len(end)/10 #change the width of the bar
    for i in range(len(ids)):
        ax.bar(start[i], ids[i], width=end[i])
    
    plt.show()
    
  4. 因为在你的问题中,你说条形图的右边缘在第二个坐标中结束是很重要的,所以最好用end[i]进行绘图。但是,正如我在图表中显示的那样,您有一些重叠问题。即第一个结束于...... 314 ...而第二个结束于.... 259 ......并且不仅仅是那个。

    你基本上要求清楚地表明这是错误的:"我想让我文件中的每一行都成为一个条形,我已经堆叠了y轴高度。 x轴是日期。"但显然你没有做得对,因为在这样的直方图中应该没有重叠,如果有重叠意味着应该在之前将重叠添加到bin的高度。

    我回答了一个类似的问题,一段时间回到如何正确处理和堆叠matplotlib中的日期,reading it可能会帮助你。它是在模拟日期时间对象列表上完成的。您看起来已经使用date2num进行了转换,但适用相同的原则(与使用hist函数的建议相同,并让它处理日期。)

    结果(python 3,win7,matplotlib 1.3.1):

    enter image description here