【发布时间】:2019-08-15 22:53:23
【问题描述】:
我有一个代码库的输出,它在材料中生成“带”的能量。数据的组织方式是左列表示索引,第二列表示其能量。当我在 GNUplot 中绘制它时,我得到了这个:
文本文件中的数据组织如下:
0 -3.2101962802476773
0 -3.2101962802476773
0 -3.2101962802476773
0 -2.8612484511071283
0 -2.8612484511071212
0 -2.855472070340414
0 -2.855472070340414
0 -2.8473558653791424
1 -3.2098593700677056
1 -3.2098593700677056
1 -2.871177955425835
1 -2.871177955425834
1 -2.8651192493631106
1 -2.865119249363109
1 -2.846669223652509
1 -2.846669223652504
2 -3.209297896654713
2 -3.209297896654713
2 -2.8811028573856685
2 -2.881102857385668
2 -2.8750382428650094
2 -2.875038242865009
2 -2.8460674384836837
2 -2.846067438483675
我可以(在某种程度上)清楚地看到结构,尽管颜色使它变得困难。我想使用 python 和 matplotlib 做的是将第一行数据与左列值已更改的第一个实例匹配(因此将第一 (x,y) 对映射到 x 所在的相应行现在 1),对于第二个、第三个、第四个等也是如此。然后将这些 x 和 y 的集合绘制到同一个图上。有没有一种好的编程方式来做到这一点?那么是否还有一种很好的方法来确保每条线(将有 100 条)颜色不同/彼此可区分?
我想过做一个循环,将每个值元组的第一个打包成一个字典中的键值对,然后将所有这些字典绘制在一个图表上,但不完全确定它的语法。
非常感谢!
编辑
在评论中添加OP给出的代码:
with open('BANDS.OUT', 'r') as f:
lines = f.readlines()
x = [float(line.split()[0]) for line in lines]
y = [float(line.split()[1]) for line in lines]
【问题讨论】:
-
"将第一行数据匹配到第一行(匹配一行...到同一行?)该列(哪一列?!)的值发生了变化(变化比较什么?)” - 你能澄清一下吗?
-
我添加了一些编辑来显示数据,因此更清晰一些。基本上我希望第一行(0 -3.2101962802476773)进入一个字典,其中第一行 x 已更改(1 -3.2098593700677056)等等,然后对从 0 开始的第二行重复该操作,然后继续。那有意义吗?很难用文字解释!
-
好的,那么您编写了哪些代码来执行此操作以及您究竟卡在哪里?
-
到目前为止,我有
with open('BANDS.OUT', 'r') as f: lines = f.readlines() x = [float(line.split()[0]) for line in lines] y = [float(line.split()[1]) for line in lines]我一直在编写循环,该循环为 x 和 y 的每一行建立索引,以匹配正确的值。 (对不起格式) -
为什么不用pandas来读取这个文件呢?
pd.read_csv('path/to/file.txt', sep='\t')见answer 快速绘图。
标签: python matplotlib gnuplot