Oral Bioavailability (F50) Distribution Dashboard

DrugBank database
MolPort database
Python script number 21 to build the frequency distribution graph of the F50 parameter on DrugBank molecules.
import matplotlib.pyplot as plt
from matplotlib.patches import Patch
import numpy as np
from scipy.interpolate import make_interp_spline

# 1. Bioavailability F data
x = [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]

# Frequencies in %
y = [0.28, 2.87, 4.73, 4.85, 4.49, 4.69, 4.41, 5.22, 4.33, 4.37, 5.46, 
     5.38, 4.73, 5.46, 5.38, 6.47, 6.67, 6.35, 7.77, 5.38, 0.69]

# 2. Curve smoothing
x_smooth = np.linspace(min(x), max(x), 300)
spl = make_interp_spline(x, y, k=3)
y_smooth = spl(x_smooth)
y_smooth = [val if val > 0 else 0 for val in y_smooth] # Limpieza

# 3. Define colors (Traffic Light F50)
colors = []
for val in x:
    # High (> 0.5)
    if val > 0.5:
        colors.append('green')
    # Low (< 0.3)
    elif val < 0.3:
        colors.append('firebrick')
    # Average (0.3 - 0.5)
    else:
        colors.append('gold')

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

# A. Bars
plt.bar(x, y, width=0.04, color=colors, edgecolor='black', alpha=0.7, label='Data Frequency')

# 5. Tags and Titles
plt.xlabel('Oral Bioavailability Fraction (F) [0-1]', fontsize=12)
plt.ylabel('% Frequency', fontsize=12)
plt.title('Oral Bioavailability Distribution', fontsize=14)

# Axle settings
plt.xticks(np.arange(0, 1.1, 0.1))
plt.xlim(-0.05, 1.05)
plt.ylim(0, 9) 

# 6. Vertical Legend (Left so as not to cover the high bars)
legend_elements = [
    Patch(facecolor='green', edgecolor='black', alpha=0.7, label='High Bioavailability (> 50%)'),
    Patch(facecolor='gold', edgecolor='black', alpha=0.7, label='Medium (30% - 50%)'),
    Patch(facecolor='firebrick', edgecolor='black', alpha=0.7, label='Low Bioavailability (< 30%)')
]

plt.legend(handles=legend_elements, loc='upper left', ncol=1, framealpha=0.9)

plt.grid(axis='y', linestyle='--', alpha=0.5)
plt.tight_layout()

plt.show()