0%

用 Python 绘制分析化学中的分布分数曲线图

前言

分布分数 δ 是分析化学中一个非常重要的概念,在处理酸碱平衡和配位平衡时,分布分数 δ-pH 曲线可以直观地看出平衡物质相对浓度与酸度和配体浓度之间的变化关系,并可以解释很多问题。具体的化学背景知识可以在 manual.pdf 里详细了解,这个文件在笔者提供的脚本文件下载压缩包中(见第三节)

具体实现

编写这个脚本使用了 Numpy 以及 Proplot、Matplotlib 等第三方库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import numpy as np
import proplot as pplt
import toml

from proplot import rc

# 设置绘图的默认参数,如字体、字号等
rc['font.name'] = "Arial"
rc['title.size'] = 14
rc['label.size'] = 12
rc['font.size'] = 10.5
rc['tick.width'] = 1.3
rc['meta.width'] = 1.3
rc['label.weight'] = 'bold'
rc['tick.labelweight'] = 'bold'
rc['ytick.major.size'] = 4.6
rc['ytick.minor.size'] = 2.5
rc['xtick.major.size'] = 4.6
rc['xtick.minor.size'] = 2.5


def calculate_deltas(pH, n, K):
"""
计算 n 元弱酸的分布分数 delta
:param pH: 体系的 pH 值
:param n: n 元弱酸
:param K: 解离平衡常数 K
:return: 返回分布分数 delta
"""
# 将 pH 转换为氢离子浓度 C
C = 10 ** (-pH)

# 首先计算 S(n),因为所有的分布分数的结果
S = np.sum([(C ** ((n + 1) - i)) * np.prod(K[:i - 1]) for i in range(1, n + 1)])

# 计算 F(n, i)
F = np.zeros(n + 1)
for i in range(n + 1):
F[i] = (C ** (n - i)) * np.prod(K[:i])

# 计算归一化的分布分数
distributions = F / S

return distributions


def plot_distribution_curve(n, K):
"""
绘制分布分数-pH曲线图
:param n: n 元弱酸
:param K: 解离平衡常数 K
"""
# 设置需要绘制的 pH 的范围为 0 ~ 14
pH_range = np.linspace(0, 14, 500)
# 初始化 distributions
distributions = np.zeros((n + 1, len(pH_range)))

# 计算每个 pH 值对应的分布分数
for i, pH in enumerate(pH_range):
distributions[:, i] = calculate_deltas(pH, n, K)

# 归一化分布分数
sum_distribution = np.sum(distributions, axis=0)
normalized_distributions = distributions / sum_distribution

# 创建实例
fig, ax = pplt.subplots(figsize=(5.4 * 0.9, 4 * 0.9), dpi=300)

# 如果想设置其他颜色循环可以使用 cycle 参数
# for i in range(n + 1):
# ax.plot(pH_range, normalized_distributions[i, :], label=f'δ{n}({i + 1})', cycle='bmh')
# 或者直接用 pplt.rc.cycle = '538' 调整 cycle 参数
# 如果想使用自定义颜色可以使用 color 参数
# color_list = ['填你想要的颜色']
# for i in range(n + 1):
# ax.plot(pH_range, normalized_distributions[i, :], label=f'δ{n}({i + 1})', color=color_list[i])

# 绘制分布曲线
for i in range(n + 1):
ax.plot(pH_range, normalized_distributions[i, :], label=f'δ{n}({i + 1})', linewidth=1.3)

# 设置图例
ax.legend(loc='ur', ncols=1, fontweight='bold', fontsize='12.5', frame=True)

# 格式化图像
fig.format(
grid=False, ylabel='Fraction', xlabel='pH Values',
xlim=(0, 14), xminorlocator=1, xlocator=2, ylim=(0, 1), yminorlocator=0.1, ylocator=0.2
)

# 显示图像
fig.show()

return fig, ax


# 读取 equilibrium.toml 中的数据
equilibrium = toml.load("equilibrium.toml")
# 将每一个 K 的 value 记录到一个 list K_values 中
K_values = [item['value'] for item in equilibrium.get("K")]

# 根据 K_values list 拿到 n
acid_num = len(K_values)
# 绘制图像
fig, ax = plot_distribution_curve(acid_num, K_values)

# 保存图像
fig.savefig("delta.png", dpi=400, bbox_inches="tight")

绘制效果

想要使用该脚本绘制分布分数曲线图,需要安装 Python 以及 Numpy、Matplotlib 等第三方模块库。请注意 Python 必须为 3.8 版本,如果不是 3.8 版本可能无法使用本脚本。因此笔者建议使用 Anaconda 虚拟环境安装。脚本下载地址:fraction.zip

1
conda create name myconda python=3.8

安装第三方模块库可以直接使用 pip 工具安装。如果安装失败,100% 是因为 Python 的版本不对所导致的。

1
pip install -r requirements

运行这个脚本需要一个 toml 文件,这个文件是主目录下的 equilibrium.toml,打开这个文件就知道需要配置什么内容,这里就不过多赘述了。

最后,运行这个脚本,如果是使用 Anaconda 虚拟环境安装的话,记得需要激活环境。

1
conda activate myconda 

激活环境后输入命令运行脚本,如果是直接用 Python 安装包安装的可以直接输入命令运行。

1
python distribution.py 

等待程序运行,运行成功后会在当前文件夹生成一个 delta.png 图片。

  • 本文作者: Hsiun YuBin
  • 本文链接: https://ikuns.icu/019/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!