F20 Bioavailability Distribution Dashboard

DrugBank database
MolPort database
Python script number 23 to build the frequency distribution graph of the F20 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. F20 Data (Probability)
x = [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 = [1.01, 1.29, 1.62, 1.66, 1.94, 2.31, 2.55, 2.55, 2.95, 3.11, 
     2.87, 3.28, 3.96, 4.53, 5.06, 7.52, 10.32, 12.26, 19.66, 9.55]

# 2. Curve smoothing (Spline)
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 F20)
colors = []
for val in x:
    # Very high probability of exceeding 20%
    if val >= 0.7:
        colors.append('green')
    # Low probability (High risk of F < 20%)
    elif val <= 0.3:
        colors.append('firebrick')
    # intermediate 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 > 20% (F20 Score)', fontsize=12)
plt.ylabel('% Frequency', fontsize=12)
plt.title('F20 Bioavailability Distribution', fontsize=14)

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

# 6. Vertical Legend (LEFT)
legend_elements = [
    Patch(facecolor='green', edgecolor='black', alpha=0.7, label='Likely F > 20% (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 < 20% (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()