Dermatological Safety: Photoinduced Toxicity Potential Dashboard

DrugBank database
MolPort database
Python script number 116 to build the frequency distribution graph of the Photoinduced_toxicity 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. PASTE YOUR DATA HERE (Photoinduced_toxicity)
datos_crudos = """Bin Center	% Frequency
0.0499999999999999	0.339702760084926
0.0999999999999999	4.28874734607219
0.15	5.9447983014862
0.2	7.72823779193206
0.25	8.61995753715499
0.3	8.49256900212314
0.35	7.89808917197452
0.4	7.13375796178344
0.45	6.45435244161359
0.5	5.81740976645435
0.55	7.68577494692144
0.6	6.79405520169851
0.65	7.09129511677282
0.7	5.9447983014862
0.75	5.18046709129512
0.8	2.76008492569002
0.85	1.44373673036093
0.9	0.382165605095541
0.95	0
1	0"""

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

for linea in lineas:
    b, f = linea.strip().split() 
    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.4 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 (WITH COMPARISON OF MODELS)

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('Photoinduced Toxicity Probability', fontsize=12)
plt.ylabel('% Frequency', fontsize=12)
plt.title('Dermatological Safety: Photoinduced Toxicity Potential', fontsize=14)

legend_elements = [
    Patch(facecolor=mcolors.to_rgba('#008000', 0.6), edgecolor='#008000', label='Non-Phototoxic (< 0.4)'),
    Patch(facecolor=mcolors.to_rgba('#FFD700', 0.6), edgecolor='#FFD700', label='Moderate Risk (0.4 - 0.7)'),
    Patch(facecolor=mcolors.to_rgba('#B22222', 0.6), edgecolor='#B22222', label='High Phototoxicity (> 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, 1.05)
plt.tight_layout()

plt.show()