Download notebook (.ipynb)

Combining Discrete and Continuous Layers#

This notebook demonstrates how to position continuous elements like background bands (geom_band) and annotations (geom_text) relative to discrete elements like bars.

When positioning continuous elements, keep in mind numeric equivalents of the discrete positions: in this example 0.0 for ‘Outback’ through 7.0 for ‘Pacer’.

import numpy as np
import pandas as pd

from lets_plot import *
LetsPlot.setup_html()
np.random.seed(69)

cars = pd.DataFrame({
    'Models': ['Outback', 'Impresa', 'BRZ', 'Jetta', 'Passat', 'Matador', 'Rambler', 'Pacer'],
    'Val': np.random.uniform(0,100, size=8),
})

# Data to use in `geom_band` and `geom_text` layers
cars_band = pd.DataFrame({
    'Brand': ['Subaru', 'Volkswagen', 'AMC'],
    'pos_minx': [-0.5, 2.5, 4.5],
    'pos_maxx':[2.5, 4.5, 7.5],
    'M':['#41DC8E', '#E0FFFF','#90D5FF']
})
ggplot(cars, aes(x='Models', weight='Val')) + \
    geom_band(aes(xmin='pos_minx', xmax='pos_maxx', fill='Brand', color='Brand'),
              data=cars_band,
              tooltips='none',
              alpha=0.5) + \
    geom_text(aes(x='pos_minx', label='Brand'), y=100,
              data=cars_band, 
              size=8, fontface='bold', 
              hjust='left', 
              nudge_x=0.1) + \
    geom_bar() + \
    scale_fill_manual(values=cars_band['M']) + \
    scale_color_manual(values=cars_band['M']) + \
    theme(legend_position='none', axis_title_x='blank') + \
    ggsize(700, 400)