mdapy_计算统计Voronoi——lammps后处理

本文:

  1. 计算统计Voronoi 体积
  2. 提取lammps输出文件粒子属性信息。
  3. 针对某一个列表进行频率统计分析。 

mdapy的安装参照如下连接:

mdapy的安装

一、计算提取出目标文件的 Voronoi 体积

import mdapy as mp
from collections import Counter
import matplotlib.pyplot as plt
import pandas as pd
from collections import Counter

# 注意必须要显式的指明运行平台, 否则会报错
mp.init('cpu')
## 导入文件
system = mp.System(filename='relaxing_50000.dump.gz',fmt='dump.gz')
# voronoi 计算设置
system.cal_voronoi_volume()
# 查看粒子属性
print(system.data.columns)
# 提取需要的信息
# print(system.data['id'][0])
df = system.data['id','voronoi_volume', 'voronoi_number', 'cavity_radius']
# 输出信息到终端
print(df)
## 将输出信息输出到文件,默认逗号分隔,separator改为' '空格分隔
df.write_csv('voronoi_volume.csv',separator=' ')  

得到的文件:voronoi_volume.csv,

其中主要有三项:多面体体积,配位数(邻居数),好像是空穴半径

二、对文件进行处理,统计多面体体积的频率分布,这里的统计区分原子类型。

# 分析 Voronoi 体积随原子类型的分布
data1 = system.data['type','voronoi_volume']
# 保留小数
point = 1
type_1_volume = [round(data1['voronoi_volume'][index],point) for index, value in enumerate(data1['type']) if value==1]
type_2_volume = [round(data1['voronoi_volume'][index],point) for index, value in enumerate(data1['type']) if value==2]

# 统计列表中相同元素的频率,此函数可以传递多个列表
def list_ditribution(*data_lists, labels=None, filename='list_distribution'):
    plt.figure(figsize=(10, 6))

    df1 = pd.DataFrame()
        # 检查labels参数是否传入,若未传入则默认为None
    if labels is None:
        labels = [f'List {i+1}' for i in range(len(data_lists))]
    # 遍历每个数据列表
    for index, (data_list, list_label) in enumerate(zip(data_lists, labels)):
        # 计算频次
        frequencies = Counter(data_list)
        total = len(data_list)

        # 计算频率百分比, 只是对列表进行操作
        percentages = {k: (v / total) * 100 for k, v in frequencies.items()}
        # 按照百分比重新给列表排序
        percentages_sorted = sorted(percentages.items())

        # 为当前数据集添加索引前缀,并保存数据
        list_values, list_percentages = zip(*percentages_sorted)

        # print('list_percentages:',sum(list_percentages))
        # 绘制折线图
        plt.plot(list_values, list_percentages, marker='o', label=list_label)

        df1[f'x{index + 1}'] = pd.Series(list_values)
        df1[f'y{index + 1}'] = pd.Series(list_percentages)

    plt.xlabel('Values')
    plt.ylabel('Percentage (%)')
    plt.title('Percentage of Each Value Across Lists')
    plt.legend()
    # 是否显示网格
    # plt.grid(True)

    # 保存数据到CSV文件
    df1.to_csv(filename+'.csv', index=False)
    print(df1)
    print(f'Data saved to {filename}.csv')
    plt.savefig(filename+'.png', dpi=600)  # 以300 DPI 保存图像
    print(f'Figure saved to {filename}.png')
    # 显示图表
    plt.show()
    
# 每个列表对应的曲线标签
labels = ['1', '2']
list_ditribution(type_1_volume,type_2_volume,labels=labels)

运算可以输出文件和图像 

 文件:list_distribution.csv

图像:list_distribution.png

三、完整的python代码:

import mdapy as mp
from collections import Counter
import matplotlib.pyplot as plt
import pandas as pd
from collections import Counter

# 注意必须要显式的指明运行平台, 否则会报错
mp.init('cpu')
## 导入文件
system = mp.System(filename='relaxing_50000.dump.gz',fmt='dump.gz')
# voronoi 计算设置
system.cal_voronoi_volume()
# 查看粒子属性
print(system.data.columns)
# 提取需要的信息
# print(system.data['id'][0])
df = system.data['id','voronoi_volume', 'voronoi_number', 'cavity_radius']
# 输出信息到终端
print(df)
## 将输出信息输出到文件,默认逗号分隔,separator改为' '空格分隔
df.write_csv('voronoi_volume.csv',separator=' ')  

# 分析 Voronoi 体积随原子类型的分布
data1 = system.data['type','voronoi_volume']
# 保留小数
point = 1
type_1_volume = [round(data1['voronoi_volume'][index],point) for index, value in enumerate(data1['type']) if value==1]
type_2_volume = [round(data1['voronoi_volume'][index],point) for index, value in enumerate(data1['type']) if value==2]

# 统计列表中相同元素的频率,此函数可以传递多个列表
def list_ditribution(*data_lists, labels=None, filename='list_distribution'):
    plt.figure(figsize=(10, 6))

    df1 = pd.DataFrame()
        # 检查labels参数是否传入,若未传入则默认为None
    if labels is None:
        labels = [f'List {i+1}' for i in range(len(data_lists))]
    # 遍历每个数据列表
    for index, (data_list, list_label) in enumerate(zip(data_lists, labels)):
        # 计算频次
        frequencies = Counter(data_list)
        total = len(data_list)

        # 计算频率百分比, 只是对列表进行操作
        percentages = {k: (v / total) * 100 for k, v in frequencies.items()}
        # 按照百分比重新给列表排序
        percentages_sorted = sorted(percentages.items())

        # 为当前数据集添加索引前缀,并保存数据
        list_values, list_percentages = zip(*percentages_sorted)

        # print('list_percentages:',sum(list_percentages))
        # 绘制折线图
        plt.plot(list_values, list_percentages, marker='o', label=list_label)

        df1[f'x{index + 1}'] = pd.Series(list_values)
        df1[f'y{index + 1}'] = pd.Series(list_percentages)

    plt.xlabel('Values')
    plt.ylabel('Percentage (%)')
    plt.title('Percentage of Each Value Across Lists')
    plt.legend()
    # 是否显示网格
    # plt.grid(True)

    # 保存数据到CSV文件
    df1.to_csv(filename+'.csv', index=False)
    print(df1)
    print(f'Data saved to {filename}.csv')
    plt.savefig(filename+'.png', dpi=600)  # 以300 DPI 保存图像
    print(f'Figure saved to {filename}.png')
    # 显示图表
    plt.show()
    
# 每个列表对应的曲线标签
labels = ['1', '2']
list_ditribution(type_1_volume,type_2_volume,labels=labels)

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值