我在python中有这个代码,它正在运行。
from matplotlib import style
from matplotlib import pylab as plt
import numpy as np
style.use('ggplot')
filename='results.csv'
value=[]
date=[]
import csv
with open(filename, 'r') as csvfile:
csvreader = csv.reader(csvfile)
for row in csvreader:
if len(row) ==2:
value.append(row[0])
date.append(row[1])
value=np.array(value)
import datetime
for ii in range(len(date)):
date[ii]=datetime.datetime.strptime(date[ii], '%a %b %d')
plt.ylim(2, -2)
plt.plot(date, value)
plt.show()
.csv文件(差不多18000个条目):
[0.0] Thu Mar 15
[0.0] Thu Mar 15
[0.0] Thu Mar 15
[0.0] Thu Mar 15
[-0.05] Thu Mar 15
[0.0] Thu Mar 15
[0.0] Thu Mar 15
....
问题是我希望y轴的值从[-2,2]开始按升序排列,以便观察曲线的路线。我将这样的csv可视化错误的理由还是我错过了重要的东西?我将不胜感激任何帮助。
答案 0 :(得分:0)
你的价值观有大括号,不知道为什么。当我使用 numpy 1.14.1 和 matplotlib 2.0.0 尝试此代码时,它会引发异常,您无法将 [0.0] 转换为float 。
在Anaconda( matplotlib 2.1.2 和 numpy 1.14.0 )中尝试此代码后,代码可以运行。但是,y-Scale显示错误。我认为其中一个软件包可能存在错误。
首先,您应该将您的 [0.0] 值与eval(来自ast包)转换为列表,然后获取列表的第一个元素。所以只需修改 value.append
即可import ast
.
.
value.append(ast.literal_eval(row[0])[0])
之后,将matplotlib设置为从2到-2显示。您应该像这样设置 ylim :
plt.ylim(-0.05, 2)
所以完整的例子
from matplotlib import style
from matplotlib import pylab as plt
import numpy as np
import ast
style.use('ggplot')
filename='results.csv'
value=[]
date=[]
import csv
with open(filename, 'r') as csvfile:
csvreader = csv.reader(csvfile, delimiter='\t')
for row in csvreader:
if len(row) ==2:
value.append(ast.literal_eval(row[0])[0])
date.append(row[1])
value=np.array(value)
import datetime
for ii in range(len(date)):
date[ii]=datetime.datetime.strptime(date[ii], '%a %b %d')
plt.ylim(-0.05, 2)
plt.plot(date, value)
print(value)
plt.show()
此外,还有更好的解决方案可以完成您的任务。考虑使用熊猫。我以为你需要2018年。
from matplotlib import style
from matplotlib import pylab as plt
from dateutil.parser import parse
import datetime
import pandas as pd
import ast
style.use('ggplot')
filename = 'results.csv'
df = pd.read_csv('results.csv', sep='\t')
df.columns = ['value', 'date']
# Convert to datetime
df.date = df.date.apply(lambda x:
parse(x, default=datetime.datetime(2018, 1, 1)))
# Unpack your list elements
df.value = df.value.apply(lambda x: ast.literal_eval(x)[0])
plt.plot(df.date, df.value)
plt.ylim(-0.05, 2)
plt.show()
如评论中所述,使用eval是一个安全问题。最好从 ast 包中使用 literal_eval 。
答案 1 :(得分:0)
使用pandas简化了很多事情。您可以在阅读文件时直接从数据中删除括号。
u = u"""[0.0]\tThu Mar 14
[0.0]\tThu Mar 15
[0.0]\tThu Mar 16
[0.0]\tThu Mar 17
[-0.05]\tThu Mar 18
[2.0]\tThu Mar 19
[0.0]\tThu Mar 20"""
import io
import pandas as pd
import matplotlib.pyplot as plt
import datetime
parse_date = lambda x: datetime.datetime.strptime(x, "%a %b %d")
parse_vals = lambda x: float(x.strip("[]"))
df = pd.read_csv(io.StringIO(u), sep="\t",header=None,names=["val", "date"],
converters={0:parse_vals,1:parse_date} )
df.set_index("date").plot()
plt.show()