|
import json |
|
import pytest |
|
|
|
try: |
|
from IPython import InteractiveShell |
|
|
|
IPYTHON_AVAILABLE = True |
|
except ImportError: |
|
IPYTHON_AVAILABLE = False |
|
pass |
|
|
|
from altair.vegalite.v4 import VegaLite |
|
from altair.vega.v5 import Vega |
|
|
|
|
|
DATA_RECORDS = [ |
|
{"amount": 28, "category": "A"}, |
|
{"amount": 55, "category": "B"}, |
|
{"amount": 43, "category": "C"}, |
|
{"amount": 91, "category": "D"}, |
|
{"amount": 81, "category": "E"}, |
|
{"amount": 53, "category": "F"}, |
|
{"amount": 19, "category": "G"}, |
|
{"amount": 87, "category": "H"}, |
|
] |
|
|
|
if IPYTHON_AVAILABLE: |
|
_ipshell = InteractiveShell.instance() |
|
_ipshell.run_cell("%load_ext altair") |
|
_ipshell.run_cell( |
|
""" |
|
import pandas as pd |
|
table = pd.DataFrame.from_records({}) |
|
the_data = table |
|
""".format( |
|
DATA_RECORDS |
|
) |
|
) |
|
|
|
|
|
VEGA_SPEC = { |
|
"$schema": "https://vega.github.io/schema/vega/v5.json", |
|
"axes": [ |
|
{"orient": "bottom", "scale": "xscale"}, |
|
{"orient": "left", "scale": "yscale"}, |
|
], |
|
"data": [{"name": "table", "values": DATA_RECORDS}], |
|
"height": 200, |
|
"marks": [ |
|
{ |
|
"encode": { |
|
"enter": { |
|
"width": {"band": 1, "scale": "xscale"}, |
|
"x": {"field": "category", "scale": "xscale"}, |
|
"y": {"field": "amount", "scale": "yscale"}, |
|
"y2": {"scale": "yscale", "value": 0}, |
|
}, |
|
"hover": {"fill": {"value": "red"}}, |
|
"update": {"fill": {"value": "steelblue"}}, |
|
}, |
|
"from": {"data": "table"}, |
|
"type": "rect", |
|
}, |
|
{ |
|
"encode": { |
|
"enter": { |
|
"align": {"value": "center"}, |
|
"baseline": {"value": "bottom"}, |
|
"fill": {"value": "#333"}, |
|
}, |
|
"update": { |
|
"fillOpacity": [ |
|
{"test": "datum === tooltip", "value": 0}, |
|
{"value": 1}, |
|
], |
|
"text": {"signal": "tooltip.amount"}, |
|
"x": {"band": 0.5, "scale": "xscale", "signal": "tooltip.category"}, |
|
"y": {"offset": -2, "scale": "yscale", "signal": "tooltip.amount"}, |
|
}, |
|
}, |
|
"type": "text", |
|
}, |
|
], |
|
"padding": 5, |
|
"scales": [ |
|
{ |
|
"domain": {"data": "table", "field": "category"}, |
|
"name": "xscale", |
|
"padding": 0.05, |
|
"range": "width", |
|
"round": True, |
|
"type": "band", |
|
}, |
|
{ |
|
"domain": {"data": "table", "field": "amount"}, |
|
"name": "yscale", |
|
"nice": True, |
|
"range": "height", |
|
}, |
|
], |
|
"signals": [ |
|
{ |
|
"name": "tooltip", |
|
"on": [ |
|
{"events": "rect:mouseover", "update": "datum"}, |
|
{"events": "rect:mouseout", "update": "{}"}, |
|
], |
|
"value": {}, |
|
} |
|
], |
|
"width": 400, |
|
} |
|
|
|
|
|
VEGALITE_SPEC = { |
|
"$schema": "https://vega.github.io/schema/vega-lite/v4.json", |
|
"data": {"values": DATA_RECORDS}, |
|
"description": "A simple bar chart with embedded data.", |
|
"encoding": { |
|
"x": {"field": "category", "type": "ordinal"}, |
|
"y": {"field": "amount", "type": "quantitative"}, |
|
}, |
|
"mark": "bar", |
|
} |
|
|
|
|
|
@pytest.mark.skipif(not IPYTHON_AVAILABLE, reason="requires ipython") |
|
def test_vegalite_magic_data_included(): |
|
result = _ipshell.run_cell("%%vegalite\n" + json.dumps(VEGALITE_SPEC)) |
|
assert isinstance(result.result, VegaLite) |
|
assert VEGALITE_SPEC == result.result.spec |
|
|
|
|
|
@pytest.mark.skipif(not IPYTHON_AVAILABLE, reason="requires ipython") |
|
def test_vegalite_magic_json_flag(): |
|
result = _ipshell.run_cell("%%vegalite --json\n" + json.dumps(VEGALITE_SPEC)) |
|
assert isinstance(result.result, VegaLite) |
|
assert VEGALITE_SPEC == result.result.spec |
|
|
|
|
|
@pytest.mark.skipif(not IPYTHON_AVAILABLE, reason="requires ipython") |
|
def test_vegalite_magic_pandas_data(): |
|
spec = {key: val for key, val in VEGALITE_SPEC.items() if key != "data"} |
|
result = _ipshell.run_cell("%%vegalite table\n" + json.dumps(spec)) |
|
assert isinstance(result.result, VegaLite) |
|
assert VEGALITE_SPEC == result.result.spec |
|
|
|
|
|
@pytest.mark.skipif(not IPYTHON_AVAILABLE, reason="requires ipython") |
|
def test_vega_magic_data_included(): |
|
result = _ipshell.run_cell("%%vega\n" + json.dumps(VEGA_SPEC)) |
|
assert isinstance(result.result, Vega) |
|
assert VEGA_SPEC == result.result.spec |
|
|
|
|
|
@pytest.mark.skipif(not IPYTHON_AVAILABLE, reason="requires ipython") |
|
def test_vega_magic_json_flag(): |
|
result = _ipshell.run_cell("%%vega --json\n" + json.dumps(VEGA_SPEC)) |
|
assert isinstance(result.result, Vega) |
|
assert VEGA_SPEC == result.result.spec |
|
|
|
|
|
@pytest.mark.skipif(not IPYTHON_AVAILABLE, reason="requires ipython") |
|
def test_vega_magic_pandas_data(): |
|
spec = {key: val for key, val in VEGA_SPEC.items() if key != "data"} |
|
result = _ipshell.run_cell("%%vega table\n" + json.dumps(spec)) |
|
assert isinstance(result.result, Vega) |
|
assert VEGA_SPEC == result.result.spec |
|
|
|
|
|
@pytest.mark.skipif(not IPYTHON_AVAILABLE, reason="requires ipython") |
|
def test_vega_magic_pandas_data_renamed(): |
|
spec = {key: val for key, val in VEGA_SPEC.items() if key != "data"} |
|
result = _ipshell.run_cell("%%vega table:the_data\n" + json.dumps(spec)) |
|
assert isinstance(result.result, Vega) |
|
assert VEGA_SPEC == result.result.spec |
|
|