From 10c2b8ea768240171c5a8ecea4ec524c197d76e4 Mon Sep 17 00:00:00 2001 From: Philipp Kats Date: Tue, 27 Aug 2019 13:21:24 -0400 Subject: [PATCH 1/2] additional_props_first_attempt --- .gitignore | 8 ++++++ altair_pandas/_core.py | 45 +++++++++++++++++++++++++++++++++- altair_pandas/test_plotting.py | 28 ++++++++++++++++++++- 3 files changed, 79 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 894a44c..9372a14 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,11 @@ venv.bak/ # mypy .mypy_cache/ + + +# vscode +.vscode/ + +# examples +.examples/ +examples/example.ipynb diff --git a/altair_pandas/_core.py b/altair_pandas/_core.py index f64c5c1..caa51ac 100644 --- a/altair_pandas/_core.py +++ b/altair_pandas/_core.py @@ -6,6 +6,44 @@ def _valid_column(column_name): return str(column_name) +def _set_encode(chart, cols, value, attribute, types, alt_obj): + '''handles all possible meanings/values of the attribute''' + if value in cols: + setattr(chart.encoding, attribute, alt_obj(value)) + elif isinstance(value, alt_obj): + setattr(chart.encoding, attribute, value) + elif isinstance(value, types): + setattr(chart.encoding, attribute, alt.value(value)) + elif isinstance(value, (pd.Series, pd.np.array)): + raise NotImplementedError() + else: + text = f'Supposed to be either column name, or {types}, or {alt_obj} object' # noqa + raise ValueError(text) + + +def _pass_additional_properties(chart, cols, kwargs): + '''make use of additional properties, such as + color, title, alpha, etc. + ''' + if 'title' in kwargs: + chart.title = kwargs['title'] + + if 'color' in kwargs: + color = kwargs.get('color') + _set_encode(chart, cols, color, 'color', str, alt.Color) + + if 'alpha' in kwargs: + alpha = kwargs['alpha'] + _set_encode(chart, + cols, + alpha, + 'opacity', + (int, float), + alt.Opacity) + + return chart + + class _PandasPlotter: """Base class for pandas plotting.""" @classmethod @@ -190,4 +228,9 @@ def plot(data, kind='line', **kwargs): raise NotImplementedError( f"kind='{kind}' for data of type {type(data)}") - return plotfunc(**kwargs) + chart = plotfunc(**kwargs) + if isinstance(data, pd.DataFrame): + cols = data.columns.tolist() + else: + cols = [data.name, data.index.name] + return _pass_additional_properties(chart, cols, kwargs) diff --git a/altair_pandas/test_plotting.py b/altair_pandas/test_plotting.py index 4e682e4..1fd7cb5 100644 --- a/altair_pandas/test_plotting.py +++ b/altair_pandas/test_plotting.py @@ -1,7 +1,7 @@ import pytest import numpy as np import pandas as pd - +import altair as alt @pytest.fixture def series(): @@ -141,3 +141,29 @@ def test_dataframe_boxplot(dataframe, with_plotting_backend): assert spec['encoding']['x']['field'] == 'column' assert spec['encoding']['y']['field'] == 'value' assert spec['transform'][0]['fold'] == ['x', 'y'] + + +@pytest.mark.parametrize('props', [ + {'title':'Test Title', 'color': 'y', 'alpha': 0.2}, + {'title':'Test Title', 'color': 'purple', 'alpha': 'y'}, + {'title':'Test Title', 'color': 'purple', 'alpha': 'y'}, + {'title':'Test Title', 'color': 'purple', 'alpha': 'y'}, + {'title': 'Test Title', 'color':alt.Color('y', scale=alt.Scale(scheme='viridis')), 'alpha':0.2} + ]) +def test_additional_properties(dataframe, props, with_plotting_backend): + chart = dataframe.plot.barh(**props) + spec = chart.to_dict() + + assert spec['title'] == props['title'] + + if props['alpha'] == 0.2: + assert spec['encoding']['opacity'] == alt.value(props['alpha']) + else: + assert spec['encoding']['opacity'] == {'field': props['alpha'], 'type': 'quantitative'} + + if props['color'] == 'purple': + assert spec['encoding']['color'] == alt.value(props['color']) + elif isinstance(props['color'], alt.Color): + assert spec['encoding']['color'] == props['color'].to_dict() + else: + assert spec['encoding']['color'] == {'field': props['color'], 'type': 'quantitative'} \ No newline at end of file From 0974cb58427171f19fb7e4e5018883044b187ad7 Mon Sep 17 00:00:00 2001 From: Philipp Kats Date: Tue, 27 Aug 2019 13:38:22 -0400 Subject: [PATCH 2/2] passing flake 8 --- altair_pandas/test_plotting.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/altair_pandas/test_plotting.py b/altair_pandas/test_plotting.py index 1fd7cb5..5e49053 100644 --- a/altair_pandas/test_plotting.py +++ b/altair_pandas/test_plotting.py @@ -3,6 +3,7 @@ import pandas as pd import altair as alt + @pytest.fixture def series(): return pd.Series(range(5), name='data_name') @@ -144,11 +145,13 @@ def test_dataframe_boxplot(dataframe, with_plotting_backend): @pytest.mark.parametrize('props', [ - {'title':'Test Title', 'color': 'y', 'alpha': 0.2}, - {'title':'Test Title', 'color': 'purple', 'alpha': 'y'}, - {'title':'Test Title', 'color': 'purple', 'alpha': 'y'}, - {'title':'Test Title', 'color': 'purple', 'alpha': 'y'}, - {'title': 'Test Title', 'color':alt.Color('y', scale=alt.Scale(scheme='viridis')), 'alpha':0.2} + {'title': 'Test Title', 'color': 'y', 'alpha': 0.2}, + {'title': 'Test Title', 'color': 'purple', 'alpha': 'y'}, + {'title': 'Test Title', 'color': 'purple', 'alpha': 'y'}, + {'title': 'Test Title', 'color': 'purple', 'alpha': 'y'}, + {'title': 'Test Title', + 'color': alt.Color('y', scale=alt.Scale(scheme='viridis')), + 'alpha': 0.2} ]) def test_additional_properties(dataframe, props, with_plotting_backend): chart = dataframe.plot.barh(**props) @@ -159,11 +162,13 @@ def test_additional_properties(dataframe, props, with_plotting_backend): if props['alpha'] == 0.2: assert spec['encoding']['opacity'] == alt.value(props['alpha']) else: - assert spec['encoding']['opacity'] == {'field': props['alpha'], 'type': 'quantitative'} + assert spec['encoding']['opacity'] == {'field': props['alpha'], + 'type': 'quantitative'} if props['color'] == 'purple': assert spec['encoding']['color'] == alt.value(props['color']) elif isinstance(props['color'], alt.Color): assert spec['encoding']['color'] == props['color'].to_dict() else: - assert spec['encoding']['color'] == {'field': props['color'], 'type': 'quantitative'} \ No newline at end of file + assert spec['encoding']['color'] == {'field': props['color'], + 'type': 'quantitative'}