import matplotlib.pyplot as plt
import matplotlib
import pandas as pd
import numpy as np
from math import pi
from chembee.utils.file_utils import prepare_file_name_saving
from chembee.datasets.DataSet import DataSet
matplotlib.rcParams.update({"font.size": 32})
fig = plt.figure(figsize=(15, 15))
[docs]def polar_plot(data_set: DataSet, file_name: str, prefix: str):
"""
The polar_plot function creates a polar plot of the lipinski parameters.
It takes in a dataframe and file name as input, and outputs a png file with the
polar plot.
:param data_set:pd.DataFrame: Used to Set the data that will be plotted.
:param file_name:str: Used to Create a directory for each molecule.
:param prefix:str: Used to Determine the name of the file.
:return: The figure object.
:doc-author: Julian M. Kleber
"""
data_set_name = data_set.name
data_set = data_set.data
data = pd.DataFrame()
# calculate normalized lipinski
data["MolWt"] = [i / 500 for i in data_set["MolWt"]]
data["LogP"] = [i / 5 for i in data_set["LogP"]]
data["HBA"] = [i / 10 for i in data_set["NumHAcceptors"]]
data["HBD"] = [i / 5 for i in data_set["NumHDonors"]]
data["RotB"] = [i / 10 for i in data_set["NumRotatableBonds"]]
data["TPSA"] = [i / 140 for i in data_set["TPSA"]]
categories = list(
data.columns
) # This will set up the parameters for the angles of the radar plot.
N = len(categories)
values = data[categories].values[0]
values = np.append(values, values[:1])
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1]
Ro5_up = [1, 1, 1, 1, 1, 1, 1] # The upper limit for bRo5
Ro5_low = [0.5, 0.1, 0, 0.25, 0.1, 0.5, 0.5] # The lower limit for bRo5
# fig=plt.figure()
fig, ax = plt.subplots(subplot_kw={"projection": "polar"})
plt.xticks(
angles[:-1],
categories,
color="k",
size=20,
ha="center",
va="top",
fontweight="book",
)
plt.tick_params(axis="y", width=4, labelsize=12, grid_alpha=0.05)
ax.set_rlabel_position(0)
# ax.fill(angles, Ro5_up, 'red', alpha=0.2)
ax.fill(angles, Ro5_low, "orangered", alpha=0.2)
mean_vals = data.mean().to_list()
mean_vals = np.append(mean_vals, mean_vals[:1])
for i in data.index[:]:
values = data[categories].values[i]
values = np.append(values, values[:1])
ax.plot(angles, values, linewidth=0.7, color="steelblue", alpha=0.5)
# ax.fill(angles, values, 'C2', alpha=0.025)
ax.plot(angles, mean_vals, linewidth=2, linestyle="--", color="red")
ax.plot(angles, Ro5_up, linewidth=2, linestyle="-", color="black")
ax.plot(angles, Ro5_low, linewidth=2, linestyle="-", color="black")
ax.grid(axis="y", linewidth=1.5, linestyle="dotted", alpha=0.8)
ax.grid(axis="x", linewidth=2, linestyle="-", alpha=1)
file_name = prepare_file_name_saving(
prefix=prefix, file_name=file_name, ending=".png"
)
fig.tight_layout()
plt.savefig(file_name)