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

Plot large data in the specified format using python

我是 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数量最多。 我想要实现的是如下图所示,在我文件的每一行中,我将绘制一个条形图。

我希望上面的图片很好地解释了我想要实现的目标。如果让我知道如何开始图形并以我想要的单位设置 y 轴和 x 轴,那就太好了。抱歉,这是我第一次尝试在 Python 中绘制图表。我为我的项目编写了其他代码,但一直坚持编写代码来绘制我的最终结果。

提前感谢您的帮助

真的很简单。如果您在 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()
    

由于在您的问题中您说条形的右边缘在第二个坐标处结束很重要,因此最好使用 end[i] 进行绘图。但是,正如我在图表中显示的那样,您有一些重叠问题。 IE。第一个结束于 ....314... 而第二个开始于 ....259... 而且不止那个。

你基本上要问的清楚地表明这是错误的:"I want to make each line in my file into a bar, and I have already stacked the y axis height. And x axis are dates."但显然你没有做对,因为直方图中不应该有重叠,如果有重叠表示overlap应该加到bin之前的高度。

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

结果(python3,win7,matplotlib 1.3.1):