Cellular Stress Response: Nrf2/ARE Activation Dashboard

DrugBank database
MolPort database
Python script number 92 to build the frequency distribution graph of the ARE parameter on DrugBank molecules.
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
from matplotlib.patches import Patch
import numpy as np
from scipy.interpolate import PchipInterpolator

# 1. Original Data (Antioxidant Response Element - ARE)
bins_are = np.array([0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0])
freq_are = np.array([14.23, 20.72, 10.74, 9.09, 6.07, 5.05, 4.67, 3.91, 3.10, 3.23, 2.63, 2.46, 2.00, 2.42, 2.46, 2.55, 1.95, 1.49, 1.02, 0.21, 0.0])

# 2. Statistical Calculations
mean_val = np.average(bins_are, weights=freq_are)

# PCHIP interpolation to capture the smooth curve and tail of the distribution
interpolator = PchipInterpolator(bins_are, freq_are)
x_fit = np.linspace(0, 1.0, 500)
y_fit = interpolator(x_fit)
y_fit = np.clip(y_fit, 0, None)

# 3. Color Function (Stress Probability Traffic Light)
def get_colors(bins):
    return ['#008000' if b < 0.4 else '#FFD700' if b <= 0.7 else '#B22222' for b in bins]
colors_hex = get_colors(bins_are)
face_colors = [mcolors.to_rgba(c, alpha=0.60) for c in colors_hex]
edge_colors = [mcolors.to_rgba(c, alpha=0.90) for c in colors_hex]

# 4. Create the chart
plt.figure(figsize=(7, 6))

# Draw bars and empirical curve
plt.bar(bins_are, freq_are, width=0.04, color=face_colors, edgecolor=edge_colors, linewidth=1.5, zorder=2)

# 5. Tags and Titles
plt.xlabel('ARE Pathway Activation Probability (Oxidative/Electrophilic Stress)', fontsize=12)
plt.ylabel('% Frequency', fontsize=12)
plt.title('Cellular Stress Response: Nrf2/ARE Activation', fontsize=14)

# 6. Structured Legend
legend_elements = [
    Patch(facecolor=mcolors.to_rgba('#008000', 0.6), edgecolor='#008000', label='Low Stress / Inert (< 0.4)'),
    Patch(facecolor=mcolors.to_rgba('#FFD700', 0.6), edgecolor='#FFD700', label='Moderate ROS Inducer (0.4 - 0.7)'),
    Patch(facecolor=mcolors.to_rgba('#B22222', 0.6), edgecolor='#B22222', label='High Oxidative Stress (> 0.7)')
]
plt.legend(handles=legend_elements, loc='upper right', framealpha=0.95, fontsize=10)

plt.grid(axis='y', linestyle=':', alpha=0.7, zorder=0)
plt.xlim(-0.05, 1.05)
plt.ylim(0, 24)
plt.tight_layout()

plt.show()