【问题标题】:Plotting data that is organised in an unusual way with matplotlib [closed]使用 matplotlib 绘制以不寻常方式组织的数据 [关闭]
【发布时间】: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


【解决方案1】:

在将数据框加载为 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 并绘制数据。

【讨论】:

  • 这似乎奏效了!谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 2021-09-01
  • 2012-05-20
  • 2014-02-06
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多