Pourbaix Diagram
Contents
Pourbaix Diagram#
# import relevant modules
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
In this session, we will see how pourbaix diagrams (\(pe\)-\(pH\) dominance diagrams) are made and how to read and interpret them.
Pourbai diagrams show which species predominates in given \(pe\)-\(pH\) regions, i.e., the dominant species varies as a function of \(pe\) (i.e. mostly oxygen) and \(pH\) This affects the distribution and transport of elements in the world! The diagrams can also be applied to
Types of ores/minerals which are related to the environmental conditions when they were formed
Ore recovery
Pollutant transport
Elemental budgets
Batteries
Ecology
etc.
Consider a generic “half cell” reduction reaction including \(H^+\):
The equlibrium constant of this half-reaction can be written as:
Recall Nernst’s equation:
and the relationship between the Gibbs free energy (\(\Delta G\)) and \(E_{cell}\) of a redox reaction:
At equilibrium, \(Q = K\) and \(E_{cell} = 0\), so from the two equations we can derive the relationship between the equilibrium constant and standard voltage potential:
We are considering a reaction coupled with the hydrogen electrode, so \(E_{cell}^o = E_{h}^o\).
Substituting \(K\) of this half-reaction, we get:
By definition of \(p\) (e.g. \(pH = -\log a_{H^+}\)),
Dividing by \(n_e\), we get:
Recall from the lecture slide that \(pe^o = \frac{F}{2.303 RT}\cdot E_{h}^o\), so
If \(a_{Red} = a_{Ox}\), then:
which is a boundary (where the activities of two species are equal) in pourbaix diagrams. It is a linear equation (\(pe\) vs. \(pH\)) with slope = \(- \frac{n_H}{n_e}\) and y-intercept = \(pe^o\).
Next, we will consider the upper and lower limits of water in a pourbaix diagram.
(1) Consider the reduction of oxygen into water:
After some manipulations similar to the above, we get:
\(1\,atm\) is the maximum pressure in the atmosphere today, so we will assign \(P_{O_2} = 1\) (Actual \(P_{O_2} = 0.21\,atm\)), and \(pe^o = 20.75\)
is the equation representing the upper limit.
(2) Consider the reduction of hydrogen:
After some manipulations similar to the above, we get:
\(1\,atm\) is the maximum pressure in the atmosphere today, so we will assign \(P_{H_2} = 1\), and \(pe^o = 20.75\)
If we want to create a pourbaix diagram of an element in our environment, we need to have the information about all half-reactions involved. The plot below is the pourbaix diagram of \(Fe\)-\(H_2O\) system.
# name each ion by easy characters
# 3A = Fe^{3+}, 3B = Fe(OH)^{2+}, 3C = Fe(OH)_2^+, 3D = Fe(OH)_3, 3E = Fe(OH)_4^- # Fe oxidation number = +3
# 2A= Fe^{2+}, 2B = Fe(OH)^- # Fe oxidation number = +2
# pe-pH equations of each boundary - taken from https://slideplayer.com/slide/14759609/
# vertical boundaries
pH_3A_3B = 2.2
pH_3B_3C = 3.5
pH_3C_3D = 7.3
pH_3D_3E = 8.6
pH_2A_2B = 9.5
# horizontal and inclined boundaries
def pe_3A_2A(pH): return 13.0
def pe_3B_2A(pH): return 15.2 - pH
def pe_3C_2A(pH): return 18.7 - 2*pH
def pe_3D_2A(pH): return 26 - 3*pH
def pe_3E_2B(pH): return 25.1 - 3*pH
def pe_reduction_of_O(pH): return 20.75 - pH
def pe_reduction_of_H(pH): return - pH
# plot boundaries
plt.figure(figsize=(10,12)) # set figure
pH_range = [0, 14]
plt.plot(pH_range, pe_reduction_of_O(np.array(pH_range)) , 'r') # upper stability limit of water
plt.plot(pH_range, pe_reduction_of_H(np.array(pH_range)) , 'r') # lower stability limit of water
plt.plot([0, pH_3A_3B], [pe_3A_2A(0), pe_3A_2A(pH_3A_3B)], 'b') # 3A-2A
plt.plot([pH_3A_3B, pH_3A_3B], [pe_3A_2A(pH_3A_3B), pe_reduction_of_O(pH_3A_3B)], 'b') # 3A-3B
plt.plot([pH_3A_3B, pH_3B_3C], [pe_3B_2A(pH_3A_3B), pe_3B_2A(pH_3B_3C)], 'b') # 3B-2A
plt.plot([pH_3B_3C, pH_3B_3C], [pe_3B_2A(pH_3B_3C), pe_reduction_of_O(pH_3B_3C)], 'b') # 3B-3C
plt.plot([pH_3B_3C, pH_3C_3D], [pe_3C_2A(pH_3B_3C), pe_3C_2A(pH_3C_3D)], 'b') # 3C-2A
plt.plot([pH_3C_3D, pH_3C_3D], [pe_3C_2A(pH_3C_3D), pe_reduction_of_O(pH_3C_3D)], 'b') # 3C-3D
plt.plot([pH_3C_3D, pH_3D_3E], [pe_3D_2A(pH_3C_3D), pe_3D_2A(pH_3D_3E)], 'b') # 3D-2A
plt.plot([pH_3D_3E, pH_3D_3E], [pe_3D_2A(pH_3D_3E), pe_reduction_of_O(pH_3D_3E)], 'b') # 3D-3E
plt.plot([pH_2A_2B, pH_2A_2B], [pe_3E_2B(pH_2A_2B), pe_reduction_of_H(pH_2A_2B)], 'b') # 2A-2B
plt.plot([pH_2A_2B, 12.55], [pe_3E_2B(pH_2A_2B), pe_3E_2B(12.55)], 'b') # 3E-2B # pH=12.55 is where pe_reduction_of_H = pe_3E_2B
plt.plot([pH_3D_3E, pH_2A_2B], [pe_3D_2A(pH_3D_3E), pe_3E_2B(pH_2A_2B)], 'b') # 3D-2A
# label and title the plot
plt.xlabel('$pH$', fontsize=12)
plt.ylabel('$pe$', fontsize=12)
plt.xlim(pH_range)
plt.ylim([-15, 22])
plt.title('Pourbaix diagram of $Fe$ in water', fontsize=14)
# label each stability regions
plt.text(0.7, 16, '$Fe^{3+}$', fontsize=12)
plt.text(2.25, 15, '$Fe(OH)^{2+}$', fontsize=10)
plt.text(4.8, 12, '$Fe(OH)_2^+$', fontsize=12)
plt.text(7.35, 8, '$Fe(OH)_3$', fontsize=12)
plt.text(10.8, 2, '$Fe(OH)_4^-$', fontsize=12)
plt.text(3, 4, '$Fe^{3+}$', fontsize=12)
plt.text(9.6, -8.5, '$Fe(OH)^-$', fontsize=12)
plt.text(10, 18, '$P_{O_2}>1$', fontsize=14)
plt.text(4, -10, '$P_{H_2}>1$', fontsize=14)
Text(4, -10, '$P_{H_2}>1$')
References#
Farmer, M. (2019) GEOCHEMICAL METHODS FOR THE DETERMINATION OF DIFFERENT METAL SPECIES. https://slideplayer.com/slide/14759609/. (Accessed 28 September 2022).
Lecture slide for Lecture 5 of the Low-Temperature Geochemistry module