diff --git a/bob/measure/script/common_options.py b/bob/measure/script/common_options.py index 5a7e4f84766b7074c2863575ea844e03267bee5e..1f53ecfb9463a1f79a7ec251882ee319dc7b4fb1 100644 --- a/bob/measure/script/common_options.py +++ b/bob/measure/script/common_options.py @@ -491,7 +491,7 @@ def legends_option(**kwargs): return value return click.option( '-lg', '--legends', type=click.STRING, default=None, - help='The title for each system comma separated. ' + help='The legend for each system comma separated. ' 'Example: --legends ISV,CNN', callback=callback, **kwargs)(func) return custom_legends_option @@ -779,7 +779,7 @@ def hist_command(docstring): @eval_option() @hide_dev_option() @n_bins_option() - @legends_option() + @titles_option() @no_legend_option() @legend_ncols_option() @criterion_option() diff --git a/bob/measure/script/figure.py b/bob/measure/script/figure.py index b0d5a497357c0190c2ef470942ef740b0dfb41a1..c5bec6a74fe194385cc88e8eee25c485f47f5dac 100644 --- a/bob/measure/script/figure.py +++ b/bob/measure/script/figure.py @@ -168,7 +168,9 @@ class Metrics(MeasureBase): ''' def __init__(self, ctx, scores, evaluation, func_load, - names=('FtA', 'FMR', 'FNMR', 'FAR', 'FRR', 'HTER')): + names=('NaNs Rate', 'False Positive Rate', 'False Negative Rate', + 'False Accept Rate', 'False Reject Rate', + 'Half Total Error Rate')): super(Metrics, self).__init__(ctx, scores, evaluation, func_load) self.names = names self._tablefmt = ctx.meta.get('tablefmt') @@ -484,7 +486,7 @@ class Roc(PlotBase): def __init__(self, ctx, scores, evaluation, func_load): super(Roc, self).__init__(ctx, scores, evaluation, func_load) - self._titles = self._titles or ['ROC dev', 'ROC eval'] + self._titles = self._titles or ['ROC dev.', 'ROC eval.'] self._x_label = self._x_label or 'False Positive Rate' self._y_label = self._y_label or "1 - False Negative Rate" self._semilogx = ctx.meta.get('semilogx', True) @@ -522,7 +524,7 @@ class Roc(PlotBase): far_values=plot.log_values(self._min_dig or -4), CAR=self._semilogx, color=self._colors[idx], - label=self._label('eval', eval_file, idx) + label=self._label('eval.', eval_file, idx) ) if self._far_at is not None: from .. import farfrr @@ -548,7 +550,7 @@ class Det(PlotBase): def __init__(self, ctx, scores, evaluation, func_load): super(Det, self).__init__(ctx, scores, evaluation, func_load) - self._titles = self._titles or ['DET dev', 'DET eval'] + self._titles = self._titles or ['DET dev.', 'DET eval.'] self._x_label = self._x_label or 'False Positive Rate (%)' self._y_label = self._y_label or 'False Negative Rate (%)' self._legend_loc = self._legend_loc or 'upper right' @@ -587,7 +589,7 @@ class Det(PlotBase): plot.det( eval_neg, eval_pos, self._points, color=self._colors[idx], linestyle=linestyle, - label=self._label('eval', eval_file, idx) + label=self._label('eval.', eval_file, idx) ) if self._far_at is not None: from .. import farfrr @@ -615,7 +617,7 @@ class Epc(PlotBase): def __init__(self, ctx, scores, evaluation, func_load, hter='HTER'): super(Epc, self).__init__(ctx, scores, evaluation, func_load) if self._min_arg != 2: - raise click.UsageError("EPC requires dev and eval score files") + raise click.UsageError("EPC requires dev. and eval. score files") self._titles = self._titles or ['EPC'] * 2 self._x_label = self._x_label or r'$\alpha$' self._y_label = self._y_label or hter + ' (%)' @@ -678,11 +680,13 @@ class Hist(PlotBase): self._y_label = 'Probability density' self._x_label = 'Score values' self._end_setup_plot = False - if self._legends is not None and len(self._legends) == self.n_systems \ + # overide _titles of PlotBase + self._titles = ctx.meta.get('titles') + if self._titles is not None and len(self._titles) == self.n_systems \ and not self._hide_dev: # use same legend for dev and eval if needed - self._legends = [x for pair in zip(self._legends, self._legends) - for x in pair] + self._titles = [x for pair in zip(self._titles, self._titles) + for x in pair] def compute(self, idx, input_scores, input_names): ''' Draw histograms of negative and positive scores.''' @@ -709,11 +713,14 @@ class Hist(PlotBase): if col == 0: axis.set_ylabel(self._y_label) # rest to be printed - rest_print = self.n_systems - \ - int(idx / self._step_print) * self._step_print + rest_print = self.n_systems * (2 if self._eval and not self._hide_dev + else 1) - int(idx / self._step_print) \ + * self._step_print if n + self._ncols >= min(self._step_print, rest_print): axis.set_xlabel(self._x_label) - dflt_title = "Eval scores" if evaluation else "Dev scores" + dflt_title = "Eval. scores" if evaluation else "Dev. scores" + if self.n_systems == 1 and (not self._eval or self._hide_dev): + dflt_title = " " axis.set_title(self._get_title(idx, dflt_title)) label = "%s threshold%s" % ( '' if self._criterion is None else @@ -735,8 +742,8 @@ class Hist(PlotBase): def _get_title(self, idx, dflt=None): ''' Get the histo title for the given idx''' - title = self._legends[idx] if self._legends is not None \ - and idx < len(self._legends) else dflt + title = self._titles[idx] if self._titles is not None \ + and idx < len(self._titles) else dflt title = title or self._title_base title = '' if title is not None and not title.replace( ' ', '') else title diff --git a/bob/measure/test_script.py b/bob/measure/test_script.py index f2351080b7183622585886fcd7e71cc6d15c3eef..3e8a1f680b2a6f4a240bba884ef191eeede7eb35 100644 --- a/bob/measure/test_script.py +++ b/bob/measure/test_script.py @@ -144,7 +144,7 @@ def test_hist(): with runner.isolated_filesystem(): result = runner.invoke(commands.hist, ['-e', '--criterion', 'eer','--output', 'HISTO.pdf', '-b', '30,20', - '-sp', 221, '-lg', 'A,B', + '-sp', 221, '-ts', 'A,B', dev1, test1, dev2, test2]) if result.output: click.echo(result.output) @@ -159,7 +159,7 @@ def test_hist_legends(): # share same legend for dev/eval of each system with runner.isolated_filesystem(): - result = runner.invoke(commands.hist, ['-e', '-sp', 221, '-lg', 'A,B', + result = runner.invoke(commands.hist, ['-e', '-sp', 221, '-ts', 'A,B', dev1, test1, dev2, test2]) if result.output: click.echo(result.output) @@ -167,7 +167,7 @@ def test_hist_legends(): # individual legends for dev and eval with runner.isolated_filesystem(): - result = runner.invoke(commands.hist, ['-e', '-sp', 221, '-lg', + result = runner.invoke(commands.hist, ['-e', '-sp', 221, '-ts', 'A,B,C,D', dev1, test1, dev2, test2]) if result.output: