本文:
- 计算统计Voronoi 体积
- 提取lammps输出文件粒子属性信息。
- 针对某一个列表进行频率统计分析。
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)