diff --git a/src/MetaWinAnalysis.py b/src/MetaWinAnalysis.py index 9a4a09f..09860fc 100644 --- a/src/MetaWinAnalysis.py +++ b/src/MetaWinAnalysis.py @@ -1798,37 +1798,36 @@ def do_meta_analysis(data, options, decimal_places: int = 4, alpha: float = 0.05 output, all_citations = options.report_choices() output_blocks.extend(output) if options.structure == SIMPLE_MA: - (output, figure, chart_data, analysis_values, + (output, chart_data, analysis_values, citations) = MetaWinAnalysisFunctions.simple_meta_analysis(data, options, decimal_places, alpha, norm_ci, sender=sender) elif options.structure == GROUPED_MA: - (output, figure, chart_data, analysis_values, + (output, chart_data, analysis_values, citations) = MetaWinAnalysisFunctions.grouped_meta_analysis(data, options, decimal_places, alpha, norm_ci, sender=sender) elif options.structure == CUMULATIVE_MA: - output, figure, chart_data = MetaWinAnalysisFunctions.cumulative_meta_analysis(data, options, decimal_places, - alpha, norm_ci, sender=sender) + output, chart_data = MetaWinAnalysisFunctions.cumulative_meta_analysis(data, options, decimal_places, alpha, + norm_ci, sender=sender) analysis_values = None citations = [] elif options.structure == REGRESSION_MA: - (output, figure, chart_data, analysis_values, + (output, chart_data, analysis_values, citations) = MetaWinAnalysisFunctions.regression_meta_analysis(data, options, decimal_places, alpha, norm_ci, sender=sender) elif options.structure == COMPLEX_MA: output, analysis_values, citations = MetaWinAnalysisFunctions.complex_meta_analysis(data, options, decimal_places, alpha, norm_ci, sender=sender) - figure = None chart_data = None elif options.structure == NESTED_MA: - (output, figure, chart_data, analysis_values, + (output, chart_data, analysis_values, citations) = MetaWinAnalysisFunctions.nested_meta_analysis(data, options, decimal_places, alpha, norm_ci, sender=sender) elif options.structure == TRIM_FILL: - (output, figure, chart_data, analysis_values, + (output, chart_data, analysis_values, citations) = MetaWinAnalysisFunctions.trim_and_fill_analysis(data, options, decimal_places, alpha, norm_ci) elif options.structure == JACKKNIFE: - (output, figure, chart_data, + (output, chart_data, citations) = MetaWinAnalysisFunctions.jackknife_meta_analysis(data, options, decimal_places, alpha, norm_ci, sender=sender) analysis_values = None @@ -1836,24 +1835,21 @@ def do_meta_analysis(data, options, decimal_places: int = 4, alpha: float = 0.05 output, citations = MetaWinAnalysisFunctions.phylogenetic_meta_analysis(data, options, tree, decimal_places, alpha, norm_ci, sender=sender) analysis_values = None - figure = None chart_data = None elif options.structure == RANKCOR: output, citations = MetaWinAnalysisFunctions.rank_correlation_analysis(data, options, decimal_places, sender=sender) - figure = None chart_data = None analysis_values = None else: output = [] analysis_values = None - figure = None chart_data = None citations = [] all_citations.extend(citations) output_blocks.extend(output) output_blocks.extend(create_reference_list(all_citations)) - return output_blocks, figure, chart_data, analysis_values + return output_blocks, chart_data, analysis_values def meta_analysis(sender, data, last_effect, last_var, decimal_places: int = 4, alpha: float = 0.05, @@ -1909,9 +1905,9 @@ def meta_analysis(sender, data, last_effect, last_var, decimal_places: int = 4, meta_analysis_options.structure = None if meta_analysis_options.structure is not None: - output, figure, chart_data, _ = do_meta_analysis(data, meta_analysis_options, decimal_places, alpha, tree, - norm_ci, sender=sender) + output, chart_data, _ = do_meta_analysis(data, meta_analysis_options, decimal_places, alpha, tree, norm_ci, + sender=sender) sender.last_effect = meta_analysis_options.effect_data sender.last_var = meta_analysis_options.effect_vars - return output, figure, chart_data - return None, None, None + return output, chart_data + return None, None diff --git a/src/MetaWinAnalysisFunctions.py b/src/MetaWinAnalysisFunctions.py index f1b7872..6b82b84 100644 --- a/src/MetaWinAnalysisFunctions.py +++ b/src/MetaWinAnalysisFunctions.py @@ -601,7 +601,6 @@ def simple_meta_analysis(data, options, decimal_places: int = 4, alpha: float = output_blocks = output_filtered_bad(filtered, bad_data) - figure = None chart_data = None n = len(e_data) citations = [] @@ -670,15 +669,15 @@ def simple_meta_analysis(data, options, decimal_places: int = 4, alpha: float = citations.extend(new_cites) if options.create_graph: - figure, chart_data = MetaWinCharts.chart_forest_plot("basic analysis", effect_sizes.label, forest_data, - alpha, options.bootstrap_mean, normal_ci=norm_ci) + chart_data = MetaWinCharts.chart_forest_plot("basic analysis", effect_sizes.label, forest_data, + alpha, options.bootstrap_mean, normal_ci=norm_ci) else: output_blocks.append([get_text("Fewer than two studies were valid for analysis")]) qt, df, p, pooled_var, i2 = None, None, None, None, None mean_data = None - return output_blocks, figure, chart_data, simple_ma_values(mean_data, pooled_var, qt, df, p, i2), citations + return output_blocks, chart_data, simple_ma_values(mean_data, pooled_var, qt, df, p, i2), citations # ---------- grouped meta-analysis ---------- @@ -740,7 +739,6 @@ def grouped_meta_analysis(data, options, decimal_places: int = 4, alpha: float = output_blocks = output_filtered_bad(filtered, bad_data) - figure = None chart_data = None n = len(e_data) g_cnt = len(group_names) @@ -905,9 +903,8 @@ def grouped_meta_analysis(data, options, decimal_places: int = 4, alpha: float = citations.extend(new_cites) if options.create_graph: - figure, chart_data = MetaWinCharts.chart_forest_plot("grouped analysis", effect_sizes.label, forest_data, - alpha, options.bootstrap_mean, groups.label, - normal_ci=norm_ci) + chart_data = MetaWinCharts.chart_forest_plot("grouped analysis", effect_sizes.label, forest_data, alpha, + options.bootstrap_mean, groups.label, normal_ci=norm_ci) global_values = simple_ma_values(global_mean_data, pooled_var, qt, df, pqt, i2) else: @@ -917,7 +914,7 @@ def grouped_meta_analysis(data, options, decimal_places: int = 4, alpha: float = model_het = None error_het = None - return (output_blocks, figure, chart_data, + return (output_blocks, chart_data, group_ma_values(global_values, group_mean_values, group_het_values, model_het, error_het), citations) @@ -945,7 +942,6 @@ def cumulative_meta_analysis(data, options, decimal_places: int = 4, alpha: floa output_blocks = output_filtered_bad(filtered, bad_data) - figure = None chart_data = None n = len(tmp_data) if n > 1: @@ -1016,14 +1012,14 @@ def cumulative_meta_analysis(data, options, decimal_places: int = 4, alpha: floa decimal_places, alpha, options.log_transformed)) if options.create_graph: - figure, chart_data = MetaWinCharts.chart_forest_plot("cumulative analysis", effect_sizes.label, - cumulative_means, alpha, options.bootstrap_mean, - order.label, normal_ci=norm_ci) + chart_data = MetaWinCharts.chart_forest_plot("cumulative analysis", effect_sizes.label, + cumulative_means, alpha, options.bootstrap_mean, order.label, + normal_ci=norm_ci) else: output_blocks.append([get_text("Fewer than two studies were valid for analysis")]) - return output_blocks, figure, chart_data + return output_blocks, chart_data # ---------- simple regression meta-analysis ---------- @@ -1076,7 +1072,6 @@ def regression_meta_analysis(data, options, decimal_places: int = 4, alpha: floa output_blocks = output_filtered_bad(filtered, bad_data) - figure = None chart_data = None model_het = None error_het = None @@ -1205,14 +1200,13 @@ def regression_meta_analysis(data, options, decimal_places: int = 4, alpha: floa get_citation("Greenland_1987")) model = get_text("fixed effects") fig_citations = ["Hedges_Olkin_1985", "Greenland_1987"] - figure, chart_data = MetaWinCharts.chart_regression(options.independent_variable.label, effect_sizes.label, - x_data, e_data, b1_slope, b0_intercept, model, - ref_list, fig_citations) + chart_data = MetaWinCharts.chart_regression(options.independent_variable.label, effect_sizes.label, x_data, + e_data, b1_slope, b0_intercept, model, ref_list, fig_citations) else: output_blocks.append([get_text("Fewer than two studies were valid for analysis")]) - return output_blocks, figure, chart_data, reg_ma_values(global_values, model_het, error_het, predictors), citations + return output_blocks, chart_data, reg_ma_values(global_values, model_het, error_het, predictors), citations # ---------- complex (glm) meta-analysis ---------- @@ -1665,7 +1659,6 @@ def nested_meta_analysis(data, options, decimal_places: int = 4, alpha: float = n = len(e_data) - figure = None chart_data = None group_het_values = None group_mean_values = None @@ -1810,11 +1803,11 @@ def nested_meta_analysis(data, options, decimal_places: int = 4, alpha: float = citations.extend(new_cites) if options.create_graph: - figure, chart_data = MetaWinCharts.chart_forest_plot("nested analysis", effect_sizes.label, forest_data, - alpha, options.bootstrap_mean, normal_ci=norm_ci) + chart_data = MetaWinCharts.chart_forest_plot("nested analysis", effect_sizes.label, forest_data, alpha, + options.bootstrap_mean, normal_ci=norm_ci) - return (output_blocks, figure, chart_data, group_ma_values(global_values, group_mean_values, group_het_values, - model_het_values, error_het_values), citations) + return (output_blocks, chart_data, group_ma_values(global_values, group_mean_values, group_het_values, + model_het_values, error_het_values), citations) # ---------- trim-and-fill analysis ---------- @@ -1847,7 +1840,6 @@ def trim_and_fill_analysis(data, options, decimal_places: int = 4, alpha: float output_blocks = output_filtered_bad(filtered, bad_data) - figure = None chart_data = None n = len(e_data) citations = [] @@ -1969,13 +1961,12 @@ def trim_and_fill_analysis(data, options, decimal_places: int = 4, alpha: float decimal_places, alpha, options.log_transformed)) if options.create_graph: - figure, chart_data = MetaWinCharts.chart_trim_fill_plot(effect_sizes.label, tmp_data, n, original_mean, - mean_e) + chart_data = MetaWinCharts.chart_trim_fill_plot(effect_sizes.label, tmp_data, n, original_mean, mean_e) else: output_blocks.append([get_text("Fewer than two studies were valid for analysis")]) - return output_blocks, figure, chart_data, None, citations + return output_blocks, chart_data, None, citations # ---------- phylogenetic meta-analysis ---------- @@ -2275,7 +2266,6 @@ def jackknife_meta_analysis(data, options, decimal_places: int = 4, alpha: float output_blocks = output_filtered_bad(filtered, bad_data) - figure = None chart_data = None n = len(e_data) citations = [] @@ -2380,12 +2370,12 @@ def jackknife_meta_analysis(data, options, decimal_places: int = 4, alpha: float citations.extend(new_cites) if options.create_graph: - figure, chart_data = MetaWinCharts.chart_forest_plot("jackknife analysis", effect_sizes.label, forest_data, - alpha, options.bootstrap_mean, normal_ci=norm_ci) + chart_data = MetaWinCharts.chart_forest_plot("jackknife analysis", effect_sizes.label, forest_data, alpha, + options.bootstrap_mean, normal_ci=norm_ci) else: output_blocks.append([get_text("Fewer than two studies were valid for analysis")]) - return output_blocks, figure, chart_data, citations + return output_blocks, chart_data, citations # ---------- rank correlation analysis ---------- diff --git a/src/MetaWinCharts.py b/src/MetaWinCharts.py index 3a07a9a..0083453 100644 --- a/src/MetaWinCharts.py +++ b/src/MetaWinCharts.py @@ -3,13 +3,13 @@ """ import math -from typing import Optional, Tuple, Union +from typing import Optional, Union from matplotlib import patches from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg +from matplotlib.figure import Figure # the following import is necessary to force pyinstaller to include these backends for vector output when packaging from matplotlib.backends import backend_svg, backend_ps, backend_pgf, backend_pdf -from matplotlib.figure import Figure from matplotlib.colors import XKCD_COLORS, hex2color import numpy import scipy.stats @@ -46,11 +46,6 @@ "tick down", "upward caret", "downward caret", "left caret", "right caret", "centered upward caret", "centered downward caret", "centered left caret", "centered right caret"} -# I need a single hook to the FigureCanvasQTAgg that I can use to erase existing figures prior -# to creating new ones, otherwise the save figure function will try to serially save every -# figure that had been created. This is currently the cleanest solution I can find. -FIGURE_CANVAS = FigureCanvasQTAgg(Figure(figsize=(8, 6))) - # ---------- Chart Data Classes ---------- # class BaseChartData: @@ -759,19 +754,20 @@ def export_to_list(self): return outlist -def base_figure(): +def base_figure(figure_canvas): """ create the baseline figure used for all plots """ - figure_canvas = FIGURE_CANVAS + # figure_canvas = FIGURE_CANVAS figure_canvas.figure.clf() # clean any existing figures faxes = figure_canvas.figure.subplots() faxes.spines["right"].set_visible(False) faxes.spines["top"].set_visible(False) - return figure_canvas, faxes + # return figure_canvas, faxes + return faxes -def create_figure(chart_data): +def create_figure(chart_data, figure_canvas): """ create a figure given pre-determined chart data @@ -779,7 +775,7 @@ def create_figure(chart_data): which subsequently can allow user modification of plot styles and redrawing of the figure w/o needing to recalculate anything """ - figure_canvas, faxes = base_figure() + faxes = base_figure(figure_canvas) faxes.set_ylabel(chart_data.y_label) faxes.set_xlabel(chart_data.x_label) for data in chart_data.data: @@ -815,12 +811,10 @@ def create_figure(chart_data): if chart_data.rescale_x is not None: faxes.set_xlim(chart_data.rescale_x[0], chart_data.rescale_x[1]) - return figure_canvas - def chart_forest_plot(analysis_type: str, effect_name, forest_data, alpha: float = 0.05, bootstrap_n: Optional[int] = None, extra_name: Optional[str] = None, - normal_ci: bool = True) -> Tuple[FigureCanvasQTAgg, ChartData]: + normal_ci: bool = True) -> ChartData: chart_data = ChartData(analysis_type) chart_data.caption.e_label = effect_name chart_data.caption.alpha = alpha @@ -888,8 +882,7 @@ def chart_forest_plot(analysis_type: str, effect_name, forest_data, alpha: float bias_cis, ci_y_data, marker=7, zorder=4, color="#d62728", label="{:0.0%} CI (bias-corrected bootstrap)".format(1-alpha)) - figure_canvas = create_figure(chart_data) - return figure_canvas, chart_data + return chart_data def add_regression_to_chart(x_name: str, y_name: str, x_data, y_data, slope: float, intercept: float, @@ -905,7 +898,7 @@ def add_regression_to_chart(x_name: str, y_name: str, x_data, y_data, slope: flo def chart_regression(x_name, y_name, x_data, y_data, slope, intercept, model, ref_list, - citations) -> Tuple[FigureCanvasQTAgg, ChartData]: + citations) -> ChartData: x_min = numpy.min(x_data) x_max = numpy.max(x_data) chart_data = ChartData("regression") @@ -917,8 +910,7 @@ def chart_regression(x_name, y_name, x_data, y_data, slope, intercept, model, re add_regression_to_chart(x_name, y_name, x_data, y_data, slope, intercept, x_min, x_max, chart_data) - figure_canvas = create_figure(chart_data) - return figure_canvas, chart_data + return chart_data def add_quantile_axes_to_chart(x_data, y_data, slope: float, intercept: float, chart_data, alpha: float = 0.05) -> None: @@ -956,15 +948,14 @@ def add_quantile_axes_to_chart(x_data, y_data, slope: float, intercept: float, c def chart_normal_quantile(x_name, y_name, x_data, y_data, slope, intercept, - alpha: float = 0.05) -> Tuple[FigureCanvasQTAgg, ChartData]: + alpha: float = 0.05) -> ChartData: chart_data = ChartData("normal quantile") add_quantile_axes_to_chart(x_data, y_data, slope, intercept, chart_data, alpha) x_min = numpy.min(x_data) x_max = numpy.max(x_data) add_regression_to_chart(x_name, y_name, x_data, y_data, slope, intercept, x_min, x_max, chart_data) - figure_canvas = create_figure(chart_data) - return figure_canvas, chart_data + return chart_data def add_radial_curve_to_chart(effect_label: str, r: float, min_e: float, max_e: float, chart_data, @@ -1042,8 +1033,7 @@ def add_radial_curve_to_chart(effect_label: str, r: float, min_e: float, max_e: chart_data.add_line(get_text("Vertical Axis Zero Line"), 0, 0, r+1, 0, color="silver", linestyle="dotted") -def chart_radial(e_name, x_data, y_data, slope, min_e, max_e, is_log: bool = False) -> Tuple[FigureCanvasQTAgg, - ChartData]: +def chart_radial(e_name, x_data, y_data, slope, min_e, max_e, is_log: bool = False) -> ChartData: chart_data = ChartData("radial") chart_data.caption.e_label = e_name max_d = numpy.max(numpy.sqrt(numpy.square(x_data) + numpy.square(y_data)))+1 @@ -1054,12 +1044,10 @@ def chart_radial(e_name, x_data, y_data, slope, min_e, max_e, is_log: bool = Fal add_radial_curve_to_chart(e_name, max_d, min_e, max_e, chart_data, is_log) chart_data.rescale_x = (0, max_d+2) - figure_canvas = create_figure(chart_data) - return figure_canvas, chart_data + return chart_data -def chart_histogram(e_data, w_data, n_bins, e_label, - weighted: int = WEIGHT_NONE) -> Tuple[FigureCanvasQTAgg, ChartData]: +def chart_histogram(e_data, w_data, n_bins, e_label, weighted: int = WEIGHT_NONE) -> ChartData: if weighted == WEIGHT_NONE: cnts, bins = numpy.histogram(e_data, n_bins) y_label = get_text("Count") @@ -1075,8 +1063,7 @@ def chart_histogram(e_data, w_data, n_bins, e_label, chart_data.y_label = y_label chart_data.add_histogram("Bin Counts", cnts, bins, edgecolor="black", linewidth=1) - figure_canvas = create_figure(chart_data) - return figure_canvas, chart_data + return chart_data def draw_tree(faxes, tree, minx, maxx, miny, maxy, scale, draw_labels: bool = False, draw_branch_lengths: bool = False): @@ -1175,7 +1162,7 @@ def chart_phylogeny(root) -> FigureCanvasQTAgg: return figure_canvas -def chart_scatter(x_data, y_data, x_label: str = "x", y_label: str = "y") -> Tuple[FigureCanvasQTAgg, ChartData]: +def chart_scatter(x_data, y_data, x_label: str = "x", y_label: str = "y") -> ChartData: chart_data = ChartData("scatter plot") chart_data.caption.x_label = x_label chart_data.caption.y_label = y_label @@ -1183,11 +1170,10 @@ def chart_scatter(x_data, y_data, x_label: str = "x", y_label: str = "y") -> Tup chart_data.y_label = y_label chart_data.add_scatter(get_text("Point Data"), x_data, y_data) - figure_canvas = create_figure(chart_data) - return figure_canvas, chart_data + return chart_data -def chart_trim_fill_plot(effect_label, data, n, original_mean, new_mean) -> Tuple[FigureCanvasQTAgg, ChartData]: +def chart_trim_fill_plot(effect_label, data, n, original_mean, new_mean) -> ChartData: chart_data = ChartData("trim and fill") chart_data.caption.e_label = effect_label chart_data.x_label = effect_label @@ -1214,8 +1200,7 @@ def chart_trim_fill_plot(effect_label, data, n, original_mean, new_mean) -> Tupl chart_data.caption.inferred_mean = chart_data.add_line(get_text("Inferred Mean"), new_mean, y_min, new_mean, y_max, color="red", linestyle="dashed", zorder=1) - figure_canvas = create_figure(chart_data) - return figure_canvas, chart_data + return chart_data def find_color_name(color: str) -> str: diff --git a/src/MetaWinDraw.py b/src/MetaWinDraw.py index bc53f10..82ee083 100644 --- a/src/MetaWinDraw.py +++ b/src/MetaWinDraw.py @@ -370,10 +370,8 @@ def draw_scatter_plot(data, x_data_col, y_data_col): if len(x_data) > 0: x_data = numpy.array(x_data) y_data = numpy.array(y_data) - figure, chart_data = MetaWinCharts.chart_scatter(x_data, y_data, x_data_col.label, y_data_col.label) - # fig_caption = get_text("Scatter plot of {} vs. {}.").format(y_data_col.label, x_data_col.label) - return figure, chart_data - return None, None + return MetaWinCharts.chart_scatter(x_data, y_data, x_data_col.label, y_data_col.label) + return None def draw_scatter_dialog(sender, data): @@ -381,12 +379,12 @@ def draw_scatter_dialog(sender, data): if sender.draw_dialog.exec(): x_data_col = sender.draw_dialog.columns[sender.draw_dialog.x_box.currentIndex()] y_data_col = sender.draw_dialog.columns[sender.draw_dialog.y_box.currentIndex()] - figure, chart_data = draw_scatter_plot(data, x_data_col, y_data_col) - if figure is not None: - return figure, chart_data + chart_data = draw_scatter_plot(data, x_data_col, y_data_col) + if chart_data is not None: + return chart_data else: MetaWinMessages.report_critical(sender, "Error", "No valid data found for given options.") - return None, None + return None def calculate_regression(x: numpy.array, y: numpy.array) -> Tuple[float, float]: @@ -429,14 +427,9 @@ def draw_normal_quantile_plot(data, e_data_col, v_data_col, alpha: float = 0.05) y_data = numpy.array(y_data) slope, intercept = calculate_regression(x_data, y_data) - figure, chart_data = MetaWinCharts.chart_normal_quantile(get_text("Normal Quantile"), - get_text("Standardized Effect Size"), - x_data, y_data, slope, intercept, alpha) - # fig_caption = get_text("normal_quantile_caption").format(get_citation("Wang_and_Bushman_1998")) + \ - # create_reference_list(["Wang_and_Bushman_1998"], True) - - return figure, chart_data - return None, None + return MetaWinCharts.chart_normal_quantile(get_text("Normal Quantile"), get_text("Standardized Effect Size"), + x_data, y_data, slope, intercept, alpha) + return None def draw_normal_quantile_dialog(sender, data, last_effect, last_var, alpha: float = 0.05): @@ -444,12 +437,12 @@ def draw_normal_quantile_dialog(sender, data, last_effect, last_var, alpha: floa if sender.draw_dialog.exec(): e_data_col = sender.draw_dialog.columns[sender.draw_dialog.effect_size_box.currentIndex()] v_data_col = sender.draw_dialog.columns[sender.draw_dialog.variance_box.currentIndex()] - figure, chart_data = draw_normal_quantile_plot(data, e_data_col, v_data_col, alpha) - if figure is not None: - return figure, chart_data + chart_data = draw_normal_quantile_plot(data, e_data_col, v_data_col, alpha) + if chart_data is not None: + return chart_data else: MetaWinMessages.report_critical(sender, "Error", "No valid data found for given options.") - return None, None + return None def draw_radial_plot(data, e_data_col, v_data_col, is_log: bool = False): @@ -480,12 +473,8 @@ def draw_radial_plot(data, e_data_col, v_data_col, is_log: bool = False): # calculate a regression through the origin, rather than with an intercept slope_through_origin = numpy.sum(x_data*y_data)/numpy.sum(numpy.square(x_data)) - figure, chart_data = MetaWinCharts.chart_radial(e_data_col.label, x_data, y_data, slope_through_origin, min_e, - max_e, is_log) - # fig_caption = get_text("Radial_chart_caption").format(e_data_col.label) - # fig_caption += create_reference_list(["Galbraith_1988", "Galbraith_1994"], True) - return figure, chart_data - return None, None + return MetaWinCharts.chart_radial(e_data_col.label, x_data, y_data, slope_through_origin, min_e, max_e, is_log) + return None def draw_radial_dialog(sender, data, last_effect, last_var): @@ -494,12 +483,12 @@ def draw_radial_dialog(sender, data, last_effect, last_var): e_data_col = sender.draw_dialog.columns[sender.draw_dialog.effect_size_box.currentIndex()] v_data_col = sender.draw_dialog.columns[sender.draw_dialog.variance_box.currentIndex()] is_log = sender.draw_dialog.log_transform_box.isChecked() - figure, chart_data = draw_radial_plot(data, e_data_col, v_data_col, is_log) - if figure is not None: - return figure, chart_data + chart_data = draw_radial_plot(data, e_data_col, v_data_col, is_log) + if chart_data is not None: + return chart_data else: MetaWinMessages.report_critical(sender, "Error", "No valid data found for given options.") - return None, None + return None def draw_histogram_plot(data, e_data_col, w_data_col, weight_type, n_bins: int): @@ -533,9 +522,8 @@ def draw_histogram_plot(data, e_data_col, w_data_col, weight_type, n_bins: int): if len(e_data) > 0: e_data = numpy.array(e_data) w_data = numpy.array(w_data) - figure, chart_data = MetaWinCharts.chart_histogram(e_data, w_data, n_bins, e_data_col.label, weight_type) - return figure, chart_data - return None, None + return MetaWinCharts.chart_histogram(e_data, w_data, n_bins, e_data_col.label, weight_type) + return None def draw_histogram_dialog(sender, data, last_effect, last_var): @@ -550,12 +538,12 @@ def draw_histogram_dialog(sender, data, last_effect, last_var): else: weight_type = MetaWinCharts.WEIGHT_NONE n_bins = int(sender.draw_dialog.bin_edit.text()) - figure, chart_data = draw_histogram_plot(data, e_data_col, w_data_col, weight_type, n_bins) - if figure is not None: - return figure, chart_data + chart_data = draw_histogram_plot(data, e_data_col, w_data_col, weight_type, n_bins) + if chart_data is not None: + return chart_data else: MetaWinMessages.report_critical(sender, "Error", "No valid data found for given options.") - return None, None + return None def draw_forest_plot(data, e_data_col, v_data_col, alpha: float = 0.05): @@ -576,11 +564,7 @@ def draw_forest_plot(data, e_data_col, v_data_col, alpha: float = 0.05): else: filtered.append(row.label) - figure, chart_data = MetaWinCharts.chart_forest_plot("forest plot", e_data_col.label, data_list, alpha, None) - - # fig_caption = get_text("Forest plot of individual effect sizes for each study.") + \ - # MetaWinCharts.common_forest_plot_caption(e_data_col.label, alpha, inc_median=False) - return figure, chart_data + return MetaWinCharts.chart_forest_plot("forest plot", e_data_col.label, data_list, alpha, None) def draw_forest_dialog(sender, data, last_effect, last_var, alpha: float = 0.05): @@ -588,16 +572,16 @@ def draw_forest_dialog(sender, data, last_effect, last_var, alpha: float = 0.05) if sender.draw_dialog.exec(): e_data_col = sender.draw_dialog.columns[sender.draw_dialog.effect_size_box.currentIndex()] v_data_col = sender.draw_dialog.columns[sender.draw_dialog.variance_box.currentIndex()] - figure, chart_data = draw_forest_plot(data, e_data_col, v_data_col, alpha) - if figure is not None: - return figure, chart_data + chart_data = draw_forest_plot(data, e_data_col, v_data_col, alpha) + if chart_data is not None: + return chart_data else: MetaWinMessages.report_critical(sender, "Error", "No valid data found for given options.") - return None, None + return None def edit_figure(sender, chart_data): sender.edit_fig_dialog = MetaAnalysisEditFigure(chart_data) if sender.edit_fig_dialog.exec(): - return MetaWinCharts.create_figure(chart_data) + return chart_data return None diff --git a/src/MetaWinMain.py b/src/MetaWinMain.py index 6a92426..c879ba1 100644 --- a/src/MetaWinMain.py +++ b/src/MetaWinMain.py @@ -11,7 +11,8 @@ QWidgetAction, QComboBox from PyQt6.QtGui import QIcon, QColor, QAction, QActionGroup, QTextCursor from PyQt6 import QtCore -from matplotlib.backends.backend_qtagg import NavigationToolbar2QT +from matplotlib.backends.backend_qtagg import NavigationToolbar2QT, FigureCanvasQTAgg +from matplotlib.figure import Figure import MetaWinCharts from MetaWinAbout import MetaWinAbout @@ -77,6 +78,8 @@ def __init__(self, config: dict): self.empty_col_num = 10 self.empty_row_num = 15 self.chart_data = None + self.figure_canvas = None + self.caption_box = None self.init_ui() def init_ui(self): @@ -338,6 +341,12 @@ def init_ui(self): self.graph_toolbar.addAction(export_graph_data_action) self.graph_toolbar.addAction(edit_graph_action) graph_master_layout.addWidget(self.graph_toolbar) + self.figure_canvas = FigureCanvasQTAgg(Figure(figsize=(8, 6))) + toolbar = NavigationToolbar2QT(self.figure_canvas, None) + self.save_graph_action.triggered.connect(toolbar.save_figure) + self.caption_box = QTextEdit() + self.graph_layout.addWidget(self.figure_canvas, stretch=8) + self.graph_layout.addWidget(self.caption_box, stretch=1) graph_master_layout.addLayout(self.graph_layout) self.graph_area.setLayout(graph_master_layout) self.main_area.addTab(self.graph_area, QIcon(MetaWinConstants.graph_icon), get_text("Graph")) @@ -711,35 +720,26 @@ def meta_analysis(self) -> None: norm_ci = False else: norm_ci = True - output, figure, chart_data = MetaWinAnalysis.meta_analysis(self, self.data, self.last_effect, - self.last_var, self.output_decimals, - self.alpha, self.phylogeny, norm_ci) + output, chart_data = MetaWinAnalysis.meta_analysis(self, self.data, self.last_effect, self.last_var, + self.output_decimals, self.alpha, self.phylogeny, + norm_ci) if output is not None: self.write_multi_output_blocks(output) self.main_area.setCurrentIndex(1) - if figure is not None: - self.show_figure(figure, chart_data) + if chart_data is not None: + self.show_figure(chart_data) else: MetaWinMessages.report_warning(self, get_text("Warning"), get_text("No data has been loaded.")) - def show_figure(self, figure, chart_data) -> None: + def show_figure(self, chart_data) -> None: """ - Replace the current figure in the graphics tab with a new figure, toolbar, and caption + Create a new figure based on the chart_data, display it and its caption """ self.main_area.setTabVisible(2, True) - # erase existing figure elements - for i in reversed(range(self.graph_layout.count())): - self.graph_layout.itemAt(i).widget().setParent(None) - - # create new figure - toolbar = NavigationToolbar2QT(figure, None) - self.save_graph_action.triggered.connect(toolbar.save_figure) - caption_box = QTextEdit() - caption_box.setText(chart_data.caption_text()) - self.graph_layout.addWidget(figure, stretch=8) - self.graph_layout.addWidget(caption_box, stretch=1) + self.caption_box.setText(chart_data.caption_text()) self.chart_data = chart_data - figure.draw() + MetaWinCharts.create_figure(chart_data, self.figure_canvas) + self.figure_canvas.draw() def load_phylogeny(self) -> None: inname = QFileDialog.getOpenFileName(self, get_text("Load Phylogeny")) @@ -759,39 +759,37 @@ def refresh_tree_panel(self) -> None: def draw_scatter_plot(self) -> None: if self.data is not None: - figure, chart_data = MetaWinDraw.draw_scatter_dialog(self, self.data) - if figure is not None: - self.show_figure(figure, chart_data) + chart_data = MetaWinDraw.draw_scatter_dialog(self, self.data) + if chart_data is not None: + self.show_figure(chart_data) self.main_area.setCurrentIndex(2) def draw_histogram(self) -> None: if self.data is not None: - figure, chart_data = MetaWinDraw.draw_histogram_dialog(self, self.data, self.last_effect, self.last_var) - if figure is not None: - self.show_figure(figure, chart_data) + chart_data = MetaWinDraw.draw_histogram_dialog(self, self.data, self.last_effect, self.last_var) + if chart_data is not None: + self.show_figure(chart_data) self.main_area.setCurrentIndex(2) def draw_normal_quantile_plot(self) -> None: if self.data is not None: - figure, chart_data = MetaWinDraw.draw_normal_quantile_dialog(self, self.data, self.last_effect, - self.last_var) - if figure is not None: - self.show_figure(figure, chart_data) + chart_data = MetaWinDraw.draw_normal_quantile_dialog(self, self.data, self.last_effect, self.last_var) + if chart_data is not None: + self.show_figure(chart_data) self.main_area.setCurrentIndex(2) def draw_radial_plot(self) -> None: if self.data is not None: - figure, chart_data = MetaWinDraw.draw_radial_dialog(self, self.data, self.last_effect, self.last_var) - if figure is not None: - self.show_figure(figure, chart_data) + chart_data = MetaWinDraw.draw_radial_dialog(self, self.data, self.last_effect, self.last_var) + if chart_data is not None: + self.show_figure(chart_data) self.main_area.setCurrentIndex(2) def draw_forest_plot(self) -> None: if self.data is not None: - figure, chart_data = MetaWinDraw.draw_forest_dialog(self, self.data, self.last_effect, self.last_var, - self.alpha) - if figure is not None: - self.show_figure(figure, chart_data) + chart_data = MetaWinDraw.draw_forest_dialog(self, self.data, self.last_effect, self.last_var, self.alpha) + if chart_data is not None: + self.show_figure(chart_data) self.main_area.setCurrentIndex(2) def clear_filters(self) -> None: @@ -862,9 +860,9 @@ def export_graph_data(self): def edit_graph(self): if self.chart_data is not None: - figure = MetaWinDraw.edit_figure(self, self.chart_data) - if figure is not None: - self.show_figure(figure, self.chart_data) + chart_data = MetaWinDraw.edit_figure(self, self.chart_data) + if chart_data is not None: + self.show_figure(chart_data) def change_conf_int_distribution(self): if self.confidence_interval_dist == "Normal": diff --git a/tests/test_metawin.py b/tests/test_metawin.py index 4cb021c..8c936b6 100644 --- a/tests/test_metawin.py +++ b/tests/test_metawin.py @@ -16,6 +16,8 @@ from PyQt6.QtWidgets import QDialog, QVBoxLayout, QFrame, QPushButton, QTextEdit import matplotlib.colors as mcolors +from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg +from matplotlib.figure import Figure # note these may be marked by the IDE as unknown modules, but pytest.ini will resolve the errors when tests # are actually executed @@ -30,20 +32,32 @@ TEST_FIGURES = True +# if the following line is not present, the tests with figures all crash for no obvious +# reason. The call must be preloading something +FIGURE_CANVAS = FigureCanvasQTAgg(Figure(figsize=(8, 6))) class TestFigureDialog(QDialog): - def __init__(self, figure, caption): + def __init__(self, chart_data, figure=None): super().__init__() - self.init_ui(figure, caption) + self.init_ui(chart_data, figure) - def init_ui(self, figure, caption): + def init_ui(self, chart_data, prefigure=None): ok_button = QPushButton("Ok") ok_button.clicked.connect(self.accept) figure_layout = QVBoxLayout() + if prefigure is None: + figure = FigureCanvasQTAgg(Figure(figsize=(8, 6))) + MetaWinCharts.create_figure(chart_data, figure) + else: + figure = prefigure + figure.draw() figure_layout.addWidget(figure) caption_area = QTextEdit() - caption_area.setText(caption) + if isinstance(chart_data, str): + caption_area.setText(chart_data) + else: + caption_area.setText(chart_data.caption_text()) main_frame = QFrame() main_frame.setLayout(figure_layout) main_layout = QVBoxLayout() @@ -292,11 +306,11 @@ def test_simple_meta_analysis(): options.rosenberg_failsafe = 0.05 options.create_graph = True - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() mean_values = analysis_values.mean_data @@ -329,11 +343,11 @@ def test_simple_meta_analysis_lep(): options.effect_vars = data.cols[5] options.create_graph = True - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() mean_values = analysis_values.mean_data @@ -357,7 +371,7 @@ def test_i2_confidence_interval(): options.effect_vars = data.cols[1] options.create_graph = False - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) @@ -379,11 +393,11 @@ def test_simple_meta_analysis_lep_randeff(): options.effect_vars = data.cols[5] options.create_graph = True - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() mean_values = analysis_values.mean_data @@ -419,7 +433,7 @@ def test_simple_meta_analysis_random_effects(): options.rosenthal_failsafe = 0.05 options.rosenberg_failsafe = 0.05 - output, _, _, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, _, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) mean_values = analysis_values.mean_data @@ -457,10 +471,10 @@ def test_simple_meta_analysis_bootstrap(): options.bootstrap_mean = 9999 options.create_graph = True - output, figure, chart_data, _ = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, _ = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -497,11 +511,11 @@ def test_group_meta_analysis_lep_suborders(): options.groups = data.cols[1] options.create_graph = True - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() global_values = analysis_values.global_values @@ -551,11 +565,11 @@ def test_group_meta_analysis_lep_suborders_rand_eff(): options.random_effects = True options.create_graph = True - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() global_values = analysis_values.global_values @@ -632,11 +646,11 @@ def test_group_meta_analysis_lep_families(): options.create_graph = True data.cols[2].group_filter = ["Yponomeutidae", "Lycaenidae", "Hesperiidae"] - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() global_values = analysis_values.global_values @@ -675,10 +689,10 @@ def test_group_meta_analysis_bootstrap(): options.bootstrap_mean = 9999 options.create_graph = True - output, figure, chart_data, _ = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, _ = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -695,10 +709,10 @@ def test_group_meta_analysis_lrr(): options.create_graph = True - output, figure, chart_data, _ = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, _ = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -727,10 +741,10 @@ def test_cumulative_meta_analysis(): options.create_graph = True - output, figure, chart_data, _ = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, _ = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -746,10 +760,10 @@ def test_cumulative_meta_analysis_bootstrap(): options.create_graph = True - output, figure, chart_data, _ = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, _ = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -775,11 +789,11 @@ def test_regression_meta_analysis_lep(): options.independent_variable = data.cols[3] options.create_graph = True - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() global_values = analysis_values.global_values @@ -821,11 +835,11 @@ def test_regression_meta_analysis_lep_randeff(): options.random_effects = True options.create_graph = True - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() global_values = analysis_values.global_values @@ -886,7 +900,7 @@ def test_complex_meta_analysis_lep_simple_regression(): options.continuous_vars = [data.cols[3]] options.create_graph = True - output, _, _, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, _, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) global_values = analysis_values.global_values @@ -932,7 +946,7 @@ def test_complex_meta_analysis_lep_group(): options.continuous_vars = [] options.create_graph = True - output, _, _, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, _, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) global_values = analysis_values.global_values @@ -980,7 +994,7 @@ def test_complex_meta_analysis_lep(): options.continuous_vars = [data.cols[3]] options.create_graph = True - output, _, _, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, _, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) global_values = analysis_values.global_values @@ -1039,7 +1053,7 @@ def test_complex_meta_analysis_lep_randomeff(): options.random_effects = True options.create_graph = True - output, _, _, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, _, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) global_values = analysis_values.global_values @@ -1102,11 +1116,11 @@ def test_nested_meta_analysis_lep(): options.create_graph = True data.cols[2].group_filter = ["Yponomeutidae", "Lycaenidae", "Hesperiidae"] - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() global_values = analysis_values.global_values @@ -1205,7 +1219,7 @@ def test_tree_import(): if TEST_FIGURES: figure = MetaWinCharts.chart_phylogeny(tree) - test_win = TestFigureDialog(figure, "imported phylogeny") + test_win = TestFigureDialog("imported phylogeny", figure) test_win.exec() @@ -1214,8 +1228,8 @@ def test_scatter_plot(): x_col = data.cols[11] y_col = data.cols[10] if TEST_FIGURES: - figure, chart_data = MetaWinDraw.draw_scatter_plot(data, x_col, y_col) - test_win = TestFigureDialog(figure, chart_data.caption_text()) + chart_data = MetaWinDraw.draw_scatter_plot(data, x_col, y_col) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -1224,8 +1238,8 @@ def test_normal_quantile_plot(): e_col = data.cols[10] v_col = data.cols[11] if TEST_FIGURES: - figure, chart_data = MetaWinDraw.draw_normal_quantile_plot(data, e_col, v_col) - test_win = TestFigureDialog(figure, chart_data.caption_text()) + chart_data = MetaWinDraw.draw_normal_quantile_plot(data, e_col, v_col) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -1234,8 +1248,8 @@ def test_radial_plot_d(): e_col = data.cols[10] v_col = data.cols[11] if TEST_FIGURES: - figure, chart_data = MetaWinDraw.draw_radial_plot(data, e_col, v_col, False) - test_win = TestFigureDialog(figure, chart_data.caption_text()) + chart_data = MetaWinDraw.draw_radial_plot(data, e_col, v_col, False) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -1244,8 +1258,8 @@ def test_radial_plot_lnrr(): e_col = data.cols[10] v_col = data.cols[11] if TEST_FIGURES: - figure, chart_data = MetaWinDraw.draw_radial_plot(data, e_col, v_col, True) - test_win = TestFigureDialog(figure, chart_data.caption_text()) + chart_data = MetaWinDraw.draw_radial_plot(data, e_col, v_col, True) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -1254,8 +1268,8 @@ def test_histogram_d_unweighted(): e_col = data.cols[10] v_col = data.cols[11] if TEST_FIGURES: - figure, chart_data = MetaWinDraw.draw_histogram_plot(data, e_col, v_col, 0, 10) - test_win = TestFigureDialog(figure, chart_data.caption_text()) + chart_data = MetaWinDraw.draw_histogram_plot(data, e_col, v_col, 0, 10) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -1264,8 +1278,8 @@ def test_histogram_d_weighted_invvar(): e_col = data.cols[10] v_col = data.cols[11] if TEST_FIGURES: - figure, chart_data = MetaWinDraw.draw_histogram_plot(data, e_col, v_col, 1, 10) - test_win = TestFigureDialog(figure, chart_data.caption_text()) + chart_data = MetaWinDraw.draw_histogram_plot(data, e_col, v_col, 1, 10) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -1274,8 +1288,8 @@ def test_histogram_d_weighted_sample_size(): e_col = data.cols[10] v_col = data.cols[2] if TEST_FIGURES: - figure, chart_data = MetaWinDraw.draw_histogram_plot(data, e_col, v_col, 2, 15) - test_win = TestFigureDialog(figure, chart_data.caption_text()) + chart_data = MetaWinDraw.draw_histogram_plot(data, e_col, v_col, 2, 15) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -1284,8 +1298,8 @@ def test_forest_plot(): e_col = data.cols[10] v_col = data.cols[11] if TEST_FIGURES: - figure, chart_data = MetaWinDraw.draw_forest_plot(data, e_col, v_col) - test_win = TestFigureDialog(figure, chart_data.caption_text()) + chart_data = MetaWinDraw.draw_forest_plot(data, e_col, v_col) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -1310,11 +1324,11 @@ def test_trim_and_fill_analysis(): options.create_graph = True options.k_estimator = "L" - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -1339,11 +1353,11 @@ def test_trim_and_fill_analysis_negative_mean(): options.create_graph = True options.k_estimator = "R" - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -1368,11 +1382,11 @@ def test_jackknife(): options.effect_vars = data.cols[5] options.create_graph = True - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) if TEST_FIGURES: - test_win = TestFigureDialog(figure, chart_data.caption_text()) + test_win = TestFigureDialog(chart_data) test_win.exec() @@ -1391,21 +1405,21 @@ def test_phylogenetic_simple_test(): options.tip_names = data.cols[0] print("UNWEIGHTED") options.structure = MetaWinAnalysis.SIMPLE_MA - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) print() print() print("WEIGHTED") options.effect_vars = data.cols[2] - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) print() print() print("PHYLOGENETIC") options.structure = MetaWinAnalysis.PHYLOGENETIC_MA - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4, tree=tree) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4, tree=tree) print_test_output(output) @@ -1422,11 +1436,11 @@ def test_phylogenetic_glm_simple(): options.random_effects = True options.structure = MetaWinAnalysis.SIMPLE_MA - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) options.structure = MetaWinAnalysis.PHYLOGENETIC_MA print(data.column_labels()[1]) - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4, tree=tree) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4, tree=tree) print_test_output(output) print() @@ -1438,10 +1452,10 @@ def test_phylogenetic_glm_simple(): options.effect_vars = data.cols[4] options.structure = MetaWinAnalysis.SIMPLE_MA - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) options.structure = MetaWinAnalysis.PHYLOGENETIC_MA - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4, tree=tree) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4, tree=tree) print_test_output(output) print() @@ -1452,10 +1466,10 @@ def test_phylogenetic_glm_simple(): options.effect_data = data.cols[5] options.effect_vars = data.cols[6] options.structure = MetaWinAnalysis.SIMPLE_MA - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) options.structure = MetaWinAnalysis.PHYLOGENETIC_MA - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4, tree=tree) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4, tree=tree) print_test_output(output) print() @@ -1466,10 +1480,10 @@ def test_phylogenetic_glm_simple(): options.effect_data = data.cols[7] options.effect_vars = data.cols[8] options.structure = MetaWinAnalysis.SIMPLE_MA - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) options.structure = MetaWinAnalysis.PHYLOGENETIC_MA - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4, tree=tree) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4, tree=tree) print_test_output(output) print() @@ -1480,10 +1494,10 @@ def test_phylogenetic_glm_simple(): options.effect_data = data.cols[9] options.effect_vars = data.cols[10] options.structure = MetaWinAnalysis.SIMPLE_MA - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) options.structure = MetaWinAnalysis.PHYLOGENETIC_MA - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4, tree=tree) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4, tree=tree) print_test_output(output) print() @@ -1494,10 +1508,10 @@ def test_phylogenetic_glm_simple(): options.effect_data = data.cols[11] options.effect_vars = data.cols[12] options.structure = MetaWinAnalysis.SIMPLE_MA - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4) print_test_output(output) options.structure = MetaWinAnalysis.PHYLOGENETIC_MA - output, figure, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4, tree=tree) + output, chart_data, analysis_values = MetaWinAnalysis.do_meta_analysis(data, options, 4, tree=tree) print_test_output(output)