如何在python中从文件中提取数据
如何在多行图中绘制这些数据 我尝试过使用这些代码,但只有每行的第一个值被添加到列表中 对于y轴,我希望得到设备的值乘以0.5,0,1,0的值(例如,对于第1行,(tv值=120),我应该得到24个位于 y轴:60和 x轴0 y轴0和 x轴1 y轴120和 x轴2 以此类推…总共有24个绘图(我的y标签将由0到2200的值组成) 对于我的x轴,我将绘制x_标签的值 文件格式如何在python中从文件中提取数据,python,file,Python,File,如何在多行图中绘制这些数据 我尝试过使用这些代码,但只有每行的第一个值被添加到列表中 对于y轴,我希望得到设备的值乘以0.5,0,1,0的值(例如,对于第1行,(tv值=120),我应该得到24个位于 y轴:60和 x轴0 y轴0和 x轴1 y轴120和 x轴2 以此类推…总共有24个绘图(我的y标签将由0到2200的值组成) 对于我的x轴,我将绘制x_标签的值 文件格式 Residents: 4 TV1:120:0.5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,0,0
Residents: 4
TV1:120:0.5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,0,0,0.5,1,1,1,0.5
Computer:320:1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Fridge1:250:1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Dishwasher:500:0.5,1,1,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1
Blender:700:0,0,0,0,0,0,0,0,0,0,0,0,0,0.05,0,0,0,0,0,0,0,0,0,0
Fridge2:50:1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Coffee machine:2400:0,0,0,0,0,0,0,0,0,0.05,0.05,0,0,0,0,0,0,0,0,0,0,0,0,0
Kettle:2200:0.05,0,0,0,0,1,0,0,0.05,0,0.05,0.05,0,0,0,0,0.05,0,0,0,0,0.05,0.05,0
Freezer:140:1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Slow cooker:300:0,0,0,0,0,0,0,0,0,0,0,0,0.5,1,1,1,1,1,0.5,0,0,0,0,0
我的代码
import matplotlib.pyplot as plt
import numpy as np
x = []
y = []
x_labels = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23']
fileobj = open('file.csv','r')
for line in fileobj:
line_s = line.strip()
Usage = [(x) for x in line_s.split(',')]
y.append(Usage[2])
fileobj.close()
plt.plot(y ,"o--")
plt.ylabel("usage")
plt.xlabel("time")
plt.show()
欢迎来到SO
让我们试试这个
fileobj = open('file.csv','r')
first_line = True
for line in fileobj:
if first_line:
first_line = False
continue
line_s = line.strip() # line -> Slow cooker:300:0,0,0,..
name, id, values = line.split(':') # ['Slow cooker', '300', '0,0,0']
usage = [int(x) for x in values.split(',')] # convert values into integers
print(usage)
y.append(usage)
我的理解是您正在尝试绘制此文本数据。Y是列表格式的使用值
如果您不确定发生了什么,请使用我在上述代码中添加的print
命令
import matplotlib.pyplot as plt
import numpy as np
x_labels = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23']
with open(r'C:\Users\$env:UserName\Desktop\MyScripts\file.csv', 'r') as file_obj:
for line in file_obj:
line = line.strip('\n')
# print(f"{line = }")
usage = [x for x in line.split(',')]
# print(f"{usage = }")
number = float(usage[0].split(':')[1])
first = [float(usage[0].split(':')[-1])]
remaining = [float(x) for x in usage[1:]]
# print(f"{first = }")
# print(f"{type(first) = }")
# print(f"{remaining = }")
first.extend(remaining) # * number
res = list(map(lambda x: x * number, first))
print(f"{res = }")
plt.plot(res, "o--")
plt.ylabel("usage")
plt.xlabel("time")
plt.show()
读取文件时,您将获得每个设备x(时间)上的所有数据。 如果要打印所有设备,可以在读取数据时进行打印。看起来您希望设备作为标签
fileobj = open('file.csv','r')
line = fileobj.readline()
for i, line in enumerate(fileobj):
device, wattage, h = line.split(':')
watts = [float(x) * float(wattage) for x in h.replace('\n','').split(',')]
# print(device, watts, wh)
plt.plot(watts, label=str(i+1))
# or plt.plot(watts, label=device) # if you want device as label
plt.legend()
你能再解释一下吗?你想把设备名称写在X轴上吗?比如说TV1在X=0,电脑在X=1(虽然0、1等不会出现)。那么多个y值呢?你想让它们相互连接吗(第一个电视条目用一条线连接到第一个电脑条目,依此类推)?每行是否保证有完全相同的条目数?@VBB我已更新问题…如果仍然不清楚,请告诉我是的,thnks我现在在不同的列表中有所有值,但我如何获取第一个值(例如:计算机:320:我如何获取值320),然后将其乘以列表中的值(例如:1,0,0),然后绘制图表。我想说的是,我的y值应该是列表中的第一个值(320)乘以其他值。你可以像
usage=[int(x)*int(id)for x in values.split(',')]
我现在所有的值都在不同的列表中,但是我如何取第一个值(例如:计算机:320:我如何取值320),然后将其与列表中的值相乘(例如:1,0,0),然后绘制图表。我想说的是,我的y标签应该是:2200 2000 1800 1600…像这样取出值:用法[0]。拆分(“:”)[1]你的代码工作得很好,但是你能向我解释一下,24小时的时间是如何出现在x轴上的吗?这只是隐式的——在没有给出相应的x数据的情况下,根据y数据的索引进行绘图。换句话说,plt.plot(watts)
与plt.plt(range(len(watts)),watts)
是一样的。