【问题标题】:Plot large data in the specified format using python使用python以指定格式绘制大数据
【发布时间】:2015-03-01 01:42:22
【问题描述】:

我是 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 绘制图形。我为我的项目编写了其他代码,并且一直在编写代码来绘制我的最终结果。

提前感谢您的帮助

【问题讨论】:

  • 一小部分输入数字、你的代码、你到底在哪里卡住了等等。所有这些都是对这个问题的一个受欢迎的补充。我怀疑人们会为您编写程序。现在看起来,您所要做的就是解析文件中的值,并在 for 循环中解析 plt.plot((start, end), (id, id)
  • 您希望能够有意义地查看包含大约 1 亿条水平线的图表?也许您应该在绘制数据之前考虑减少数据!
  • @ljetibo 我用示例数据编辑了问题。很抱歉没有包含任何代码,因为我还没有用于绘图的代码。我不要求别人为我编写程序。这将极大地帮助我指出正确的方向,我可以开始
  • @HughBothwell 感谢您的建议。我找到了一种减少数据大小的方法(请参阅已编辑的问题)。
  • 我之前也遇到过类似的问题,我最终使用vlinehline 来完成这项工作。但是,那时我只有几个数据点需要担心。你有多少数据点?

标签: python matplotlib plot


【解决方案1】:

这真的很简单。如果您在 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 开始...而且不仅仅是那个。

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

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

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

【讨论】:

  • 完美!非常感谢。这对我来说是一个很好的开始,我将修改我以前的代码以获得正确的输出来绘制。但是有一个问题,是否可以使用 x 轴作为 mmyyyy 格式的日期而不是纪元时间?
  • 查看我在回复中链接的其他答案。旋转线ax.xaxis.set_major_locator(mpl.dates.MonthLocator())(将标记放在月份所在的位置)format = mpl.dates.DateFormatter('%m/%d')(定义标记的外观,请参阅%m%y 等其他选项。)ax.xaxis.set_major_formatter(format)(指示 x 轴使用定义的用户格式文字显示)。那应该给你你想要的。最好总是尝试使用datetime 对象进行绘图,因为它可以帮助用户避免大量背景计算,例如步数等...
猜你喜欢
  • 2018-09-23
  • 2011-12-18
  • 2018-01-26
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 2016-05-26
相关资源
最近更新 更多