Environmental Fate: Bioconcentration Classification (BCF_c) Dashboard

DrugBank database
MolPort database
Python script number 113 to build the frequency distribution graph of the BCF_c 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 (BCF_c)
datos_crudos = """Bin Center	% Frequency
0	40
0.05	25.859872611465
0.1	11.6348195329087
0.15	6.62420382165605
0.2	5.43524416135881
0.25	2.84501061571125
0.3	2.25053078556263
0.35	1.65605095541401
0.4	1.18895966029724
0.45	0.721868365180467
0.5	0.679405520169851
0.55	0.382165605095541
0.6	0.212314225053079
0.65	0.212314225053079
0.7	0.212314225053079
0.75	0.0424628450106157
0.8	0
0.85	0.0424628450106157
0.9	0
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
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('Bioconcentration Probability (BCF > 1000 L/kg)', fontsize=12)
plt.ylabel('% Frequency', fontsize=12)
plt.title('Environmental Fate: Bioconcentration Classification (BCF_c)', fontsize=14)

legend_elements = [
    Patch(facecolor=mcolors.to_rgba('#008000', 0.6), edgecolor='#008000', label='Not Readily Bioconcentrated (< 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 Bioconcentration (> 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.1) 
plt.tight_layout()

plt.show()