#!/usr/bin/env python # coding: utf-8 # # Example Fastpages Notebook # > An example fastpages notebook # # - toc: True # # # About # # See [fastpages/_notebooks/README.md](https://github.com/fastai/fastpages/blob/master/_notebooks/README.md) for a detailed explanation on how to use notebooks with `fastpages`. This notebook is a demonstration of some of `fastpages's capabilities with notebooks` # # # With `fastpages` you can save your jupyter notebooks into the `_notebooks` folder at the root of your repository, and they will be automatically be converted to Jekyll compliant blog posts! # put a `#hide` flag at the top of any cell you want to completely hide in the docs # In[1]: #hide import pandas as pd import altair as alt # ## Interactive Charts With Altair # # Charts made with Altair remain interactive. Example charts taken from [this repo](https://github.com/uwdata/visualization-curriculum), specifically [this notebook](https://github.com/uwdata/visualization-curriculum/blob/master/altair_interaction.ipynb). # In[2]: # hide cars = 'https://vega.github.io/vega-datasets/data/cars.json' movies = 'https://vega.github.io/vega-datasets/data/movies.json' sp500 = 'https://vega.github.io/vega-datasets/data/sp500.csv' stocks = 'https://vega.github.io/vega-datasets/data/stocks.csv' flights = 'https://vega.github.io/vega-datasets/data/flights-5k.json' # In[3]: # hide df = pd.read_json(movies) # load movies data genres = df['Major_Genre'].unique() # get unique field values genres = list(filter(lambda d: d is not None, genres)) # filter out None values genres.sort() # sort alphabetically # In[4]: #hide mpaa = ['G', 'PG', 'PG-13', 'R', 'NC-17', 'Not Rated'] # ### Example 1: DropDown # In[5]: # single-value selection over [Major_Genre, MPAA_Rating] pairs # use specific hard-wired values as the initial selected values selection = alt.selection_single( name='Select', fields=['Major_Genre', 'MPAA_Rating'], init={'Major_Genre': 'Drama', 'MPAA_Rating': 'R'}, bind={'Major_Genre': alt.binding_select(options=genres), 'MPAA_Rating': alt.binding_radio(options=mpaa)} ) # scatter plot, modify opacity based on selection alt.Chart(movies).mark_circle().add_selection( selection ).encode( x='Rotten_Tomatoes_Rating:Q', y='IMDB_Rating:Q', tooltip='Title:N', opacity=alt.condition(selection, alt.value(0.75), alt.value(0.05)) ) # ### Example 2: Use One Visualization To Filter Another # In[6]: brush = alt.selection_interval( encodings=['x'] # limit selection to x-axis (year) values ) # dynamic query histogram years = alt.Chart(movies).mark_bar().add_selection( brush ).encode( alt.X('year(Release_Date):T', title='Films by Release Year'), alt.Y('count():Q', title=None) ).properties( width=650, height=50 ) # scatter plot, modify opacity based on selection ratings = alt.Chart(movies).mark_circle().encode( x='Rotten_Tomatoes_Rating:Q', y='IMDB_Rating:Q', tooltip='Title:N', opacity=alt.condition(brush, alt.value(0.75), alt.value(0.05)) ).properties( width=650, height=400 ) alt.vconcat(years, ratings).properties(spacing=5) # ## Example 3: Tooltips # In[7]: alt.Chart(movies).mark_circle().add_selection( alt.selection_interval(bind='scales', encodings=['x']) ).encode( x='Rotten_Tomatoes_Rating:Q', y=alt.Y('IMDB_Rating:Q', axis=alt.Axis(minExtent=30)), # use min extent to stabilize axis title placement tooltip=['Title:N', 'Release_Date:N', 'IMDB_Rating:Q', 'Rotten_Tomatoes_Rating:Q'] ).properties( width=600, height=400 ) # ### Example 4: More Tooltips # In[8]: # select a point for which to provide details-on-demand label = alt.selection_single( encodings=['x'], # limit selection to x-axis value on='mouseover', # select on mouseover events nearest=True, # select data point nearest the cursor empty='none' # empty selection includes no data points ) # define our base line chart of stock prices base = alt.Chart().mark_line().encode( alt.X('date:T'), alt.Y('price:Q', scale=alt.Scale(type='log')), alt.Color('symbol:N') ) alt.layer( base, # base line chart # add a rule mark to serve as a guide line alt.Chart().mark_rule(color='#aaa').encode( x='date:T' ).transform_filter(label), # add circle marks for selected time points, hide unselected points base.mark_circle().encode( opacity=alt.condition(label, alt.value(1), alt.value(0)) ).add_selection(label), # add white stroked text to provide a legible background for labels base.mark_text(align='left', dx=5, dy=-5, stroke='white', strokeWidth=2).encode( text='price:Q' ).transform_filter(label), # add text labels for stock prices base.mark_text(align='left', dx=5, dy=-5).encode( text='price:Q' ).transform_filter(label), data=stocks ).properties( width=700, height=400 ) # ## Other Elements # ### Tweetcards # # Typing `> twitter: https://twitter.com/jakevdp/status/1204765621767901185?s=20` will render this: # # > twitter: https://twitter.com/jakevdp/status/1204765621767901185?s=20 # ### Youtube Videos # # Typing `> youtube: https://youtu.be/XfoYk_Z5AkI` will render this: # # # > youtube: https://youtu.be/XfoYk_Z5AkI # ### Boxes / Callouts # # Typing `> Warning: There will be no second warning!` will render this: # # # > Warning: There will be no second warning! # # # # Typing `> Important: Pay attention! It's important.` will render this: # # > Important: Pay attention! It's important. # # # # Typing `> Tip: This is my tip.` will render this: # # > Tip: This is my tip. # # # # Typing `> Note: Take note of this.` will render this: # # > Note: Take note of this. # # # # Typing `> Note: A doc link to [an example website: fast.ai](https://www.fast.ai/) should also work fine.` will render in the docs: # # > Note: A doc link to [an example website: fast.ai](https://www.fast.ai/) should also work fine. # In[ ]: