Skillversitas

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.