多个文件的图表上的回溯线

时间:2016-09-07 20:29:39

标签: python-2.7 matplotlib text

我正在绘制来自多个文件的数据。我不想使用glob模块,因为我需要分别绘制每个文件中的数据。数据是绘图,但有追溯'使用Matplotlib绘制图表时的图上的线条。地块的图像如下:

enter image description here

以下是一些示例数据,以帮助解决问题,我很抱歉缺乏格式。数据来自未格式化的文本文件。如果将两个数据集拆分为两个单独的文件,则应重新创建该问题。

Start-Mi, End-Mi,   IRI LWP, IRI R e
194.449,    194.549,    75.1,   92.3
194.549,    194.649,    85.2,   82.8
194.649,    194.749,    90.8,   91.8
194.749,    194.849,    79.3,   73.7
194.849,    194.949,    76.9,   80.1
194.949,    195.049,    82.7,   86.9
195.049,    195.149,    103,    116.7
195.149,    195.249,    81.5,   96.1
195.249,    195.349,    96.7,   92.7
195.349,    195.449,        59.5,   72.2

Start-Mi, End-Mi,   IRI LWP, IRI R e
194.449,    194.549,    79.9,   95.7
194.549,    194.649,    87.4,   96.5
194.649,    194.749,    86.5,   105.3
194.749,    194.849,    77, 76
194.849,    194.949,    73.6,   85.2
194.949,    195.049,    81.7,   94.3
195.049,    195.149,    104.6,  128.2
195.149,    195.249,    84.2,   98.6
195.249,    195.349,    94.2,   91.3
195.349,    195.449,    57.5,   72.1

当代码在新文件上开始新数据图时,将创建回溯线。我试图摆脱从剧情结尾绘制的水平线回到开头。我需要清理绘图,因为代码被设计为迭代无限数量的数据文件。代码如下所示:

def graphWriterIRIandRut():
    n = 100
    m = 0
    startList = []
    endList = []
    iriRList = []
    iriLList = []
    fileList = []
    for file in os.listdir(os.getcwd()):
        fileList.append(file)
    while m < len(fileList):
        for col in csv.DictReader(open(fileList[m],'rU')):
            startList.append(float(col['Start-Mi']))
            endList.append(float(col['  End-Mi']))
            iriRList.append(float(col[' IRI R e']))
            iriLList.append(float(col['IRI LWP ']))

        plt.subplot(2, 1, 1)
        plt.grid(True)
        colors = np.random.rand(n)
        plt.ylabel('IRI value',fontsize=12)
        plt.title('Right IRI data per mile for 2016 calibrations: ')
        plt.plot(startList,iriRList,c=colors)
        plt.tick_params(axis='both', which='major', labelsize=8)

        plt.subplot(2, 1, 2)
        plt.grid(True)
        colors = np.random.rand(n)
        plt.ylabel('IRI value',fontsize=12)
        plt.title('Left IRI data per mile for 2016 calibrations: ')
        plt.plot(startList,iriLList,c=colors)
        plt.tick_params(axis='both', which='major', labelsize=8)

        m = m + 1
        continue

    plt.show()
    plt.gcf().clear()
    plt.close('all')

1 个答案:

答案 0 :(得分:1)

您的代码目前正在执行以下操作:

  1. 从文件中读取数据,并将其附加到列表中
  2. 绘制列表
  3. 列表不会在任何时候被清除,因此您将继续绘制列表,并附加越来越多的数据,其中大部分都是反复绘制的。这也是为什么你的所有线都有相同颜色的原因:它是你制作的最后一个绘图的颜色,它完全覆盖了之前的所有绘图,并增加了一行。

    碰巧,ImageView有一个漂亮的pyplot函数,可以让您确保在图上创建的任何其他图都不会覆盖旧图。您甚至不需要生成自己的颜色序列。 hold也会为你做到这一点。

    虽然您的程序功能正常,但代码中也存在一些可以轻松纠正的“风格”问题。它们最好是非Pythonic,实际上最坏的问题是:

    1. 文件应在打开后关闭。 pyplot关键字中使用的上下文管理器是此标准方法。
    2. 有更好的方法可以复制with的结果,而不是os.listdir循环。实际上,您根本不需要复制列表。
    3. 如果您正在编写一个for循环,该循环会在每次迭代时递增索引,那么它应该是while循环。
    4. 在循环结束时,您永远不需要for。这是隐含的。
    5. 所以这是一个结合了以上所有内容的解决方案。此版本假定您在绘制之后不需要保留给定文件的内容:

      continue

      在您提供的输入上运行此函数会生成下图:

      enter image description here

      要获得更有效的方式来处理CSV和表格数据,您可能需要查看pandas库。它是一个非常强大的分析工具,包括您可能想象的大多数用例的绘图和IO例程。