Phenotype Microarray
Phenotype microarrays (Biolog GN/MT plates) measure microbial growth across dozens of carbon sources at time points. Biopython includes tooling (Bio.Phylo's microarray helpers and Bio.Phenotype concepts in tutorials) to read plate data, normalize time courses, and compare metabolic profiles between strains - a classic "table in, profiles out" workflow.
The Data Shape
A typical plate file has rows for wells (substrates) and columns for time points, with a tetrazolium absorbance value per cell. Substrates are labeled (e.g., "ABC1" = specific carbon source); blanks and controls are separate wells.
Loading Plate Data
import pandas as pd
df = pd.read_csv("plate_data.csv", index_col=0)
print(df.shape) # wells x time points
print(df.columns[:5]) # time points (hours)
print(df.index[:5]) # substrate codes
Normalizing Time Courses
# subtract blank/control background
blank = df.loc[["blank1", "blank2"]].mean(axis=0)
df_norm = df.drop(index=["blank1", "blank2"]).sub(blank, axis=1)
# growth index: max minus baseline per substrate
baseline = df_norm.iloc[:, :3].mean(axis=1)
growth = (df_norm.max(axis=1) - baseline).round(3)
print(growth.sort_values(ascending=False).head(10))
Comparing Strains
# two strains' growth profiles, side by side
a = pd.read_csv("strain_a.csv", index_col=0).max(axis=1)
b = pd.read_csv("strain_b.csv", index_col=0).max(axis=1)
comp = pd.DataFrame({"strain_a": a, "strain_b": b}).dropna()
comp["diff"] = (comp.strain_a - comp.strain_b).round(3)
print(comp[abs(comp["diff"]) > 0.5].sort_values("diff"))
Visualizing Profiles
import matplotlib.pyplot as plt
top = growth.sort_values(ascending=False).head(12)
for substrate in top.index:
plt.plot(df_norm.loc[substrate], label=substrate)
plt.legend(fontsize=7, ncol=2)
plt.xlabel("time (h)"); plt.ylabel("absorbance")
plt.show()
Reading the Results
- High growth on a substrate = the organism can metabolize it.
- Differential substrates between strains point to metabolic differences (e.g., a knocked-out pathway).
- Always check controls: no-growth controls should stay flat, positive controls should grow.
Summary
Phenotype microarray analysis is a pandas workflow: load the well-by-time matrix, subtract blanks to normalize, compute a per-substrate growth index (max minus baseline), and compare strains by differential substrates. Plot the normalized time courses to verify patterns. It turns a plate scan into a metabolic capability profile.