F30 Bioavailability Distribution Dashboard

DrugBank database
MolPort database
Python script number 22 to build the frequency distribution graph of the F30 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. F30 Data (Probability)
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.04, 1.74, 2.35, 2.71, 2.91, 2.75, 2.71, 3.48, 3.52, 3.64, 4.29, 
     3.64, 3.60, 4.98, 6.15, 6.96, 7.48, 8.29, 11.08, 12.99, 4.69]

# 2. Curve smoothing (Spline for asymmetric distribution)
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]

# 3. Define colors (Traffic Light F30)
colors = []
for val in x:
    # High probability of exceeding 30%
    if val >= 0.7:
        colors.append('green')
    # Low probability (Probably F < 30%)
    elif val <= 0.3:
        colors.append('firebrick')
    # Doubt zone
    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('Probability of Bioavailability > 30% (F30 Score)', fontsize=12)
plt.ylabel('% Frequency', fontsize=12)
plt.title('F30 Bioavailability Distribution', fontsize=14)

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

# 6. Vertical Legend (ON THE LEFT, because the data is on the right)
legend_elements = [
    Patch(facecolor='green', edgecolor='black', alpha=0.7, label='Likely F > 30% (Score > 0.7)'),
    Patch(facecolor='gold', edgecolor='black', alpha=0.7, label='Uncertain (Score 0.3 - 0.7)'),
    Patch(facecolor='firebrick', edgecolor='black', alpha=0.7, label='Likely F < 30% (Score < 0.3)')
]

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