diff --git a/sci_analysis/graphs/vector.py b/sci_analysis/graphs/vector.py index 164b008..cc77fe4 100644 --- a/sci_analysis/graphs/vector.py +++ b/sci_analysis/graphs/vector.py @@ -1,16 +1,19 @@ import warnings import six +from math import sqrt, fabs # matplotlib imports from matplotlib.pyplot import (show, subplot, yticks, xlabel, ylabel, figure, setp, savefig, close, xticks, subplots_adjust) from matplotlib.gridspec import GridSpec +from matplotlib.patches import Circle +from matplotlib.collections import PatchCollection # Numpy imports -from numpy import polyfit, polyval, sort, arange, array, linspace, mgrid, vstack, reshape +from numpy import polyfit, polyval, sort, arange, array, linspace, mgrid, vstack, reshape, std, sum, mean, median # Scipy imports -from scipy.stats import probplot, gaussian_kde +from scipy.stats import probplot, gaussian_kde, t # local imports from .base import Graph @@ -575,9 +578,10 @@ class GraphBoxplot(VectorGraph): """ _nrows = 1 - _ncols = 2 + _ncols = 1 _xsize = 7.5 _ysize = 6 + _default_alpha = 0.05 def __init__(self, *args, **kwargs): """GraphBoxplot constructor. NOTE: If vectors is a dict, the boxplots are @@ -596,8 +600,10 @@ def __init__(self, *args, **kwargs): self._title = kwargs['title'] if 'title' in kwargs else 'Oneway' self._nqp = kwargs['nqp'] if 'nqp' in kwargs else True self._save_to = kwargs['save_to'] if 'save_to' in kwargs else None - self._gmean = kwargs['gmean'] if 'gmean' in kwargs else None - self._gmedian = kwargs['gmedian'] if 'gmedian' in kwargs else None + self._gmean = kwargs['gmean'] if 'gmean' in kwargs else True + self._gmedian = kwargs['gmedian'] if 'gmedian' in kwargs else True + self._circles = kwargs['circles'] if 'circles' in kwargs else True + self._alpha = kwargs['alpha'] if 'alpha' in kwargs else self._default_alpha if 'title' in kwargs: self._title = kwargs['title'] elif self._nqp: @@ -633,6 +639,31 @@ def __init__(self, *args, **kwargs): data = Vector(args[0]) super(GraphBoxplot, self).__init__(data, xname=xname, yname=yname, save_to=self._save_to) + @staticmethod + def grand_mean(data): + return mean([mean(sample) for sample in data]) + + @staticmethod + def grand_median(data): + return median([median(sample) for sample in data]) + + def tukey_circles(self, data): + num = [] + den = [] + crit = [] + radii = [] + xbar = [] + for sample in data: + df = len(sample) - 1 + num.append(std(sample, ddof=1) ** 2 * df) + den.append(df) + crit.append(t.ppf(1 - self._alpha, df)) + mse = sum(num) / sum(den) + for i, sample in enumerate(data): + radii.append(fabs(crit[i]) * sqrt(mse / len(sample))) + xbar.append(mean(sample)) + return tuple(zip(xbar, radii)) + def draw(self): """ Draws the boxplots based on the set parameters. @@ -642,6 +673,14 @@ def draw(self): pass """ + # Setup the grid variables + w_ratio = [1] + if self._circles: + w_ratio = [4, 1] + self._ncols += 1 + if self._nqp: + w_ratio.append(4 if self._circles else 1) + self._ncols += 1 groups, data = zip(*[(g, v['ind']) for g, v in self._data.values.groupby('grp')]) # Create the quantile plot arrays @@ -650,11 +689,9 @@ def draw(self): # Create the figure and gridspec if self._nqp and len(prob) > 0: self._xsize *= 2 - else: - self._ncols = 1 f = figure(figsize=(self._xsize, self._ysize)) f.suptitle(self._title, fontsize=14) - gs = GridSpec(self._nrows, self._ncols, wspace=0) + gs = GridSpec(self._nrows, self._ncols, width_ratios=w_ratio, wspace=0) # Draw the boxplots ax1 = subplot(gs[0]) @@ -665,31 +702,42 @@ def draw(self): for i in range(len(groups)): setp(vp['bodies'][i], facecolors=self.get_color(i)) ax1.yaxis.grid(True, linestyle='-', which='major', color='grey', alpha=0.75) - if is_number(self._gmean): - ax1.axhline(float(self._gmean), c='red', linestyle='--', alpha=0.8) - if is_number(self._gmedian): - ax1.axhline(float(self._gmedian), c='blue', linestyle=':', alpha=0.8) + if self._gmean: + ax1.axhline(float(self.grand_mean(data)), c='k', linestyle='--', alpha=0.4) + if self._gmedian: + ax1.axhline(float(self.grand_median(data)), c='k', linestyle=':', alpha=0.4) if any([True if len(str(g)) > 10 else False for g in groups]) or len(groups) > 5: xticks(rotation=60) subplots_adjust(bottom=0.2) ylabel(self._yname) xlabel(self._xname) + # Draw the Tukey-Kramer circles + if self._circles: + ax2 = subplot(gs[1], sharey=ax1) + for i, (center, radius) in enumerate(self.tukey_circles(data)): + c = Circle((0.5, center), radius=radius, facecolor='none', edgecolor=self.get_color(i)) + ax2.add_patch(c) + ax2.set_aspect('equal') + setp(ax2.get_xticklabels(), visible=False) + setp(ax2.get_yticklabels(), visible=False) + xticks([]) + # Draw the normal quantile plot if self._nqp and len(prob) > 0: - ax2 = subplot(gs[1], sharey=ax1) + ax3 = subplot(gs[2], sharey=ax1) if self._circles else subplot(gs[1], sharey=ax1) for i, g in enumerate(prob): osm = g[0][0] osr = g[0][1] slope = g[1][0] intercept = g[1][1] - ax2.plot(osm, osr, marker='^', color=self.get_color(i), label=groups[i]) - ax2.plot(osm, slope * osm + intercept, linestyle='--', linewidth=2, color=self.get_color(i)) - ax2.xaxis.grid(True, linestyle='-', which='major', color='grey', alpha=0.75) - ax2.yaxis.grid(True, linestyle='-', which='major', color='grey', alpha=0.75) - ax2.legend(loc='best') + ax3.plot(osm, osr, marker='^', color=self.get_color(i), label=groups[i]) + ax3.plot(osm, slope * osm + intercept, linestyle='--', linewidth=2, color=self.get_color(i)) + ax3.xaxis.grid(True, linestyle='-', which='major', color='grey', alpha=0.75) + ax3.yaxis.grid(True, linestyle='-', which='major', color='grey', alpha=0.75) + ax3.legend(loc='best') xlabel("Quantiles") - setp(ax2.get_yticklabels(), visible=False) + setp(ax3.get_yticklabels(), visible=False) # Save the figure to disk or display if self._save_to: diff --git a/sci_analysis/test/test_graph_boxplots.py b/sci_analysis/test/test_graph_boxplots.py index ea66553..080295a 100644 --- a/sci_analysis/test/test_graph_boxplots.py +++ b/sci_analysis/test/test_graph_boxplots.py @@ -43,10 +43,11 @@ def test_100_boxplot_2_default(self): input_2_array = st.norm.rvs(1, size=2000) gmean = np.mean((np.mean(input_1_array), np.mean(input_2_array))) gmedian = np.median([np.median(input_1_array), np.median(input_2_array)]) - self.assertTrue(GraphBoxplot(input_1_array, input_2_array, - gmean=gmean, - gmedian=gmedian, - save_to='{}test_box_100'.format(self.save_path))) + res = GraphBoxplot(input_1_array, input_2_array, + save_to='{}test_box_100'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.mean(input_1_array), np.mean(input_2_array)))) + self.assertEqual(gmedian, res.grand_median([np.median(input_1_array), np.median(input_2_array)])) def test_101_boxplot_2_no_nqp(self): """Generate a boxplot graph with no nqp""" @@ -55,11 +56,12 @@ def test_101_boxplot_2_no_nqp(self): input_2_array = st.norm.rvs(1, size=2000) gmean = np.mean((np.mean(input_1_array), np.mean(input_2_array))) gmedian = np.median([np.median(input_1_array), np.median(input_2_array)]) - self.assertTrue(GraphBoxplot(input_1_array, input_2_array, - nqp=False, - gmean=gmean, - gmedian=gmedian, - save_to='{}test_box_101'.format(self.save_path))) + res = GraphBoxplot(input_1_array, input_2_array, + nqp=False, + save_to='{}test_box_101'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.mean(input_1_array), np.mean(input_2_array)))) + self.assertEqual(gmedian, res.grand_median([np.median(input_1_array), np.median(input_2_array)])) def test_102_boxplot_2_weird_variance(self): """Generate a boxplot graph with small and large variance""" @@ -68,30 +70,41 @@ def test_102_boxplot_2_weird_variance(self): input_2_array = st.norm.rvs(1, 8, size=2000) gmean = np.mean((np.mean(input_1_array), np.mean(input_2_array))) gmedian = np.median([np.median(input_1_array), np.median(input_2_array)]) - self.assertTrue(GraphBoxplot(input_1_array, input_2_array, - gmean=gmean, - gmedian=gmedian, - save_to='{}test_box_102'.format(self.save_path))) + res = GraphBoxplot(input_1_array, input_2_array, + save_to='{}test_box_102'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.mean(input_1_array), np.mean(input_2_array)))) + self.assertEqual(gmedian, res.grand_median([np.median(input_1_array), np.median(input_2_array)])) def test_103_boxplot_2_groups(self): """Generate a boxplot graph with set group names""" np.random.seed(987654321) input_1_array = st.norm.rvs(size=2000) input_2_array = st.norm.rvs(1, size=2000) - self.assertTrue(GraphBoxplot(input_1_array, input_2_array, - groups=('Group 1', 'Group 2'), - save_to='{}test_box_103'.format(self.save_path))) + gmean = np.mean((np.mean(input_1_array), np.mean(input_2_array))) + gmedian = np.median([np.median(input_1_array), np.median(input_2_array)]) + res = GraphBoxplot(input_1_array, input_2_array, + groups=('Group 1', 'Group 2'), + save_to='{}test_box_103'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.mean(input_1_array), np.mean(input_2_array)))) + self.assertEqual(gmedian, res.grand_median([np.median(input_1_array), np.median(input_2_array)])) def test_104_boxplot_2_names_title(self): """Generate a boxplot graph with set xname, yname and title""" np.random.seed(987654321) input_1_array = st.norm.rvs(size=2000) input_2_array = st.norm.rvs(1, size=2000) - self.assertTrue(GraphBoxplot(input_1_array, input_2_array, - xname='Test Groups', - yname='Test Data', - title='Title Test', - save_to='{}test_box_104'.format(self.save_path))) + gmean = np.mean((np.mean(input_1_array), np.mean(input_2_array))) + gmedian = np.median([np.median(input_1_array), np.median(input_2_array)]) + res = GraphBoxplot(input_1_array, input_2_array, + xname='Test Groups', + yname='Test Data', + title='Title Test', + save_to='{}test_box_104'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.mean(input_1_array), np.mean(input_2_array)))) + self.assertEqual(gmedian, res.grand_median([np.median(input_1_array), np.median(input_2_array)])) def test_105_boxplot_2_diff_size(self): """Generate a boxplot graph with different sizes""" @@ -100,11 +113,12 @@ def test_105_boxplot_2_diff_size(self): input_2_array = st.norm.rvs(0, 5, size=56) gmean = np.mean((np.mean(input_1_array), np.mean(input_2_array))) gmedian = np.median([np.median(input_1_array), np.median(input_2_array)]) - self.assertTrue(GraphBoxplot(input_1_array, input_2_array, - title='Diff Size', - gmean=gmean, - gmedian=gmedian, - save_to='{}test_box_105'.format(self.save_path))) + res = GraphBoxplot(input_1_array, input_2_array, + title='Diff Size', + save_to='{}test_box_105'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.mean(input_1_array), np.mean(input_2_array)))) + self.assertEqual(gmedian, res.grand_median([np.median(input_1_array), np.median(input_2_array)])) def test_106_boxplot_2_diff_size_diff_disto(self): """Generate a boxplot graph with different sizes and different distributions""" @@ -113,11 +127,12 @@ def test_106_boxplot_2_diff_size_diff_disto(self): input_2_array = st.norm.rvs(0, size=56) gmean = np.mean((np.mean(input_1_array), np.mean(input_2_array))) gmedian = np.median([np.median(input_1_array), np.median(input_2_array)]) - self.assertTrue(GraphBoxplot(input_1_array, input_2_array, - title='Diff Size, Diff Distribution', - gmean=gmean, - gmedian=gmedian, - save_to='{}test_box_106'.format(self.save_path))) + res = GraphBoxplot(input_1_array, input_2_array, + title='Diff Size, Diff Distribution', + save_to='{}test_box_106'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.mean(input_1_array), np.mean(input_2_array)))) + self.assertEqual(gmedian, res.grand_median([np.median(input_1_array), np.median(input_2_array)])) def test_107_boxplot_2_diff_size_diff_disto_dict(self): """Generate a boxplot graph with different sizes and different distributions as a dict""" @@ -126,38 +141,54 @@ def test_107_boxplot_2_diff_size_diff_disto_dict(self): input_2_array = st.norm.rvs(0, size=56) gmean = np.mean((np.mean(input_1_array), np.mean(input_2_array))) gmedian = np.median([np.median(input_1_array), np.median(input_2_array)]) - self.assertTrue(GraphBoxplot({'Group 1': input_1_array, 'Group 2': input_2_array}, - title='Diff Size, Diff Distribution Dict', - gmean=gmean, - gmedian=gmedian, - save_to='{}test_box_107'.format(self.save_path))) + res = GraphBoxplot({'Group 1': input_1_array, 'Group 2': input_2_array}, + title='Diff Size, Diff Distribution Dict', + save_to='{}test_box_107'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.mean(input_1_array), np.mean(input_2_array)))) + self.assertEqual(gmedian, res.grand_median([np.median(input_1_array), np.median(input_2_array)])) def test_108_boxplot_2_size_4(self): """Generate a boxplot graph with size 4""" np.random.seed(987654321) input_1_array = st.norm.rvs(1, size=4) input_2_array = st.norm.rvs(size=4) - self.assertTrue(GraphBoxplot({'Group 1': input_1_array, 'Group 2': input_2_array}, - title='Size 4', - save_to='{}test_box_108'.format(self.save_path))) + gmean = np.mean((np.mean(input_1_array), np.mean(input_2_array))) + gmedian = np.median([np.median(input_1_array), np.median(input_2_array)]) + res = GraphBoxplot({'Group 1': input_1_array, 'Group 2': input_2_array}, + title='Size 4', + save_to='{}test_box_108'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.mean(input_1_array), np.mean(input_2_array)))) + self.assertEqual(gmedian, res.grand_median([np.median(input_1_array), np.median(input_2_array)])) def test_109_boxplot_2_at_min_size(self): """Generate a boxplot graph with size 2""" np.random.seed(987654321) input_1_array = st.norm.rvs(size=2) input_2_array = st.norm.rvs(size=3) - self.assertTrue(GraphBoxplot({'Group 1': input_1_array, 'Group 2': input_2_array}, - title='At Min Size', - save_to='{}test_box_109'.format(self.save_path))) + gmean = np.mean((np.mean(input_1_array), np.mean(input_2_array))) + gmedian = np.median([np.median(input_1_array), np.median(input_2_array)]) + res = GraphBoxplot({'Group 1': input_1_array, 'Group 2': input_2_array}, + title='At Min Size', + save_to='{}test_box_109'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.mean(input_1_array), np.mean(input_2_array)))) + self.assertEqual(gmedian, res.grand_median([np.median(input_1_array), np.median(input_2_array)])) def test_110_boxplot_2_min_size(self): """Catch the min size case""" np.random.seed(987654321) input_1_array = st.norm.rvs(size=1) input_2_array = st.norm.rvs(size=2) - self.assertTrue(GraphBoxplot({'Group 1': input_1_array, 'Group 2': input_2_array}, - title='Single point', - save_to='{}test_box_110'.format(self.save_path))) + gmean = np.mean((np.mean(input_1_array), np.mean(input_2_array))) + gmedian = np.median([np.median(input_1_array), np.median(input_2_array)]) + res = GraphBoxplot({'Group 1': input_1_array, 'Group 2': input_2_array}, + title='Single point', + save_to='{}test_box_110'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.mean(input_1_array), np.mean(input_2_array)))) + self.assertEqual(gmedian, res.grand_median([np.median(input_1_array), np.median(input_2_array)])) def test_111_boxplot_2_missing_data(self): """Generate a boxplot with missing data""" @@ -170,9 +201,14 @@ def test_111_boxplot_2_missing_data(self): input_1_array = np.insert(input_1_array, i, np.nan, axis=0) for i in indicies_y: input_2_array = np.insert(input_2_array, i, np.nan, axis=0) - self.assertTrue(GraphBoxplot(input_1_array, input_2_array, - title='Random Missing Data', - save_to='{}test_box_111'.format(self.save_path))) + gmean = np.nanmean((np.nanmean(input_1_array), np.nanmean(input_2_array))) + gmedian = np.nanmedian([np.nanmedian(input_1_array), np.nanmedian(input_2_array)]) + res = GraphBoxplot(input_1_array, input_2_array, + title='Random Missing Data', + save_to='{}test_box_111'.format(self.save_path)) + self.assertTrue(res) + self.assertAlmostEqual(gmean, res.grand_mean((np.nanmean(input_1_array), np.nanmean(input_2_array))), 4) + self.assertAlmostEqual(gmedian, res.grand_median([np.nanmedian(input_1_array), np.nanmedian(input_2_array)]), 4) def test_112_boxplot_2_empty_arrays(self): """Catch the case where both arrays are empty""" @@ -193,27 +229,46 @@ def test_114_boxplot_2_strings(self): np.random.seed(987654321) input_1_array = ["this", '2', 'is', '4.0', 'a', '6', 'string'] input_2_array = ['3.0', "here's", '6', 'a', '9.0', 'string'] - self.assertTrue(GraphBoxplot(input_1_array, input_2_array, - title='String test', - save_to='{}test_box_114'.format(self.save_path))) + gmean = np.mean((np.mean([2, 4, 6]), np.mean([3, 6, 9]))) + gmedian = np.median((np.median([2, 4, 6]), np.median([3, 6, 9]))) + res = GraphBoxplot(input_1_array, input_2_array, + title='String test', + save_to='{}test_box_114'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.mean([2, 4, 6]), np.mean([3, 6, 9])))) + self.assertEqual(gmedian, res.grand_median((np.median([2, 4, 6]), np.median([3, 6, 9])))) def test_115_boxplot_2_2dim_array(self): """Generate a boxplot graph with 2 2dim arrays""" np.random.seed(987654321) input_1_array = np.array([[1, 2, 3], [4, 5, 6]]) input_2_array = np.array([[3, 4, 5], [6, 7, 8]]) - self.assertTrue(GraphBoxplot(input_1_array, input_2_array, - title='2dim Array', - save_to='{}test_box_115'.format(self.save_path))) + gmean = np.nanmean((np.nanmean(input_1_array, axis=None), np.nanmean(input_2_array, axis=None))) + gmedian = np.nanmedian([np.nanmedian(input_1_array, axis=None), np.nanmedian(input_2_array, axis=None)]) + res = GraphBoxplot(input_1_array, input_2_array, + title='2dim Array', + save_to='{}test_box_115'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.nanmean(input_1_array, axis=None), + np.nanmean(input_2_array, axis=None)))) + self.assertEqual(gmedian, res.grand_median([np.nanmedian(input_1_array, axis=None), + np.nanmedian(input_2_array, axis=None)])) def test_116_boxplot_2_3dim_array(self): """Generate a boxplot graph with 2 3dim arrays""" np.random.seed(987654321) input_1_array = np.array([[[1, 2, 3], [3, 4, 5]], [[6, 7, 8], [8, 9, 10]]]) input_2_array = np.array([[[2, 3, 4], [5, 6, 7]], [[7, 8, 9], [10, 11, 12]]]) - self.assertTrue(GraphBoxplot(input_1_array, input_2_array, - title='3dim Array', - save_to='{}test_box_116'.format(self.save_path))) + gmean = np.nanmean((np.nanmean(input_1_array, axis=None), np.nanmean(input_2_array, axis=None))) + gmedian = np.nanmedian([np.nanmedian(input_1_array, axis=None), np.nanmedian(input_2_array, axis=None)]) + res = GraphBoxplot(input_1_array, input_2_array, + title='3dim Array', + save_to='{}test_box_116'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.nanmean(input_1_array, axis=None), + np.nanmean(input_2_array, axis=None)))) + self.assertEqual(gmedian, res.grand_median([np.nanmedian(input_1_array, axis=None), + np.nanmedian(input_2_array, axis=None)])) def test_117_boxplot_2_3dim_list(self): """Generate a boxplot graph with 2 3dim lists""" @@ -235,10 +290,13 @@ def test_118_boxplot_4_default(self): np.mean(input_4_array))) gmedian = np.median([np.median(input_1_array), np.median(input_2_array), np.median(input_3_array), np.median(input_4_array)]) - self.assertTrue(GraphBoxplot(input_1_array, input_2_array, input_3_array, input_4_array, - gmean=gmean, - gmedian=gmedian, - save_to='{}test_box_118'.format(self.save_path))) + res = GraphBoxplot(input_1_array, input_2_array, input_3_array, input_4_array, + save_to='{}test_box_118'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, np.mean((np.mean(input_1_array), np.mean(input_2_array), + np.mean(input_3_array), np.mean(input_4_array)))) + self.assertEqual(gmedian, np.median((np.median(input_1_array), np.median(input_2_array), + np.median(input_3_array), np.median(input_4_array)))) def test_119_boxplot_4_no_nqp(self): """Generate a boxplot graph with 4 arrays and no nqp""" @@ -247,9 +305,18 @@ def test_119_boxplot_4_no_nqp(self): input_2_array = st.norm.rvs(1, size=2000) input_3_array = st.norm.rvs(2, 0.5, size=2000) input_4_array = st.weibull_min.rvs(1.4, size=2000) - self.assertTrue(GraphBoxplot(input_1_array, input_2_array, input_3_array, input_4_array, - nqp=False, - save_to='{}test_box_119'.format(self.save_path))) + gmean = np.mean((np.mean(input_1_array), np.mean(input_2_array), + np.mean(input_3_array), np.mean(input_4_array))) + gmedian = np.median((np.median(input_1_array), np.median(input_2_array), + np.median(input_3_array), np.median(input_4_array))) + res = GraphBoxplot(input_1_array, input_2_array, input_3_array, input_4_array, + nqp=False, + save_to='{}test_box_119'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, np.mean((np.mean(input_1_array), np.mean(input_2_array), + np.mean(input_3_array), np.mean(input_4_array)))) + self.assertEqual(gmedian, np.median((np.median(input_1_array), np.median(input_2_array), + np.median(input_3_array), np.median(input_4_array)))) def test_120_boxplot_4_no_nqp_groups(self): """Generate a boxplot graph with 4 arrays, no nqp and set groups""" @@ -344,24 +411,36 @@ def test_126_boxplot_14_default(self): np.median(input_7_array), np.median(input_8_array), np.median(input_9_array), np.median(input_10_array), np.median(input_11_array), np.median(input_12_array), np.median(input_13_array), np.median(input_14_array))) - self.assertTrue(GraphBoxplot({'Group 1': input_1_array, - 'Group 2': input_2_array, - 'Group 3': input_3_array, - 'Group 4': input_4_array, - 'Group 5': input_5_array, - 'Group 6': input_6_array, - 'Group 7': input_7_array, - 'Group 8': input_8_array, - 'Group 9': input_9_array, - 'Group 10': input_10_array, - 'Group 11': input_11_array, - 'Group 12': input_12_array, - 'Group 13': input_13_array, - 'Group 14': input_14_array}, - title='14 Arrays', - gmean=gmean, - gmedian=gmedian, - save_to='{}test_box_126'.format(self.save_path))) + res = GraphBoxplot({'Group 1': input_1_array, + 'Group 2': input_2_array, + 'Group 3': input_3_array, + 'Group 4': input_4_array, + 'Group 5': input_5_array, + 'Group 6': input_6_array, + 'Group 7': input_7_array, + 'Group 8': input_8_array, + 'Group 9': input_9_array, + 'Group 10': input_10_array, + 'Group 11': input_11_array, + 'Group 12': input_12_array, + 'Group 13': input_13_array, + 'Group 14': input_14_array}, + title='14 Arrays', + save_to='{}test_box_126'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.mean(input_1_array), np.mean(input_2_array), np.mean(input_3_array), + np.mean(input_4_array), np.mean(input_5_array), np.mean(input_6_array), + np.mean(input_7_array), np.mean(input_8_array), np.mean(input_9_array), + np.mean(input_10_array), np.mean(input_11_array), + np.mean(input_12_array), np.mean(input_13_array), + np.mean(input_14_array)))) + self.assertEqual(gmedian, res.grand_median((np.median(input_1_array), np.median(input_2_array), + np.median(input_3_array), np.median(input_4_array), + np.median(input_5_array), np.median(input_6_array), + np.median(input_7_array), np.median(input_8_array), + np.median(input_9_array), np.median(input_10_array), + np.median(input_11_array), np.median(input_12_array), + np.median(input_13_array), np.median(input_14_array)))) def test_127_boxplot_1_default(self): """Generate a boxplot graph with 1 array""" @@ -492,11 +571,10 @@ def test_138_boxplot_vector(self): gmean = np.mean((np.mean(input_1_array), np.mean(input_2_array))) gmedian = np.median((np.median(input_1_array), np.median(input_2_array))) vector = Vector(input_1_array).append(Vector(input_2_array)) - self.assertTrue(GraphBoxplot(vector, - title='Vector Simple Test', - gmean=gmean, - gmedian=gmedian, - save_to='{}test_box_138'.format(self.save_path))) + res = GraphBoxplot(vector, title='Vector Simple Test', save_to='{}test_box_138'.format(self.save_path)) + self.assertTrue(res) + self.assertEqual(gmean, res.grand_mean((np.mean(input_1_array), np.mean(input_2_array)))) + self.assertEqual(gmedian, res.grand_median((np.median(input_1_array), np.median(input_2_array)))) def test_139_boxplot_vector_ignore_groups(self): """Generate a boxplot graph from a Vector object which should ignore the groups kwargs.""" @@ -590,43 +668,50 @@ def test_147_boxplot_scalar(self): self.assertTrue(GraphBoxplot(input_1_array, title='Scalar Boxplot', save_to='{}test_box_147'.format(self.save_path))) - def test_148_boxplot_vector_only_gmean(self): - """Generate a boxplot graph from a Vector object and don't show gmedian.""" + def test_148_boxplot_vector_no_circles(self): + """Generate a boxplot graph from a vector object with four groups and no circles.""" np.random.seed(987654321) input_1_array = st.norm.rvs(size=2000) input_2_array = st.norm.rvs(1, size=2000) - gmean = np.mean((np.mean(input_1_array), np.mean(input_2_array))) - vector = Vector(input_1_array).append(Vector(input_2_array)) - self.assertTrue(GraphBoxplot(vector, - title='Vector Simple Test', - gmean=gmean, - save_to='{}test_box_148'.format(self.save_path))) + input_3_array = st.norm.rvs(2, 0.5, size=2000) + input_4_array = st.weibull_min.rvs(1.4, size=2000) + vector = (Vector(input_1_array) + .append(Vector(input_2_array)) + .append(Vector(input_3_array)) + .append(Vector(input_4_array))) + self.assertTrue(GraphBoxplot(vector, save_to='{}test_box_148'.format(self.save_path), circles=False)) - def test_149_boxplot_vector_only_gmedian(self): - """Generate a boxplot graph from a Vector object and don't show gmean.""" + def test_149_no_gmean(self): + """Generate a boxplot graph from a vector object with four groups and no grand mean line.""" np.random.seed(987654321) input_1_array = st.norm.rvs(size=2000) input_2_array = st.norm.rvs(1, size=2000) - gmedian = np.median((np.median(input_1_array), np.median(input_2_array))) - vector = Vector(input_1_array).append(Vector(input_2_array)) - self.assertTrue(GraphBoxplot(vector, - title='Vector Simple Test', - gmedian=gmedian, - save_to='{}test_box_149'.format(self.save_path))) + input_3_array = st.norm.rvs(2, 0.5, size=2000) + input_4_array = st.weibull_min.rvs(1.4, size=2000) + vector = (Vector(input_1_array) + .append(Vector(input_2_array)) + .append(Vector(input_3_array)) + .append(Vector(input_4_array))) + res = GraphBoxplot(vector, + gmean=False, + save_to='{}test_box_149'.format(self.save_path)) + self.assertTrue(res) - def test_150_boxplot_vector_gmean_not_a_number(self): - """Test the case where gmean is not a number.""" + def test_150_no_gmedian(self): + """Generate a boxplot graph from a vector object with four groups and no grand median line.""" np.random.seed(987654321) input_1_array = st.norm.rvs(size=2000) input_2_array = st.norm.rvs(1, size=2000) - gmean = 'abcdefg' - gmedian = np.median((np.median(input_1_array), np.median(input_2_array))) - vector = Vector(input_1_array).append(Vector(input_2_array)) - self.assertTrue(GraphBoxplot(vector, - title='Vector Simple Test', - gmean=gmean, - gmedian=gmedian, - save_to='{}test_box_150'.format(self.save_path))) + input_3_array = st.norm.rvs(2, 0.5, size=2000) + input_4_array = st.weibull_min.rvs(1.4, size=2000) + vector = (Vector(input_1_array) + .append(Vector(input_2_array)) + .append(Vector(input_3_array)) + .append(Vector(input_4_array))) + res = GraphBoxplot(vector, + gmedian=False, + save_to='{}test_box_150'.format(self.save_path)) + self.assertTrue(res) if __name__ == '__main__':