使用Matplotlib画元素周期表

进行材料计算或者查询数据库时,我们有时候想了解或者想向别人展示计算或者查询的元素的分布状况,这个时候,我们可以使用元素周期表来直观地表示元素的分布状况。
pymatviz库内置了元素周期表功能,但它的文档写得很模糊,要看懂如何使用它的元素周期表功能,需要花费一段时间,反而不如直接使用Matplotlib来画元素周期表来的简单。
我们可以使用如下代码来画元素周期表:

1. 导入库并定义全局参数和函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator
from matplotlib.patches import Rectangle # 用于绘制矩形

plt.rcParams["lines.linewidth"] = 1
plt.rcParams["font.family"] = "times new roman"
# 设置公式字体为times new roman
plt.rcParams["font.serif"] = ["Times New Roman"]
plt.rcParams["mathtext.fontset"] = "stix" # 使用STIX字体,接近Times风格
# 元素周期表不需要坐标轴,所以其实下面两段可以不设置,但是设置了也没关系
plt.rcParams["xtick.direction"] = "in" # x轴刻度朝内
plt.rcParams["ytick.direction"] = "in" # y轴刻度朝内

def cm(x):
return x / 2.54 # 将cm转换为inch

2. 定义元素周期表

定义元素周期表的方式其实很简单,那就是使用一个二维数组来表示元素周期表。有字的位置是元素,没有字的位置是空格。然后可以使用plt.text()函数来在指定位置添加元素的名称。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 元素符号二维数组,描述周期表布局
element_symbols = [
['H', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'He'],
['Li', 'Be', '', '', '', '', '', '', '', '', '', '', 'B', 'C', 'N', 'O', 'F', 'Ne'],
['Na', 'Mg', '', '', '', '', '', '', '', '', '', '', 'Al', 'Si', 'P', 'S', 'Cl', 'Ar'],
['K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br', 'Kr'],
['Rb', 'Sr', 'Y', 'Zr', 'Nb', 'Mo', 'Tc', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd', 'In', 'Sn', 'Sb', 'Te', 'I', 'Xe'],
['Cs', 'Ba', '*', 'Hf', 'Ta', 'W', 'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'At', 'Rn'],
['Fr', 'Ra', '**', 'Rf', 'Db', 'Sg', 'Bh', 'Hs', 'Mt', 'Ds', 'Rg', 'Cn', 'Nh', 'Fl', 'Mc', 'Lv', 'Ts', 'Og'],
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''],
['', '', '*', 'La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm', 'Eu', 'Gd', 'Tb', 'Dy', 'Ho', 'Er', 'Tm', 'Yb', 'Lu'],
['', '', '**', 'Ac', 'Th', 'Pa', 'U', 'Np', 'Pu', 'Am', 'Cm', 'Bk', 'Cf', 'Es', 'Fm', 'Md', 'No', 'Lr']
]
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
# 创建图形和轴
fig, ax = plt.figure(figsize=(cm(20), cm(12))), plt.gca()
# 添加标题
ax.text(0.5, 1.05, 'Periodic Table', ha='center', va='center', transform=ax.transAxes, fontsize=14, fontweight='bold')

# 绘制元素周期表
for i, row in enumerate(element_symbols):
for j, symbol in enumerate(row):
if symbol and symbol not in ['*', '**']:
# 计算单元格位置
cell_x = j * 1.0
cell_y = -i * 1.0
color = '#F5F9FD'
edge_color = 'grey'
fontcolor = 'dimgrey'
# 绘制矩形
rect = Rectangle((cell_x, cell_y), 0.95, 0.95,
facecolor=color, edgecolor=edge_color, lw=1)
ax.add_patch(rect)
# 添加元素符号
ax.text(cell_x + 0.5, cell_y + 0.6, symbol,
ha='center', va='center', fontsize=9, fontweight='bold', color=fontcolor)

# 设置轴范围和隐藏坐标轴
ax.set_xlim(-0.5, 18.5) # 如果你的元素周期表显示不全,请尝试修改x、y范围
ax.set_ylim(-9.5, 1)
ax.axis('off')

结果:
元素周期表