Cellular Stress Response: Heat Shock Element (HSE) Dashboard

DrugBank database
MolPort database
Python script number 94 to build the frequency distribution graph of the HSE 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. HSE data
datos_crudos = """Bin Center	% Frequency
0	48.1953290870488
0.05	23.3970276008493
0.1	10.1910828025478
0.15	5.1380042462845
0.2	3.26963906581741
0.25	2.63269639065817
0.3	1.52866242038217
0.35	1.23142250530786
0.4	1.10403397027601
0.45	1.06157112526539
0.5	0.467091295116773
0.55	0.59447983014862
0.6	0.467091295116773
0.65	0.339702760084926
0.7	0.254777070063694
0.75	0
0.8	0.0849256900212314
0.85	0.0424628450106157
0.9	0
0.95	0
1	0"""


# 2. PROCESSING
lineas = datos_crudos.strip().split('\n')[1:] 
bins_array = []
freq_array = []

for linea in lineas:
    b, f = linea.strip().split('\t') 
    bins_array.append(float(b))
    freq_array.append(float(f))

bins = np.array(bins_array)
freq = np.array(freq_array)
mean_val = np.average(bins, weights=freq)

interpolator = PchipInterpolator(bins, freq)
x_fit = np.linspace(min(bins), max(bins), 500)
y_fit = interpolator(x_fit)
y_fit = np.clip(y_fit, 0, None)

def get_colors(b_array):
    return ['#008000' if b < 0.3 else '#FFD700' if b <= 0.7 else '#B22222' for b in b_array]

colors_hex = get_colors(bins)
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]

# 3. CREATION OF THE GRAPH
plt.figure(figsize=(7, 6))

plt.bar(bins, freq, width=0.04, color=face_colors, edgecolor=edge_colors, linewidth=1.5, zorder=2)

# 4. LABELS AND TITLES
plt.xlabel('HSE Expression Potential', fontsize=12)
plt.ylabel('% Frequency', fontsize=12)
plt.title('Cellular Stress Response: Heat Shock Element (HSE)', fontsize=14)

legend_elements = [
    Patch(facecolor=mcolors.to_rgba('#008000', 0.6), edgecolor='#008000', label='Non-Toxic / Safe (< 0.3)'),
    Patch(facecolor=mcolors.to_rgba('#FFD700', 0.6), edgecolor='#FFD700', label='Moderate Stress (0.3 - 0.7)'),
    Patch(facecolor=mcolors.to_rgba('#B22222', 0.6), edgecolor='#B22222', label='High Cell 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, max(freq) * 1.15) 
plt.tight_layout()

plt.show()