[docs]@dataclass(frozen=True)classDistributionScatterStyle:"""Style for the distribution scatter plot."""normal_color:str="blue"nonnormal_color:str="orange"radius:float=0.3alpha:float=0.5normal_visible:bool=Falsenormal_label:str="Normal"nonnormal_label:str="Non-Normal"
[docs]@dataclass(frozen=True)classDistributionScatterConfig:"""Configuration for the distribution scatter plot."""normal_color:str=DistributionScatterStyle.normal_colornonnormal_color:str=DistributionScatterStyle.nonnormal_colorradius:float=DistributionScatterStyle.radiusalpha:float=DistributionScatterStyle.alphanormal_visible:bool=DistributionScatterStyle.normal_visiblenormal_label:str=DistributionScatterStyle.normal_labelnonnormal_label:str=DistributionScatterStyle.nonnormal_label
[docs]classDistributionScatter(PlotObj,Configurable[DistributionScatterConfig]):"""Scatter-plots each raw measurement point per commit."""def__init__(self,**params:dict[str,Any])->None:"""Initialize the DistributionScatter plot object. Args: **params: Configuration parameters for the distribution scatter plot. """# Accept either a raw dict (from YAML) or our Style objectsuper().__init__(DistributionScatterConfig,**params)
[docs]defadd(self,ctx:Context,fig:figure)->None:"""Add the distribution scatter plot to the figure. Args: ctx (Context): The context object containing artefacts and figure. It should contain the following artefacts: - "distributions": List of distributions for each commit. - "normality_flags": List of booleans indicating if the distribution is normal or not. fig (figure): The Bokeh figure to which the scatter plot will be added. """dists=ctx.artefacts.get("distributions",[])flags=ctx.artefacts.get("normality_flags",[])normal_x,normal_y,nonnorm_x,nonnorm_y=[],[],[],[]fori,valsinenumerate(dists):is_norm=flags[i]ifi<len(flags)elseTrueforvinvals:ifis_norm:normal_x.append(i)normal_y.append(v)else:nonnorm_x.append(i)nonnorm_y.append(v)# normalnormal_src=ColumnDataSource(data={"x":normal_x,"y":normal_y})fig.circle(x="x",y="y",source=normal_src,radius=self.config.radius,alpha=self.config.alpha,color=self.config.normal_color,legend_label=self.config.normal_label,visible=self.config.normal_visible,)# non-normalnonnorm_src=ColumnDataSource(data={"x":nonnorm_x,"y":nonnorm_y})fig.circle(x="x",y="y",source=nonnorm_src,radius=self.config.radius,alpha=self.config.alpha,color=self.config.nonnormal_color,legend_label=self.config.nonnormal_label,visible=True,)