【问题标题】:Plotting simple graph python, from txt file从 txt 文件绘制简单的图形 python
【发布时间】:2016-07-22 22:02:45
【问题描述】:

我试图剥离并获取 .txt 文件中的数据以允许我绘制一个简单的图表,但我似乎无法将数据转换为我想要的格式。有人可以指导我正确的方向吗?

下面是文本文件中数据的简短示例,在 python 中,我尝试 .read() 文本文件,然后绘制一个简单的图形,如果可能的话,使用文本文件本身中的标题。

Date,Value
2016-03-31,0.7927
2016-03-30,0.7859    
2016-03-29,0.7843  
2016-03-24,0.7893    
2016-03-23,0.792    
2016-03-22,0.7897    
2016-03-21,0.7818    
2016-03-18,0.778    
2016-03-17,0.781    
2016-03-16,0.7855   
2016-03-15,0.7845

到目前为止我尝试过的 python 代码:(这不是完美的代码,因为我仍在整理它!)

import numpy as np
import matplotlib.pyplot as plt


with open("EURGBP DATA.txt") as f:
data = f.read()

data = data.split('\n')

x = [row.split()[0] for row in data]
y = [row.split()[1] for row in data]

index = [i for i,val in enumerate(x)]

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_title("Plot DAta")    
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_xticklabels(x)
ax1.plot(index ,y, c='r', label='the data')
leg = ax1.legend()
plt.locator_params(nbins=len(index)-1)
plt.show()

【问题讨论】:

    标签: python numpy pandas matplotlib graph


    【解决方案1】:

    pandas 中的DataFrame 对象已经有一个函数plot() 非常有用。将您的示例复制到剪贴板,我可以执行绘图:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.read_clipboard(delimiter=',')
    df.plot()
    ax = plt.gca()
    ax.set_xticklabels(df.Date)
    plt.savefig(filename='test.png')
    

    【讨论】:

      【解决方案2】:

      这些行以空格而不是逗号分隔数据行:

      x = [row.split()[0] for row in data]
      y = [row.split()[1] for row in data]
      

      您需要指定要分割的字符(默认为空白字符):

      x = [row.split(',')[0] for row in data]
      y = [row.split(',')[1] for row in data]
      

      编辑:额外的数据清理

      如果数据文件有一个尾随换行符,那么

      y = [row.split(',')[1] for row in data]
      

      将引发IndexError,因为尾随换行行将没有第二个元素:

      >>> data = 'a,b\nc,d\n'.split('\n')
      >>> print(data)
      ['a,b', 'c,d', '']
      >>> print(data[0].split(','))
      ['a', 'b']
      >>> print(data[-1].split(','))
      ['']   
      

      通过在拆分值之前测试该行不是空字符串来防止这种情况:

      x = [row.split(',')[0] for row in data if row]
      y = [row.split(',')[1] for row in data if row]
      

      您还需要从传递给 matplotlib 的值中删除列标题名称。通过在创建 x 和 y 值时省略第一行来做到这一点:

      >>> data = 'First,Second\na,b\nc,d\n'.split('\n')
      >>> print(data)
      ['First,Second', 'a,b', 'c,d', '']
      >>> x = [row.split(',')[0] for row in data[1:] if row]
      >>> print(x)
      ['a', 'c']
      >>> y = [row.split(',')[1] for row in data[1:] if row]
      >>> print(y)
      ['b', 'd']
      

      【讨论】:

      • 感谢您的帮助!但是,当我尝试使用 `x=[row.split( ' , ') [ 0] for row in data]` 时,我得到以下信息:IndexError : List index out of range....?
      • @AlexWalton 你确定它在x = ... 行而不是y = ... 行吗?根据我的经验,str.split 方法总是至少包含一个元素,因此索引 0 的 IndexError 似乎不太可能。但是,如果您的文件包含没有逗号的行,则可能会在索引 1 上出现 IndexError - 例如,如果末尾有一个空行。
      • 感谢您回来!好的,我没有正确格式化代码。是的,你是对的,它在 y = ... 而不是 x = ... 上。我回到原始文本文件并尝试删除和“空格”,但它仍然导致错误。所以它实际上在做的是与最后的空行混淆(或者如果有一行没有错误!)
      • y = [row.split(',')[1] for row in data if row] 工作吗?
      • 它让我可以更深入地研究代码,但会引发另一个错误:return array(a, dtype, copy=False, order=order) ValueError: could not convert string to float: Value
      【解决方案3】:

      使用pandas(我在下面使用import pandas as pd),这实际上可以用一行来完成:

       pd.read_table('datafile.txt', parse_dates = True, index_col = 0, sep = ',').plot()
      

      parse_dates 关键字告诉 pandas 尝试将索引转换为日期时间。结果如下所示:

      【讨论】:

      • 谢谢,我试过了,效果很好!我还没有写出这么漂亮的东西的技能!
      猜你喜欢
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      相关资源
      最近更新 更多