| import os |
| import pandas as pd |
| import numpy as np |
|
|
| from sklearn.linear_model import LinearRegression |
|
|
| import plotly.graph_objects as go |
| from plotly.subplots import make_subplots |
|
|
| rangeLabel_col = ["MW_range", "PSA_range", "NRB_range", "HBA_range", "HBD_range", "LogP_range"] |
| superscript_map = { |
| 0: "\u2070", |
| 1: "\u00B9", |
| 2: "\u00B2", |
| 3: "\u00B3", |
| 4: "\u2074", |
| 5: "\u2075", |
| 6: "\u2076", |
| 7: "\u2077", |
| 8: "\u2078", |
| 9: "\u2079" |
| } |
|
|
|
|
| def draw_plot(result_path:str, save_path:str): |
| |
| |
| df_plot = pd.read_csv(result_path) |
| labels, predict = df_plot['Clint'], df_plot['predict'] |
| x_ax = list(range(len(labels))) |
|
|
| fig = make_subplots(rows=2, cols=1) |
|
|
| fig.add_trace(go.Scatter(x=x_ax, y=labels, |
| mode='lines', |
| name='labels', |
| legendgroup="1"), row=1, col=1) |
| fig.add_trace(go.Scatter(x=x_ax, y=predict, |
| mode='lines', |
| name='predicted', |
| legendgroup="1"), row=1, col=1) |
|
|
|
|
| |
| model = LinearRegression().fit(np.array(labels).reshape(-1,1), (np.array(predict))) |
| y_hat = model.predict(np.array(labels).reshape(-1,1)) |
|
|
| fig.add_trace(go.Scatter(x=labels, y=predict, |
| mode='markers', |
| legendgroup="2"), row=2, col=1) |
|
|
| fig.add_trace(go.Scatter(x=labels, y=y_hat, |
| mode="lines", |
| name="trend line", |
| line=dict(shape="linear", color="red", width=2, dash="dot"), |
| legendgroup="2"), row=2, col=1) |
|
|
|
|
| ideal_list = list(range(-1, int(max(labels)) + 3)) |
| ideal_x, ideal_y = ideal_list, ideal_list |
|
|
| ideal_x_rev = ideal_x[::-1] |
| ideal_y_uper,ideal_y_lower = [val+1 for val in ideal_y], [val-1 for val in ideal_y] |
| ideal_y_lower = ideal_y_lower[::-1] |
|
|
| ideal_y_uper_dot,ideal_y_lower_dot = [val+0.5 for val in ideal_y], [val-0.5 for val in ideal_y] |
| ideal_y_lower_dot = ideal_y_lower_dot[::-1] |
|
|
| fig.add_trace(go.Scatter(x=ideal_x, y=ideal_y, |
| mode="lines", |
| name="ideal", |
| line=dict(shape="linear", color="black", width=2, dash="dot"), |
| legendgroup="2"), row=2, col=1) |
|
|
| fig.add_trace(go.Scatter(x=ideal_x + ideal_x_rev, y=ideal_y_uper + ideal_y_lower, |
| mode="lines", |
| name="margin 1", |
| line=dict(shape="linear", color='rgba(231,107,243,0.8)', width=2, dash="dashdot"), |
| legendgroup="2"), row=2, col=1) |
|
|
| fig.add_trace(go.Scatter(x=ideal_x + ideal_x_rev, y=ideal_y_uper_dot + ideal_y_lower_dot, |
| mode="lines", |
| name="margin 2", |
| line=dict(shape="linear", color='rgba(0,176,246,0.8)', width=2, dash="dash"), |
| legendgroup="2"), row=2, col=1) |
|
|
| fig.update_layout( |
| height=800, |
| width=800, |
| title_text="Compare Observed Clint to Prediction results", |
| xaxis1_title = 'Data Length', |
| yaxis1_title = 'Clint_logScale', |
| xaxis2_title = 'Observed', |
| yaxis2_title = 'Predicted', |
| legend_tracegroupgap = 320, |
| xaxis2_range=[-0.5, int(max(labels)) + 1], |
| yaxis2_range=[-0.5, int(max(labels)) + 1], |
| ) |
| |
| |
| fig.write_image(save_path) |
|
|
|
|
| def draw_boundaryplot(df_plot:pd.DataFrame, save_path:str, df_duplData:pd.DataFrame = None): |
| labels, predict = np.expm1(df_plot["Clint"]), np.expm1(df_plot["predict"]) |
| labels, predict = np.log10(labels), np.log10(predict) |
|
|
| |
| |
| variance_list =[abs(data - labels[idx])/predict.mean() for idx, data in enumerate(predict)] |
| df_plot["variance"] = variance_list |
|
|
| variance_boundary = 0.5 |
| in_labels, in_predict = df_plot[df_plot["variance"] <= variance_boundary]['Clint'], df_plot[df_plot["variance"] <= variance_boundary]['predict'] |
| out_labels, out_predict = df_plot[df_plot["variance"] > variance_boundary]['Clint'], df_plot[df_plot["variance"] > variance_boundary]['predict'] |
|
|
| x_extended = np.linspace(df_plot['Clint'].min() - 1, df_plot['Clint'].max() + 1, 200) |
|
|
| grad, bias = np.polyfit(labels, predict, 1) |
| yhat = grad* x_extended + bias |
|
|
| in_grad, in_bias = np.polyfit(in_labels, in_predict, 1) |
| in_yhat = in_grad* x_extended + in_bias |
|
|
| |
| scatter = go.Scatter(x=labels, y=predict, |
| mode='markers', |
| name="Predict_point") |
|
|
| out_scatter = go.Scatter(x=out_labels, y=out_predict, |
| mode='markers', |
| name="out_bound", |
| ) |
|
|
| trend_line = go.Scatter(x=x_extended, y=yhat, |
| mode="lines", |
| name="trend line", |
| line=dict(shape="linear", color="red", width=2, dash="dot")) |
|
|
| in_trend_line = go.Scatter(x=x_extended, y=in_yhat, |
| mode="lines", |
| name="in-variance trend line", |
| line=dict(shape="linear", color="olive", width=2, dash="dot")) |
|
|
| |
| ideal_list = list(range(-1, int(max(labels)) + 3)) |
| ideal_x, ideal_y = ideal_list, ideal_list |
|
|
| ideal_line = go.Scatter(x=ideal_x, y=ideal_y, |
| mode="lines", |
| name="ideal", |
| line=dict(shape="linear", color="black", width=2)) |
| |
| |
| |
| fold2_top = [x + np.log10(2.0) for x in ideal_list] |
| fold2_bottom = [x - np.log10(2.0) for x in ideal_list] |
|
|
| fold2_topline = go.Scatter(x=ideal_list, y=fold2_top, |
| mode="lines", |
| name="2-fold", |
| line=dict(shape="linear", color="black", width=2, dash="dash")) |
| fold2_bottomline = go.Scatter(x=ideal_list, y=fold2_bottom, |
| mode="lines", |
| name="2-fold", |
| showlegend =False, |
| line=dict(shape="linear", color="black", width=2, dash="dash")) |
|
|
|
|
| fold5_top = [x + np.log10(5.0) for x in ideal_list] |
| fold5_bottom = [x - np.log10(5.0) for x in ideal_list] |
|
|
| fold5_topline = go.Scatter(x=ideal_x, y=fold5_top, |
| mode="lines", |
| name="5-fold", |
| line=dict(shape="linear", color="black", width=2, dash="dot")) |
| fold5_bottomline = go.Scatter(x=ideal_x, y=fold5_bottom, |
| mode="lines", |
| name="5-fold", |
| showlegend =False, |
| line=dict(shape="linear", color="black", width=2, dash="dot")) |
|
|
| fig = go.Figure(data=[scatter, out_scatter, trend_line, in_trend_line, ideal_line, |
| fold2_topline, fold2_bottomline, fold5_topline, fold5_bottomline]) |
|
|
| axis_map = [f'10{superscript_map[0]}', f'10{superscript_map[1]}', f'10{superscript_map[2]}', f'10{superscript_map[3]}'] |
|
|
| |
| fig.update_xaxes(title_text='Observed Clint', title_font=dict(size=18)) |
|
|
| |
| fig.update_yaxes(title_text='Predicted Clint', title_font=dict(size=18)) |
|
|
| fig.update_layout( |
| height=800, |
| width=900, |
| title_text="", |
| legend=dict(font=dict(size=16)), |
| legend_tracegroupgap = 320, |
| xaxis_range=[0.0, int(max(labels)) + 1], |
| yaxis_range=[0.0, int(max(labels)) + 1], |
| plot_bgcolor='white', |
| xaxis=dict( |
| showgrid=True, |
| gridcolor='lightgrey', |
| tickfont=dict(size=18), |
| tickvals = [0.0, 1.0, 2.0, 3.0], |
| ticktext = axis_map, |
| gridwidth=1, |
| griddash='dash', |
| linecolor='black', |
| linewidth=2, |
| ), |
| yaxis=dict( |
| showgrid=True, |
| gridcolor='lightgrey', |
| gridwidth=1, |
| tickfont=dict(size=18), |
| tickvals = [0.0, 1.0, 2.0, 3.0], |
| ticktext = axis_map, |
| griddash='dash', |
| linecolor='black', |
| linewidth=2, |
| ) |
| ) |
|
|
| fig.write_image(save_path) |
| |
| return grad, in_grad |
| |
|
|
|
|
| def draw_boxplot(result_path:str, save_path:str): |
| |
| x_axisName = ["molecular weight", "PSA", "Number of Rotatable Bonds", |
| "Number of Hydrogen-Bond Acceptors", "Number of Hydrogen-Bond Donors", "LogP"] |
| |
| df_plot = pd.read_csv(result_path) |
| y_labels, y_predict = df_plot['Clint'], df_plot['predict'] |
| fig = make_subplots(rows=3, cols=2) |
|
|
| for idx, axisName in enumerate(x_axisName): |
| x_labels, x_predict = df_plot[rangeLabel_col[idx]], df_plot[rangeLabel_col[idx]] |
| row_numb, col_numb = (idx // 2) + 1, (idx % 2) + 1 |
|
|
| fig.add_trace(go.Box(x=x_labels, y=y_labels, |
| name="Label", |
| jitter=0.3, |
| pointpos=-1.8, |
| boxpoints='all', |
| marker_color='rgb(7,40,89)', |
| line_color='rgb(7,40,89)', |
| legendgroup="1"), row=row_numb, col=col_numb) |
| |
| fig.add_trace(go.Scatter(x=x_predict, y=y_predict, |
| name="Prediction", |
| jitter=0.3, |
| pointpos=-1.8, |
| boxpoints='all', |
| marker_color='rgb(7,40,89)', |
| line_color='rgb(7,40,89)', |
| legendgroup="1"), row=row_numb, col=col_numb) |
| |
| fig.update_xaxes(title_text=x_axisName[idx], row=row_numb, col=col_numb) |
| fig.update_yaxes(title_text='Intrinsic CL(Log Scale)', row=row_numb, col=col_numb) |
|
|
|
|
| fig.update_layout( |
| height=800, |
| width=800, |
| title_text="Compare Observed Clint to Prediction results", |
| legend_tracegroupgap = 320, |
| ) |
| |
| |
| fig.write_image(save_path) |