首页 > 解决方案 > 使用 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   -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 中的键值对,然后将所有这些 dicts 绘制在一个图表上,但不完全确定它的语法。

非常感谢!

编辑

在评论中添加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]

标签: pythonmatplotlibgnuplot

解决方案


在将数据框加载为 df 后尝试此操作(我希望我正确理解了您的重新排列):

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)]

然后您可以转置 df_new 并绘制数据。


推荐阅读