diff --git a/statisitic_functions.py b/statisitic_functions.py new file mode 100644 index 0000000..5e4a867 --- /dev/null +++ b/statisitic_functions.py @@ -0,0 +1,79 @@ +import numpy as np +import matplotlib as mpl + + +def cohen_d(x, y): + """ + Calculates the effect size Cohens d' between the two data x and y + :param x: data array 1 + :param y: data array 2 + :return: float, d value of the effect size + """ + nx = len(x) + ny = len(y) + dof = nx + ny - 2 + d = np.abs((np.mean(x) - np.mean(y)) / (((nx - 1) / dof) * (np.std(x) ** 2) + ((ny - 1) / dof) * (np.std(y) ** 2))) + return d + + +def significance_bar(ax, p, d, x0, x1, y, **kwargs): + """ + A horizontal bar with asterisks indicating significance level. + + Plot a horizontal bar from x0 to x1 at height y + for indicating significance. On top of the bar plot + asterisks according to the significance value p are drawn. + If p > 0.05 nothing is plotted. + p<0.001: '***', p<0.01: '**', p<0.05: '*'. + + Note: call this function AFTER ylim has been set! + + Parameters + ---------- + ax: matplotlib axes + Axes to which the inset is added. + p: float + Significance level. + x0: float + x-coordinate of starting point of significance bar in data units. + x1: float + x-coordinate of ending point of significance bar in data units. + y: float + y-coordinate of significance bar in data units. + kwargs: key-word arguments + Passed on to `ax.text()` used to print the asterisks. + """ + if d is not None: + if d > 0.0: + ps = '%.2f' %(d) + else: + return + + elif p is not None: + + # set label: + if p < 0.001: + ps = '***' + elif p < 0.01: + ps = '**' + elif p < 0.05: + ps = '*' + else: + return + # ax dimensions: + pixely = np.abs(np.diff(ax.get_window_extent().get_points()[:, 1]))[0] + unity = np.abs(np.diff(ax.get_ylim()))[0] + dyu = unity / pixely + fs = mpl.rcParams['font.size'] + if 'fontsize' in kwargs and isinstance(kwargs['fontsize'], (float, int)): + fs = kwargs['fontsize'] + dy = 0.3 * fs * dyu + lw = 1.0 + lh = ax.plot([x0, x0, x1, x1], [y - dy, y, y, y - dy], color='black', lw=lw, + solid_capstyle='butt', solid_joinstyle='miter', clip_on=False) + # get y position of line in figure pixel coordinates: + ly = np.array(lh[0].get_window_extent(ax.get_figure().canvas.get_renderer()))[1, 1] + th = ax.text(0.5 * (x0 + x1), y, ps, ha='center', va='bottom', **kwargs) + ty = np.array(th.get_window_extent(ax.get_figure().canvas.get_renderer()))[0, 1] + dty = ly + 5 * lw - 0.4 * fs - ty + th.set_position((0.5 * (x0 + x1), y + dty * dyu)) \ No newline at end of file