Environmental Hazard: Vertebrate Ecotoxicity (Fish LC50)

DrugBank database
MolPort database
Python script number 103 to build the frequency distribution graph of the Fish_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 Fish_toxicity (Separated by tabs, including headers)
datos_crudos = """Bin Center	% Frequency
0.05	7.89808917197452
0.1	8.06794055201699
0.15	6.7515923566879
0.2	6.45435244161359
0.25	5.1380042462845
0.3	4.24628450106157
0.35	4.03397027600849
0.4	4.07643312101911
0.45	3.73673036093418
0.5	3.48195329087049
0.55	4.20382165605096
0.6	3.82165605095541
0.65	3.69426751592357
0.7	4.54352441613588
0.75	4.75583864118896
0.8	4.45859872611465
0.85	5.64755838641189
0.9	6.58174097664544
0.95	6.62420382165605
1	1.78343949044586"""

# 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)

# Statistical Calculations
mean_val = np.average(bins, weights=freq)

# PCHIP interpolation
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)

# Color Function (Ecotoxicity Traffic Light)
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
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('Fish Aquatic Toxicity Probability (LC50 < 100 ppm)', fontsize=12)
plt.ylabel('% Frequency', fontsize=12)
plt.title('Environmental Hazard: Vertebrate Ecotoxicity (Fish LC50)', fontsize=14)

legend_elements = [
    Patch(facecolor=mcolors.to_rgba('#008000', 0.6), edgecolor='#008000', label='Low Toxicity / Inert (< 0.4)'),
    Patch(facecolor=mcolors.to_rgba('#FFD700', 0.6), edgecolor='#FFD700', label='Moderate Hazard (0.4 - 0.7)'),
    Patch(facecolor=mcolors.to_rgba('#B22222', 0.6), edgecolor='#B22222', label='High Lethality Risk (> 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.ylim(0, max(freq) * 1.2) 
plt.tight_layout()

plt.show()