python - 使用 matplotlib 绘制以不同寻常的方式组织的数据
问题描述
我有一个代码库的输出,它在材料中产生“带”的能量。数据的组织方式是左列表示索引,第二列表示其能量。当我在 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]
解决方案
在将数据框加载为 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 并绘制数据。
推荐阅读
- mysql - 尝试通过选择删除时发生错误 #1241 - 操作数应包含 1 列
- javascript - 如何在 Angular 7 中加快上传速度?
- elasticsearch - 在 Logstash 级别读取 CSV 并根据提取的数据进行过滤
- c# - 在 Visual Studio 中处理多个项目
- xml - 如何创建通过读取 wpf 中的 xml 文件动态创建的按钮的单击事件?
- python - 更改线图中线段的颜色
- javascript - Ramda:记住并使用价值
- css - 响应式谷歌图表如何来自 iframe 标签?
- sql - 使用数据透视表将 SQL 查询转换为表
- c++ - 打印字符数组地址的正确方法