import pandas as pd import numpy as np import pylab as pl import plotly.express as px import plotly.graph_objects as go import gradio as gr import matplotlib.pyplot as plt from matplotlib.ticker import FormatStrFormatter import seaborn as sns from sklearn import linear_model def update_table(coordx,coordy,coordz,plotting_df): plotting_df = plotting_df[plotting_df['type'] != "User"] xx=plotting_df.columns[3] yy=plotting_df.columns[4] zz=plotting_df.columns[5] plotting_df=plotting_df.drop([xx,yy,zz], axis=1) to_merge=pd.concat([df['group'],df[coordx],df[coordy],df[coordz]],axis=1) #assumes already rounded df. will needto be rounded here if not plotting_df=plotting_df.merge(to_merge,how='left',on=['group']) return gr.update(value=plotting_df) def refresh(coordx,coordy,coordz): for coord in [coordx,coordy,coordz]: for jj in range(0,len(df[coord])): try: float(df[coord][jj]) df[coord][jj]=round(df[coord][jj],3) except: df[coord][jj]= "" df[coord][jj]= " " df[coord][jj]= "--" plotting_df=pd.concat([df['class'],df['type'],df['group'],df[coordx],df[coordy],df[coordz]],axis=1) return gr.update(value=plotting_df), gr.update(value=True),gr.update(value=True),gr.update(value=True) def plot(plotting_df,x_vals, y_vals, z_vals): #get error row IDs: x_errors=df.columns[(df.columns.get_loc(f'{x_vals}'))+1] y_errors=df.columns[(df.columns.get_loc(f'{y_vals}'))+1] z_errors=df.columns[(df.columns.get_loc(f'{z_vals}'))+1] to_merge=pd.concat([df['group'],df[x_errors],df[y_errors],df[z_errors]], axis=1) #if original df values must be used for plotting - would also add x,y,z_vals here, and drop them from temp_df - still merge on subgroup temp_df=plotting_df.merge(to_merge,how='left',on=['group']) #omits '-- from temporary plotting dfs temp_xyz = pd.DataFrame(columns=temp_df.columns) temp_xy = pd.DataFrame(columns=temp_df.columns) temp_yz = pd.DataFrame(columns=temp_df.columns) temp_zx = pd.DataFrame(columns=temp_df.columns) for index, row in temp_df.iterrows(): x = row[x_vals] y = row[y_vals] z = row[z_vals] if x != '--' and y != '--' and z != '--': temp_xyz = pd.concat([temp_xyz, row.to_frame().T]) if x != '--' and y != '--': temp_xy = pd.concat([temp_xy, row.to_frame().T]) if y != '--' and z != '--': temp_yz = pd.concat([temp_yz, row.to_frame().T]) if z != '--' and x != '--': temp_zx = pd.concat([temp_zx, row.to_frame().T]) temp_xyz.reset_index(drop=True, inplace=True) temp_xy.reset_index(drop=True, inplace=True) temp_yz.reset_index(drop=True, inplace=True) temp_zx.reset_index(drop=True, inplace=True) #get min and max for kde ranges: cols=[x_vals,y_vals,z_vals] temp_xyz.loc[:, cols] = temp_xyz.loc[:, cols].astype(float) min_x = temp_xyz[x_vals].min() max_x = temp_xyz[x_vals].max() min_y = temp_xyz[y_vals].min() max_y = temp_xyz[y_vals].max() min_z = temp_xyz[z_vals].min() max_z = temp_xyz[z_vals].max() #3D plot: markers={'Chon': 'circle', 'Iron': 'x', 'Acho': 'square', 'Plan': 'square', 'CAIs': 'diamond', 'User':'circle'}#, 'CI':'circle' fig0= px.scatter_3d(data_frame=temp_xyz,x=x_vals,y=y_vals, z=z_vals , color='class', color_discrete_map={'CC':'blue','CI':'#a4dded','NC':'red','Other':'green','NA':'#FFEF00'},symbol='type', symbol_map=markers, hover_name='group', hover_data={'class': False, 'type':False}) fig0.update_layout(template="none", showlegend=True, legend=dict(y=0.0, itemsizing="constant",title=""), modebar=dict(orientation='h'))#margin=dict(l=50, r=50, b=50, t=50), fig0.update_traces(marker=dict(size=5, line=dict(color='white', width=4))) fig0.update_traces(selector=dict(marker_color='#FFEF00'), marker=dict(line_color='black')) #x vs y: fig01=px.scatter(temp_xy,x=x_vals,y=y_vals, color='class',color_discrete_map={'CC':'blue','CI':'#a4dded','NC':'red','Other':'green','NA':'#FFEF00'},symbol='type', symbol_map=markers, hover_name='group', hover_data={'class': False, 'type':False}, error_x=x_errors, error_y=y_errors) fig01.update_layout(template="simple_white", showlegend=True, legend=dict(title='',y=1.0, xanchor="right",x=0.2, bgcolor='rgba(0,0,0,0)'), modebar=dict(orientation='h')) fig01.update_traces(marker=dict(size=9, line=dict(color='white', width=1)), error_x_width=0,error_y_width=0) fig01.update_traces(selector=dict(marker_color='#FFEF00'), marker=dict(line_color='black')) fig01.update_xaxes(mirror=True) fig01.update_yaxes(mirror=True) #hist1: palette = {'CC': '#0000FF', 'NC': '#FF0000', 'Other': '#00FF00'} df_yclean = temp_df[temp_df[y_vals] != "--"] #df_yclean[y_vals]=df_yclean[y_vals].astype(float) df_ydich=df_yclean[df_yclean['class'].isin(['CC','NC'])] hist1=plt.figure(figsize=(1.5,4.47),tight_layout=dict(pad=0.1)) sns.kdeplot(data=df_ydich, y=y_vals, hue='class', palette=palette, fill=True) plt.ylim(min_y-abs(min_y*0.23),max_y+abs(max_y*0.19)) #may need to be a factor of average y val, not min and max... plt.yticks([]) plt.ylabel('') plt.gca().xaxis.set_major_formatter(FormatStrFormatter('%.1f')) legend = plt.gca().get_legend() legend.set_title('') #y vs z: fig02=px.scatter(temp_yz,x=y_vals,y=z_vals, color='class',color_discrete_map={'CC':'blue','CI':'#a4dded','NC':'red','Other':'green','NA':'#FFEF00'},symbol='type',symbol_map=markers, hover_name='group', hover_data={'class': False, 'type':False}, error_x=y_errors, error_y=z_errors) fig02.update_layout(template="simple_white", showlegend=True, legend=dict(title='',y=1.0, xanchor="right",x=0.2, bgcolor='rgba(0,0,0,0)'), modebar=dict(orientation='h')) fig02.update_traces(marker=dict(size=9, line=dict(color='white', width=1)), error_x_width=0,error_y_width=0) fig02.update_traces(selector=dict(marker_color='#FFEF00'), marker=dict(line_color='black')) fig02.update_xaxes(mirror=True) fig02.update_yaxes(mirror=True) #hist2: df_zclean = temp_df[temp_df[z_vals] != "--"] #df_zclean[z_vals]=df_zclean[z_vals].astype(float) df_zdich=df_zclean[df_zclean['class'].isin(['CC','NC'])] hist2=plt.figure(figsize=(1.5,4.47),tight_layout=dict(pad=0.1)) sns.kdeplot(data=df_zdich, y=z_vals, hue='class', palette=palette, fill=True) plt.ylim(min_z-abs(min_z*0.23),max_z+abs(max_z*0.19)) plt.yticks([]) plt.ylabel('') plt.gca().xaxis.set_major_formatter(FormatStrFormatter('%.1f')) legend = plt.gca().get_legend() legend.set_title('') #z vs x: fig03=px.scatter(temp_zx,x=z_vals,y=x_vals, color='class',color_discrete_map={'CC':'blue','CI':'#a4dded','NC':'red','Other':'green','NA':'#FFEF00'},symbol='type', symbol_map=markers, hover_name='group', hover_data={'class': False, 'type':False}, error_x=z_errors,error_y=x_errors) fig03.update_layout(template="simple_white", showlegend=True, legend=dict(title='',y=1.0, xanchor="right",x=0.2, bgcolor='rgba(0,0,0,0)'), modebar=dict(orientation='h')) fig03.update_traces(marker=dict(size=9, line=dict(color='white', width=1)), error_x_width=0,error_y_width=0) fig03.update_traces(selector=dict(marker_color='#FFEF00'), marker=dict(line_color='black')) fig03.update_xaxes(mirror=True) fig03.update_yaxes(mirror=True) #hist3: df_xclean = temp_df[temp_df[x_vals] != "--"] #df_xclean[x_vals]=df_xclean[x_vals].astype(float) df_xdich=df_xclean[df_xclean['class'].isin(['CC','NC'])] hist3=plt.figure(figsize=(1.5,4.47),tight_layout=dict(pad=0.1)) sns.kdeplot(data=df_xdich, y=x_vals, hue='class',palette=palette, fill=True) plt.ylim(min_x-abs(min_x*0.23),max_x+abs(max_x*0.19)) plt.yticks([]) plt.ylabel('') plt.gca().xaxis.set_major_formatter(FormatStrFormatter('%.1f')) legend = plt.gca().get_legend() legend.set_title('') return gr.update(value=fig0, visible=True),gr.update(value=fig01, visible=True),gr.update(value=fig02, visible=True),gr.update(value=fig03, visible=True), gr.update(value=hist1, visible=True),gr.update(value=hist2, visible=True),gr.update(value=hist3, visible=True), fig01,fig02,fig03 def cc_checkbox_check(plotting_df,CC_check, x_vals,y_vals,z_vals): temp_columns=df[['class','type','group',x_vals,y_vals,z_vals]] temp_df=pd.concat([temp_columns],axis=1) plotting_df=plotting_df[plotting_df['class']!='CC'] if CC_check==False: return plotting_df else: plotting_df=pd.concat([plotting_df,temp_df[temp_df['class']=='CC']], axis=0) return plotting_df def nc_checkbox_check(plotting_df,NC_check, x_vals,y_vals,z_vals): temp_columns=df[['class','type','group',x_vals,y_vals,z_vals]] temp_df=pd.concat([temp_columns],axis=1) plotting_df=plotting_df[plotting_df['class']!='NC'] if NC_check==False: return plotting_df else: plotting_df=pd.concat([plotting_df,temp_df[temp_df['class']=='NC']], axis=0) return plotting_df def other_checkbox_check(plotting_df,Other_check, x_vals,y_vals,z_vals): temp_columns=df[['class','type','group',x_vals,y_vals,z_vals]] temp_df=pd.concat([temp_columns],axis=1) plotting_df=plotting_df[plotting_df['class']!='Other'] if Other_check==False: return plotting_df else: plotting_df=pd.concat([plotting_df,temp_df[temp_df['class']=='Other']], axis=0) return plotting_df def updateAdd_xchange(x,add_data): headers=add_data.columns if x in headers: return gr.update(value=add_data) else: new_col = pd.DataFrame(columns=[x], index=add_data.index) add_data=pd.concat([add_data,new_col],axis=1) return gr.update(value=add_data) def updateAdd_ychange(y,add_data): headers=add_data.columns if y in headers: return gr.update(value=add_data) else: new_col = pd.DataFrame(columns=[y], index=add_data.index) add_data=pd.concat([add_data,new_col],axis=1) return gr.update(value=add_data) def updateAdd_zchange(z,add_data): headers=add_data.columns if z in headers: return gr.update(value=add_data) else: new_col = pd.DataFrame(columns=[z], index=add_data.index) add_data=pd.concat([add_data,new_col],axis=1) return gr.update(value=add_data) def resetAdd(x_vals,y_vals,z_vals): new=pd.DataFrame(columns=['ID',x_vals,y_vals,z_vals]) return gr.update(value=new) def appendFn(add_data,plotting_df): adding=pd.DataFrame(columns=['class','type'], index=add_data.index) adding['class']='NA' adding['type']='User' x=plotting_df.columns[3] y=plotting_df.columns[4] z=plotting_df.columns[5] add_data = add_data.rename(columns={'ID': 'group'}) adding=pd.concat([adding,add_data['group'],add_data[x],add_data[y],add_data[z]], axis=1) for row in [adding.columns[3],adding.columns[4],adding.columns[5]]: for jj in range(0,adding.shape[0]): if adding[row][jj]=='': adding[row][jj]='--' plotting_df=pd.concat([plotting_df,adding],axis=0) return gr.update(value=plotting_df) def twoD_regs(CC_reg,NC_reg,x_vals,y_vals,z_vals,plotting_df): _,_,_,_,_,_,_,fig01,fig02,fig03=plot(plotting_df,x_vals,y_vals,z_vals) fig11=fig01 fig22=fig02 fig33=fig03 model=linear_model.TheilSenRegressor(random_state=42) reg_df = df[['class',x_vals,y_vals,z_vals]].copy() #pulls from parent df - currently rounded values CCreg_df = reg_df[reg_df['class'] == 'CC'] NCreg_df = reg_df[reg_df['class'] == 'NC'] #temporary dfs cc_temp_xy=CCreg_df[['class',x_vals,y_vals]].copy() cc_temp_xy=cc_temp_xy[~(cc_temp_xy == '--').any(axis=1)] cc_temp_yz=CCreg_df[['class',y_vals,z_vals]].copy() cc_temp_yz=cc_temp_yz[~(cc_temp_yz == '--').any(axis=1)] cc_temp_zx=CCreg_df[['class',z_vals,x_vals]].copy() cc_temp_zx=cc_temp_zx[~(cc_temp_zx == '--').any(axis=1)] nc_temp_xy=NCreg_df[['class',x_vals,y_vals]].copy() nc_temp_xy=nc_temp_xy[~(nc_temp_xy == '--').any(axis=1)] nc_temp_yz=NCreg_df[['class',y_vals,z_vals]].copy() nc_temp_yz=nc_temp_yz[~(nc_temp_yz == '--').any(axis=1)] nc_temp_zx=NCreg_df[['class',z_vals,x_vals]].copy() nc_temp_zx=nc_temp_zx[~(nc_temp_zx == '--').any(axis=1)] #min-max ranges: #equivalent to x_range in robust regression.pynb cc_xx=cc_temp_xy[x_vals].to_numpy().reshape(-1,1) cc_xy1 = np.array([min(cc_xx),max(cc_xx)]) cc_yy=cc_temp_yz[y_vals].to_numpy().reshape(-1,1) cc_yz1 = np.array([min(cc_yy),max(cc_yy)]) cc_zz=cc_temp_zx[z_vals].to_numpy().reshape(-1,1) cc_zx1 = np.array([min(cc_zz),max(cc_zz)]) #NC nc_xx=nc_temp_xy[x_vals].to_numpy().reshape(-1,1) nc_xy1 = np.array([min(nc_xx),max(nc_xx)]) nc_yy=nc_temp_yz[y_vals].to_numpy().reshape(-1,1) nc_yz1 = np.array([min(nc_yy),max(nc_yy)]) nc_zz=nc_temp_zx[z_vals].to_numpy().reshape(-1,1) nc_zx1 = np.array([min(nc_zz),max(nc_zz)]) #########model fitting, creation of regression traces CC_m1,CC_m2,CC_m3,CC_b1,CC_b2,CC_b3,NC_m1,NC_m2,NC_m3,NC_b1,NC_b2,NC_b3 = 1,1,1,1,1,1,1,1,1,1,1,1 model.fit(cc_xx,cc_temp_xy[y_vals].to_numpy()) #if sizes are an issue, change this to just y_vals .to numpy cc_r1=model.score(cc_xx,cc_temp_xy[y_vals].to_numpy()).round(5) cc_xy2=model.predict(cc_xy1) CC_m1=model.coef_ CC_b1=model.intercept_ trace1 = go.Scatter(x=np.ravel(cc_xy1),y=np.ravel(cc_xy2),mode='lines',line=dict(color='blue'),showlegend=False,hoverinfo='text',hovertext=f'CC Regression
Correlation Coef.:{cc_r1}') model.fit(nc_xx,nc_temp_xy[y_vals].to_numpy()) nc_r1=model.score(nc_xx,nc_temp_xy[y_vals].to_numpy()).round(5) nc_xy2=model.predict(nc_xy1) NC_m1=model.coef_ NC_b1=model.intercept_ trace1a = go.Scatter(x=np.ravel(nc_xy1),y=np.ravel(nc_xy2),mode='lines',line=dict(color='red'),showlegend=False,hoverinfo='text',hovertext=f'NC Regression
Correlation Coef.:{nc_r1}') model.fit(cc_yy,cc_temp_yz[z_vals].to_numpy()) cc_r2=model.score(cc_yy,cc_temp_yz[z_vals].to_numpy()).round(5) cc_yz2=model.predict(cc_yz1) CC_m2=model.coef_ CC_b2=model.intercept_ trace2 = go.Scatter(x=np.ravel(cc_yz1),y=np.ravel(cc_yz2),mode='lines',line=dict(color='blue'),showlegend=False,hoverinfo='text',hovertext=f'CC Regression
Correlation Coef.:{cc_r2}') model.fit(nc_yy,nc_temp_yz[z_vals].to_numpy()) nc_r2=model.score(nc_yy,nc_temp_yz[z_vals].to_numpy()).round(5) nc_yz2=model.predict(nc_yz1) NC_m2=model.coef_ NC_b2=model.intercept_ trace2a = go.Scatter(x=np.ravel(nc_yz1),y=np.ravel(nc_yz2),mode='lines',line=dict(color='red'),showlegend=False,hoverinfo='text',hovertext=f'NC Regression
Correlation Coef.:{nc_r2}') model.fit(cc_zz,cc_temp_zx[x_vals].to_numpy()) cc_r3=model.score(cc_zz,cc_temp_zx[x_vals].to_numpy()).round(5) cc_zx2=model.predict(cc_zx1) CC_m3=model.coef_ CC_b3=model.intercept_ trace3 = go.Scatter(x=np.ravel(cc_zx1),y=np.ravel(cc_zx2),mode='lines',line=dict(color='blue'),showlegend=False,hoverinfo='text',hovertext=f'CC Regression
Correlation Coef.:{cc_r3}') model.fit(nc_zz,nc_temp_zx[x_vals].to_numpy()) nc_r3=model.score(nc_zz,nc_temp_zx[x_vals].to_numpy()).round(5) nc_zx2=model.predict(nc_zx1) NC_m3=model.coef_ NC_b3=model.intercept_ trace3a = go.Scatter(x=np.ravel(nc_zx1),y=np.ravel(nc_zx2),mode='lines',line=dict(color='red'),showlegend=False,hoverinfo='text',hovertext=f'NC Regression
Correlation Coef.:{nc_r3}') ##conditional statement which selectively appends regs based on boolean of regression buttons vp=0 #visibility param if CC_reg==True and NC_reg==False: ##just CC regs vp=1 fig11 = fig01.to_dict() fig11['data'].append(trace1) #fig11['data'].append(trace1a) fig11 = go.Figure(fig11) fig22 = fig02.to_dict() fig22['data'].append(trace2) #fig22['data'].append(trace2a) fig22 = go.Figure(fig22) fig33 = fig03.to_dict() fig33['data'].append(trace3) #fig33['data'].append(trace3a) fig33= go.Figure(fig33) elif CC_reg==False and NC_reg==True: ##just NC regs vp=1 fig11 = fig01.to_dict() #fig11['data'].append(trace1) fig11['data'].append(trace1a) fig11 = go.Figure(fig11) fig22 = fig02.to_dict() #fig22['data'].append(trace2) fig22['data'].append(trace2a) fig22 = go.Figure(fig22) fig33 = fig03.to_dict() #fig33['data'].append(trace3) fig33['data'].append(trace3a) fig33= go.Figure(fig33) elif CC_reg==True and NC_reg==True: ##both vp=1 fig11 = fig01.to_dict() fig11['data'].append(trace1) fig11['data'].append(trace1a) fig11 = go.Figure(fig11) fig22 = fig02.to_dict() fig22['data'].append(trace2) fig22['data'].append(trace2a) fig22 = go.Figure(fig22) fig33 = fig03.to_dict() fig33['data'].append(trace3) fig33['data'].append(trace3a) fig33= go.Figure(fig33) #else: ###############begin 3D regression df4=df.copy() df4.replace('--', np.nan,inplace=True) temp_x=df4[x_vals].dropna() temp_y=df4[y_vals].dropna() temp_z=df4[z_vals].dropna() ###CC 3D reg if (cc_r1 and cc_r2)>cc_r3: ## y vs x ++++ z vs y :: y_vals is common var, m1/b1 flips, m2/b2 remains val=1 model.fit(cc_temp_xy[y_vals].to_numpy().reshape(-1,1),cc_temp_xy[x_vals].to_numpy()) #CC_m1=model.coef_ #CC_b1=model.intercept_ passing_min=min(temp_y) passing_max=max(temp_y) CC_reg_min,CC_reg_max=threeD_regs_calcs(model.coef_,model.intercept_,CC_m2,CC_b2,passing_min,passing_max,val) elif (cc_r1 and cc_r3)>cc_r2: ## y vs x ++++ x vs z :: x_vals is common var, m3/b3 flips ; m1/b1 remains val=2 model.fit(cc_temp_zx[x_vals].to_numpy().reshape(-1,1),cc_temp_zx[z_vals].to_numpy()) #CC_m3=model.coef_ #CC_b3=model.intercept_ passing_min=min(temp_x) passing_max=max(temp_x) CC_reg_min,CC_reg_max=threeD_regs_calcs(CC_m1,CC_b1,model.coef_,model.intercept_,passing_min,passing_max,val) elif (cc_r2 and cc_r3)>cc_r1: ## z vs y ++++ x vs z :: z_vals is common var, m2/b2 flips, m3/b3 remains val=3 model.fit(cc_temp_yz[z_vals].to_numpy().reshape(-1,1),cc_temp_yz[y_vals].to_numpy()) #CC_m2=model.coef_ #CC_b2=model.intercept_ passing_min=min(temp_z) passing_max=max(temp_z) CC_reg_min,CC_reg_max=threeD_regs_calcs(model.coef_,model.intercept_,CC_m3,CC_b3,passing_min,passing_max,val) ###NC 3D reg if (nc_r1 and nc_r2)>nc_r3: ## y vs x ++++ z vs y :: y_vals is common var, m1/b1 flips, m2/b2 remains val=1 model.fit(nc_temp_xy[y_vals].to_numpy().reshape(-1,1),nc_temp_xy[x_vals].to_numpy()) #NC_m1=model.coef_ #NC_b1=model.intercept_ passing_min=min(temp_y) passing_max=max(temp_y) NC_reg_min,NC_reg_max=threeD_regs_calcs(model.coef_,model.intercept_,NC_m2,NC_b2,passing_min,passing_max,val) elif (nc_r1 and nc_r3)>nc_r2: ## y vs x ++++ x vs z :: x_vals is common var, m3/b3 flips ; m1/b1 remains val=2 model.fit(nc_temp_zx[x_vals].to_numpy().reshape(-1,1),nc_temp_zx[z_vals].to_numpy()) #NC_m3=model.coef_ #NC_b3=model.intercept_ passing_min=min(temp_x) passing_max=max(temp_x) NC_reg_min,NC_reg_max=threeD_regs_calcs(NC_m1,NC_b1,model.coef_,model.intercept_,passing_min,passing_max,val) elif (nc_r2 and nc_r3)>nc_r1: ## z vs y ++++ x vs z :: z_vals is common var, m2/b2 flips, m3/b3 remains val=3 model.fit(nc_temp_yz[z_vals].to_numpy().reshape(-1,1),nc_temp_yz[y_vals].to_numpy()) #NC_m2=model.coef_ #NC_b2=model.intercept_ passing_min=min(temp_z) passing_max=max(temp_z) NC_reg_min,NC_reg_max=threeD_regs_calcs(model.coef_,model.intercept_,NC_m3,NC_b3,passing_min,passing_max,val) #creates df with 3Dregression data id_df=pd.DataFrame(['CC_low','CC_high','NC_low','NC_high'], columns=['ID']) temp_reg_df=pd.DataFrame([CC_reg_min,CC_reg_max,NC_reg_min,NC_reg_max], columns=[x_vals, y_vals, z_vals]) passing_df = pd.concat([id_df, temp_reg_df], axis=1) if vp==0: return gr.update(value=fig11),gr.update(value=fig22),gr.update(value=fig33),gr.update(value=passing_df,visible=False),gr.update(value="Update 3D Regression", visible=False) else: return gr.update(value=fig11),gr.update(value=fig22),gr.update(value=fig33),gr.update(value=passing_df,visible=True),gr.update(value="Update 3D Regression", visible=True) def threeD_regs_calcs(m1,b1,m2,b2,passing_min,passing_max,val): if val==1: xmin=float((m1*passing_min)+b1) xmax=float((m1*passing_max)+b1) zmin=float((m2*passing_min)+b2) zmax=float((m2*passing_max)+b2) min_coord=np.round([xmin,passing_min,zmin],4) max_coord=np.round([xmax,passing_max,zmax],4) return min_coord,max_coord elif val == 2: ymin=float((m1*passing_min)+b1) ymax=float((m1*passing_max)+b1) zmin=float((m2*passing_min)+b2) zmax=float((m2*passing_max)+b2) min_coord=np.round([passing_min,ymin,zmin],4) max_coord=np.round([passing_max,ymax,zmax],4) return min_coord,max_coord elif val == 3: ymin=float((m1*passing_min)+b1) ymax=float((m1*passing_max)+b1) xmin=float((m2*passing_min)+b2) xmax=float((m2*passing_max)+b2) min_coord=np.round([xmin,ymin,passing_min],4) max_coord=np.round([xmax,ymax,passing_max],4) return min_coord,max_coord def regs_False(): return gr.update(value=False), gr.update (value=False),gr.update(visible=False) , gr.update(value="Update 3D Regression", visible=False) def plot_3D_reg(plotting_df,reg_df,x_vals, y_vals, z_vals,CC_reg,NC_reg): #omits '-- from temporary plotting dfs temp_xyz = pd.DataFrame(columns=plotting_df.columns) for index, row in plotting_df.iterrows(): x = row[x_vals] y = row[y_vals] z = row[z_vals] if x != '--' and y != '--' and z != '--': temp_xyz = pd.concat([temp_xyz, row.to_frame().T]) temp_xyz.reset_index(drop=True, inplace=True) #3D plot: markers={'Chon': 'circle', 'Iron': 'x', 'Acho': 'square', 'Plan': 'square', 'CAIs': 'diamond', 'User':'circle'}#, 'CI':'circle' fig0= px.scatter_3d(data_frame=temp_xyz,x=x_vals,y=y_vals, z=z_vals , color='class', color_discrete_map={'CC':'blue','CI':'#a4dded','NC':'red','Other':'green','NA':'#FFEF00'},symbol='type', symbol_map=markers, hover_name='group', hover_data={'class': False, 'type':False}) fig0.update_layout(template="none", showlegend=True, legend=dict(y=0.0, itemsizing="constant",title=""), modebar=dict(orientation='h')) fig0.update_traces(marker=dict(size=5, line=dict(color='white', width=4))) fig0.update_traces(selector=dict(marker_color='#FFEF00'), marker=dict(line_color='black')) #creates traces cc_reg_df = reg_df.iloc[:2, :] nc_reg_df = reg_df.iloc[2:, :] CCtrace=go.Scatter3d(x=cc_reg_df[x_vals],y=cc_reg_df[y_vals],z=cc_reg_df[z_vals], mode='lines',showlegend=False,line=dict(color='blue'),hoverinfo='skip') NCtrace=go.Scatter3d(x=nc_reg_df[x_vals],y=nc_reg_df[y_vals],z=nc_reg_df[z_vals], mode='lines',showlegend=False,line=dict(color='red'),hoverinfo='skip') #conditional statement that adds or removes regressions depending - ends function if CC_reg==True and NC_reg==False: ##just CC regs fig0.add_traces(CCtrace) return gr.update(value=fig0), gr.update(value="Update 3D Regression", visible=True) elif CC_reg==False and NC_reg==True: ##just NC regs fig0.add_traces(NCtrace) return gr.update(value=fig0), gr.update(value="Update 3D Regression", visible=True) elif CC_reg==True and NC_reg==True: ##both fig0.add_traces([CCtrace, NCtrace]) return gr.update(value=fig0), gr.update(value="Update 3D Regression", visible=True) else: # CC_reg==False and NC_reg==False: ##neither return gr.update(value=fig0), gr.update(value="Update 3D Regression", visible=False)