From c0e923516448889fd6e2899f577042e5d08336fe Mon Sep 17 00:00:00 2001 From: Suyash Behera Date: Fri, 2 Nov 2018 20:57:02 +0530 Subject: [PATCH] [MRG + 1] Create a new figure and test each plot type #127 (#179) * [MRG] Create a new figure and test each plot type #127 - move `plot()` to `plotting.py` as `plot_pdf()` - modify plotting functions to return matplotlib figures - add `test_plotting.py` and baseline images - import `plot_pdf()` in `__init__` - update `cli.py` to use `plot_pdf()` - update advanced usage docs to reflect changes * Change matplotlib backend for image comparison tests * Update plotting and tests - use matplotlib rectangle instead of `cv2.rectangle` in `plot_contour()` - set matplotlib backend in `tests/__init__` - update contour plot baseline image - update `test_plotting` with more checks * Update plot tests and config - remove unnecessary asserts - update setup.cfg and makefile with `--mpl` * Add to * Add tolerance * remove text from baseline plots update plot tests with `remove_text` * Change method name, update docs and add pep8 * Update docs --- Makefile | 4 +- camelot/__init__.py | 1 + camelot/cli.py | 12 +- camelot/core.py | 29 ---- camelot/handlers.py | 3 - camelot/plotting.py | 125 ++++++++++++++---- docs/user/advanced.rst | 29 ++-- setup.cfg | 4 +- setup.py | 3 +- tests/__init__.py | 2 + .../baseline_plots/test_contour_plot.png | Bin 0 -> 34094 bytes .../files/baseline_plots/test_joint_plot.png | Bin 0 -> 35743 bytes tests/files/baseline_plots/test_line_plot.png | Bin 0 -> 6808 bytes .../files/baseline_plots/test_table_plot.png | Bin 0 -> 8440 bytes tests/files/baseline_plots/test_text_plot.png | Bin 0 -> 8992 bytes tests/test_plotting.py | 51 +++++++ 16 files changed, 186 insertions(+), 77 deletions(-) create mode 100644 tests/files/baseline_plots/test_contour_plot.png create mode 100644 tests/files/baseline_plots/test_joint_plot.png create mode 100644 tests/files/baseline_plots/test_line_plot.png create mode 100644 tests/files/baseline_plots/test_table_plot.png create mode 100644 tests/files/baseline_plots/test_text_plot.png create mode 100644 tests/test_plotting.py diff --git a/Makefile b/Makefile index a4bea7d..d0b54b0 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ install: pip install ".[dev]" test: - pytest --verbose --cov-config .coveragerc --cov-report term --cov-report xml --cov=camelot tests + pytest --verbose --cov-config .coveragerc --cov-report term --cov-report xml --cov=camelot --mpl tests docs: cd docs && make html @@ -25,4 +25,4 @@ publish: pip install twine python setup.py sdist twine upload dist/* - rm -fr build dist .egg camelot_py.egg-info \ No newline at end of file + rm -fr build dist .egg camelot_py.egg-info diff --git a/camelot/__init__.py b/camelot/__init__.py index 364cd72..d8a41b9 100644 --- a/camelot/__init__.py +++ b/camelot/__init__.py @@ -6,6 +6,7 @@ from click import HelpFormatter from .__version__ import __version__ from .io import read_pdf +from .plotting import plot def _write_usage(self, prog, args='', prefix='Usage: '): diff --git a/camelot/cli.py b/camelot/cli.py index e30b204..8d67df7 100644 --- a/camelot/cli.py +++ b/camelot/cli.py @@ -3,9 +3,11 @@ import logging import click +import matplotlib.pyplot as plt from . import __version__ from .io import read_pdf +from .plotting import plot logger = logging.getLogger('camelot') @@ -81,7 +83,7 @@ def cli(ctx, *args, **kwargs): help='Number of times for erosion/dilation will be applied.') @click.option('-plot', '--plot_type', type=click.Choice(['text', 'table', 'contour', 'joint', 'line']), - help='Plot geometry found on PDF page, for debugging.') + help='Plot elements found on PDF page for visual debugging.') @click.argument('filepath', type=click.Path(exists=True)) @pass_config def lattice(c, *args, **kwargs): @@ -107,7 +109,8 @@ def lattice(c, *args, **kwargs): click.echo('Found {} tables'.format(tables.n)) if plot_type is not None: for table in tables: - table.plot(plot_type) + plot(table, plot_type=plot_type) + plt.show() else: if output is None: raise click.UsageError('Please specify output file path using --output') @@ -128,7 +131,7 @@ def lattice(c, *args, **kwargs): ' used to combine text horizontally, to generate columns.') @click.option('-plot', '--plot_type', type=click.Choice(['text', 'table']), - help='Plot geometry found on PDF page for debugging.') + help='Plot elements found on PDF page for visual debugging.') @click.argument('filepath', type=click.Path(exists=True)) @pass_config def stream(c, *args, **kwargs): @@ -153,7 +156,8 @@ def stream(c, *args, **kwargs): click.echo('Found {} tables'.format(tables.n)) if plot_type is not None: for table in tables: - table.plot(plot_type) + plot(table, plot_type=plot_type) + plt.show() else: if output is None: raise click.UsageError('Please specify output file path using --output') diff --git a/camelot/core.py b/camelot/core.py index d6eb3d7..45b316b 100644 --- a/camelot/core.py +++ b/camelot/core.py @@ -7,8 +7,6 @@ import tempfile import numpy as np import pandas as pd -from .plotting import * - class Cell(object): """Defines a cell in a table with coordinates relative to a @@ -321,33 +319,6 @@ class Table(object): cell.hspan = True return self - def plot(self, geometry_type): - """Plot geometry found on PDF page based on geometry_type - specified, useful for debugging and playing with different - parameters to get the best output. - - Parameters - ---------- - geometry_type : str - The geometry type for which a plot should be generated. - Can be 'text', 'table', 'contour', 'joint', 'line' - - """ - if self.flavor == 'stream' and geometry_type in ['contour', 'joint', 'line']: - raise NotImplementedError("{} cannot be plotted with flavor='stream'".format( - geometry_type)) - - if geometry_type == 'text': - plot_text(self._text) - elif geometry_type == 'table': - plot_table(self) - elif geometry_type == 'contour': - plot_contour(self._image) - elif geometry_type == 'joint': - plot_joint(self._image) - elif geometry_type == 'line': - plot_line(self._segments) - def to_csv(self, path, **kwargs): """Writes Table to a comma-separated values (csv) file. diff --git a/camelot/handlers.py b/camelot/handlers.py index b6dc65c..47070a1 100644 --- a/camelot/handlers.py +++ b/camelot/handlers.py @@ -141,9 +141,6 @@ class PDFHandler(object): ------- tables : camelot.core.TableList List of tables found in PDF. - geometry : camelot.core.GeometryList - List of geometry objects (contours, lines, joints) found - in PDF. """ tables = [] diff --git a/camelot/plotting.py b/camelot/plotting.py index bef06f2..73d5b37 100644 --- a/camelot/plotting.py +++ b/camelot/plotting.py @@ -1,15 +1,59 @@ -import cv2 +# -*- coding: utf-8 -*- + import matplotlib.pyplot as plt import matplotlib.patches as patches +def plot(table, plot_type='text', filepath=None): + """Plot elements found on PDF page based on plot_type + specified, useful for debugging and playing with different + parameters to get the best output. + + Parameters + ---------- + table: Table + A Camelot Table. + plot_type : str, optional (default: 'text') + {'text', 'table', 'contour', 'joint', 'line'} + The element type for which a plot should be generated. + filepath: str, optional (default: None) + Absolute path for saving the generated plot. + + Returns + ------- + fig : matplotlib.fig.Figure + + """ + if table.flavor == 'stream' and plot_type in ['contour', 'joint', 'line']: + raise NotImplementedError("{} cannot be plotted with flavor='stream'".format( + plot_type)) + if plot_type == 'text': + fig = plot_text(table._text) + elif plot_type == 'table': + fig = plot_table(table) + elif plot_type == 'contour': + fig = plot_contour(table._image) + elif plot_type == 'joint': + fig = plot_joint(table._image) + elif plot_type == 'line': + fig = plot_line(table._segments) + if filepath: + plt.savefig(filepath) + return fig + + def plot_text(text): - """Generates a plot for all text present on the PDF page. + """Generates a plot for all text elements present + on the PDF page. Parameters ---------- text : list + Returns + ------- + fig : matplotlib.fig.Figure + """ fig = plt.figure() ax = fig.add_subplot(111, aspect='equal') @@ -26,83 +70,116 @@ def plot_text(text): ) ax.set_xlim(min(xs) - 10, max(xs) + 10) ax.set_ylim(min(ys) - 10, max(ys) + 10) - plt.show() + return fig def plot_table(table): - """Generates a plot for the table. + """Generates a plot for the detected tables + on the PDF page. Parameters ---------- table : camelot.core.Table + Returns + ------- + fig : matplotlib.fig.Figure + """ + fig = plt.figure() + ax = fig.add_subplot(111, aspect='equal') for row in table.cells: for cell in row: if cell.left: - plt.plot([cell.lb[0], cell.lt[0]], + ax.plot([cell.lb[0], cell.lt[0]], [cell.lb[1], cell.lt[1]]) if cell.right: - plt.plot([cell.rb[0], cell.rt[0]], + ax.plot([cell.rb[0], cell.rt[0]], [cell.rb[1], cell.rt[1]]) if cell.top: - plt.plot([cell.lt[0], cell.rt[0]], + ax.plot([cell.lt[0], cell.rt[0]], [cell.lt[1], cell.rt[1]]) if cell.bottom: - plt.plot([cell.lb[0], cell.rb[0]], + ax.plot([cell.lb[0], cell.rb[0]], [cell.lb[1], cell.rb[1]]) - plt.show() + return fig def plot_contour(image): - """Generates a plot for all table boundaries present on the - PDF page. + """Generates a plot for all table boundaries present + on the PDF page. Parameters ---------- image : tuple + Returns + ------- + fig : matplotlib.fig.Figure + """ img, table_bbox = image + fig = plt.figure() + ax = fig.add_subplot(111, aspect='equal') for t in table_bbox.keys(): - cv2.rectangle(img, (t[0], t[1]), - (t[2], t[3]), (255, 0, 0), 20) - plt.imshow(img) - plt.show() + ax.add_patch( + patches.Rectangle( + (t[0], t[1]), + t[2] - t[0], + t[3] - t[1], + fill=None, + edgecolor='red' + ) + ) + ax.imshow(img) + return fig def plot_joint(image): - """Generates a plot for all line intersections present on the - PDF page. + """Generates a plot for all line intersections present + on the PDF page. Parameters ---------- image : tuple + Returns + ------- + fig : matplotlib.fig.Figure + """ img, table_bbox = image + fig = plt.figure() + ax = fig.add_subplot(111, aspect='equal') x_coord = [] y_coord = [] for k in table_bbox.keys(): for coord in table_bbox[k]: x_coord.append(coord[0]) y_coord.append(coord[1]) - plt.plot(x_coord, y_coord, 'ro') - plt.imshow(img) - plt.show() + ax.plot(x_coord, y_coord, 'ro') + ax.imshow(img) + return fig def plot_line(segments): - """Generates a plot for all line segments present on the PDF page. + """Generates a plot for all line segments present + on the PDF page. Parameters ---------- segments : tuple + Returns + ------- + fig : matplotlib.fig.Figure + """ + fig = plt.figure() + ax = fig.add_subplot(111, aspect='equal') vertical, horizontal = segments for v in vertical: - plt.plot([v[0], v[2]], [v[1], v[3]]) + ax.plot([v[0], v[2]], [v[1], v[3]]) for h in horizontal: - plt.plot([h[0], h[2]], [h[1], h[3]]) - plt.show() + ax.plot([h[0], h[2]], [h[1], h[3]]) + return fig diff --git a/docs/user/advanced.rst b/docs/user/advanced.rst index e697949..7d6b349 100644 --- a/docs/user/advanced.rst +++ b/docs/user/advanced.rst @@ -27,12 +27,12 @@ To process background lines, you can pass ``process_background=True``. .. csv-table:: :file: ../_static/csv/background_lines.csv -Plot geometry -------------- +Visual debugging +---------------- -You can use a :class:`table ` object's :meth:`plot() ` method to plot various geometries that were detected by Camelot while processing the PDF page. This can help you select table areas, column separators and debug bad table outputs, by tweaking different configuration parameters. +You can use the :meth:`plot() ` method to generate a `matplotlib `_ plot of various elements that were detected on the PDF page while processing it. This can help you select table areas, column separators and debug bad table outputs, by tweaking different configuration parameters. -The following geometries are available for plotting. You can pass them to the :meth:`plot() ` method, which will then generate a `matplotlib `_ plot for the passed geometry. +You can specify the type of element you want to plot using the ``plot_type`` keyword argument. The generated plot can be saved to a file by passing a ``filename`` keyword argument. The following plot types are supported: - 'text' - 'table' @@ -40,9 +40,9 @@ The following geometries are available for plotting. You can pass them to the :m - 'line' - 'joint' -.. note:: The last three geometries can only be used with :ref:`Lattice `, i.e. when ``flavor='lattice'``. +.. note:: The last three plot types can only be used with :ref:`Lattice `, i.e. when ``flavor='lattice'``. -Let's generate a plot for each geometry using this `PDF <../_static/pdf/foo.pdf>`__ as an example. First, let's get all the tables out. +Let's generate a plot for each type using this `PDF <../_static/pdf/foo.pdf>`__ as an example. First, let's get all the tables out. :: @@ -59,7 +59,8 @@ Let's plot all the text present on the table's PDF page. :: - >>> tables[0].plot('text') + >>> camelot.plot(tables[0], plot_type='text') + >>> plt.show() .. figure:: ../_static/png/geometry_text.png :height: 674 @@ -77,11 +78,12 @@ This, as we shall later see, is very helpful with :ref:`Stream ` for not table ^^^^^ -Let's plot the table (to see if it was detected correctly or not). This geometry type, along with contour, line and joint is useful for debugging and improving the extraction output, in case the table wasn't detected correctly. (More on that later.) +Let's plot the table (to see if it was detected correctly or not). This plot type, along with contour, line and joint is useful for debugging and improving the extraction output, in case the table wasn't detected correctly. (More on that later.) :: - >>> tables[0].plot('table') + >>> camelot.plot(tables[0], plot_type='table') + >>> plt.show() .. figure:: ../_static/png/geometry_table.png :height: 674 @@ -101,7 +103,8 @@ Now, let's plot all table boundaries present on the table's PDF page. :: - >>> tables[0].plot('contour') + >>> camelot.plot(tables[0], plot_type='contour') + >>> plt.show() .. figure:: ../_static/png/geometry_contour.png :height: 674 @@ -119,7 +122,8 @@ Cool, let's plot all line segments present on the table's PDF page. :: - >>> tables[0].plot('line') + >>> camelot.plot(tables[0], plot_type='line') + >>> plt.show() .. figure:: ../_static/png/geometry_line.png :height: 674 @@ -137,7 +141,8 @@ Finally, let's plot all line intersections present on the table's PDF page. :: - >>> tables[0].plot('joint') + >>> camelot.plot(tables[0], plot_type='joint') + >>> plt.show() .. figure:: ../_static/png/geometry_joint.png :height: 674 diff --git a/setup.cfg b/setup.cfg index 1b48058..1a59858 100644 --- a/setup.cfg +++ b/setup.cfg @@ -2,5 +2,5 @@ test=pytest [tool:pytest] -addopts = --verbose --cov-config .coveragerc --cov-report term --cov-report xml --cov=camelot tests -python_files = tests/test_*.py \ No newline at end of file +addopts = --verbose --cov-config .coveragerc --cov-report term --cov-report xml --cov=camelot --mpl tests +python_files = tests/test_*.py diff --git a/setup.py b/setup.py index e727706..8a1bcf6 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,8 @@ dev_requires = [ 'pytest>=3.8.0', 'pytest-cov>=2.6.0', 'pytest-runner>=4.2', - 'Sphinx>=1.7.9' + 'Sphinx>=1.7.9', + 'pytest-mpl>=0.10' ] dev_requires = dev_requires + all_requires diff --git a/tests/__init__.py b/tests/__init__.py index e69de29..a946ff7 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -0,0 +1,2 @@ +import matplotlib +matplotlib.use('agg') diff --git a/tests/files/baseline_plots/test_contour_plot.png b/tests/files/baseline_plots/test_contour_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..57b39620e37c4fe51e1396af240658aa73955494 GIT binary patch literal 34094 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�aY!gywdD3bdpKO(l<4#_x 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 CtK;JU literal 0 HcmV?d00001 diff --git a/tests/files/baseline_plots/test_joint_plot.png b/tests/files/baseline_plots/test_joint_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..934aa74d906668165a184f247e7d5edda48aba83 GIT binary patch literal 35743 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�aY!gywdD3bdpKO(l<4#_x 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 B`A`4= literal 0 HcmV?d00001 diff --git a/tests/files/baseline_plots/test_table_plot.png b/tests/files/baseline_plots/test_table_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..d60f69f3e88878eb196022b97f7ed81ea1d67e95 GIT binary patch literal 8440 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 literal 0 HcmV?d00001 diff --git a/tests/files/baseline_plots/test_text_plot.png b/tests/files/baseline_plots/test_text_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..8cc382525d84c90dda0fda3503a15c01c51c7e12 GIT binary patch literal 8992 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 RFF*{mZL^&f&4PI9e*gqul|29e literal 0 HcmV?d00001 diff --git a/tests/test_plotting.py b/tests/test_plotting.py new file mode 100644 index 0000000..e01cac6 --- /dev/null +++ b/tests/test_plotting.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- + +import os + +import pytest + +import camelot + + +testdir = os.path.dirname(os.path.abspath(__file__)) +testdir = os.path.join(testdir, "files") + + +@pytest.mark.mpl_image_compare( + baseline_dir="files/baseline_plots", remove_text=True) +def test_text_plot(): + filename = os.path.join(testdir, "foo.pdf") + tables = camelot.read_pdf(filename) + return camelot.plot(tables[0], plot_type='text') + + +@pytest.mark.mpl_image_compare( + baseline_dir="files/baseline_plots", remove_text=True) +def test_table_plot(): + filename = os.path.join(testdir, "foo.pdf") + tables = camelot.read_pdf(filename) + return camelot.plot(tables[0], plot_type='table') + + +@pytest.mark.mpl_image_compare( + baseline_dir="files/baseline_plots", remove_text=True) +def test_contour_plot(): + filename = os.path.join(testdir, "foo.pdf") + tables = camelot.read_pdf(filename) + return camelot.plot(tables[0], plot_type='contour') + + +@pytest.mark.mpl_image_compare( + baseline_dir="files/baseline_plots", remove_text=True) +def test_line_plot(): + filename = os.path.join(testdir, "foo.pdf") + tables = camelot.read_pdf(filename) + return camelot.plot(tables[0], plot_type='line') + + +@pytest.mark.mpl_image_compare( + baseline_dir="files/baseline_plots", remove_text=True) +def test_joint_plot(): + filename = os.path.join(testdir, "foo.pdf") + tables = camelot.read_pdf(filename) + return camelot.plot(tables[0], plot_type='joint')