Python 使用matplotlib以异常方式组织的打印数据
我有一个代码库的输出,它在材料中产生“带”的能量。数据以左手列表示索引,第二列表示能量。当我在GNUplot中绘制它时,我得到: 文本文件中的数据组织如下:Python 使用matplotlib以异常方式组织的打印数据,python,matplotlib,gnuplot,Python,Matplotlib,Gnuplot,我有一个代码库的输出,它在材料中产生“带”的能量。数据以左手列表示索引,第二列表示能量。当我在GNUplot中绘制它时,我得到: 文本文件中的数据组织如下: 0 -3.2101962802476773 0 -3.2101962802476773 0 -3.2101962802476773 0 -2.8612484511071283 0 -2.8612484511071212 0 -2.855472070340414 0 -2.855472070340414 0
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条)具有不同的颜色/可相互区分 我想做一个循环,将每个值元组的第一个打包成一个dict中的键值对,然后将所有这些dict绘制在一个图上,但不完全确定其语法 非常感谢你 编辑 在注释中添加OP给出的代码:
打开('BANDS.OUT','r')作为f:
行=f.读行()
x=[float(line.split()[0])表示行中的行]
y=[float(line.split()[1])表示行中的行]
在将数据帧加载为df后尝试以下操作(希望我正确理解了您的重新排列):
然后,您可以将df_转换为新数据并绘制数据。“将第一行数据与第一行匹配(将一行…与同一行匹配?)该列(哪列?!)的值发生了变化(与什么相比发生了变化?”)-您能澄清一下吗?我添加了一些编辑以显示数据,使其更加清晰。基本上,我希望第一行(0-3.2101962802476773)进入一个dict,第一行x发生了变化(1-3.2098593700677056),依此类推,然后对第二行重复这个过程,从0开始,继续。这有意义吗?文字很难解释!好的,那么您编写了什么代码来实现这一点,以及您到底被困在了哪里?到目前为止,我已经将open('BANDS.OUT','r')作为f:lines=f.readlines()x=[float(line.split()[0])表示行内行]y=[float(line.split()[1])表示行内行]我一直在写一个循环,该循环对x和y的每一行进行索引,使它们彼此匹配正确的值。(抱歉格式化)为什么不使用熊猫来读取此文件
pd.read\u csv('path/to/file.txt',sep='\t')
查看此快速绘图。这似乎有效!谢谢
df.columns=['x','y']
df_new=pd.DataFrame()
lendf = len(df['x'].drop_duplicates())
for i in range(0, lendf):
df_new = pd.concat([df_new,df[df['x'] == i].reset_index(drop = True)], axis=1,ignore_index=True)
df_new.drop(df_new.columns[i],axis=1, inplace=True)
df_new.columns = [i for i in range(0, lendf)]