User:Sj/internal/Big books


<graph>

{
  "version": 2, "width": 800, "height": 400,

  "data": [
    {
      // Each Data value has the following attributes:
      // date_sold, price_adj, year_published, period (binned p1, p2, p3, p4, p5), author (author name),
      // author (binned Da Vinci, Audubon, unknown, other), title, ratio (approximate image ratio), img
      "name": "table",
      "format": {"type": "json", "parse": {"date_sold": "date"} },
      "values": [
       {"date_sold": "November 1, 1994", "price_adj": 63.3, "year_published": 1510, "period": "p2", "author": "Leonardo Da Vinci", "author": "Da Vinci", "title": "Leicester Codex", "ratio": {"x": 1.5, "y": 1}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Vinci_-_Hammer_2A.jpg/190px-Vinci_-_Hammer_2A.jpg"},
       {"date_sold": "December 1, 2007", "price_adj": 31.3, "year_published": 1297, "period": "p1", "author": "King John", "author": "King John", "title": "Magna Carta", "ratio": {"x": 0, "y": 0} },
       {"date_sold": "April 1, 2012", "price_adj": 19, "year_published": 650, "period": "p1", "author": "Unknown", "author": "unknown", "title": "St. Cuthbert Gospel", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/5/57/St_Cuthbert_Gospel_-_f.1.jpg/190px-St_Cuthbert_Gospel_-_f.1.jpg"},
       {"date_sold": "November 1, 2013", "price_adj": 18.6, "year_published": 1640, "period": "p3", "author": "Unknown", "author": "unknown", "title": "Bay Psalm Book", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Bay_Psalm_Book_LoC.png/190px-Bay_Psalm_Book_LoC.png"},
       {"date_sold": "July 1, 1999", "price_adj": 24.5, "year_published": 1510, "period": "p2", "author": "Unknown", "author": "unknown", "title": "Rothschild Prayerbook", "ratio": {"x": 1.5, "y": 1}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/0/03/Rothschild2.jpg/190px-Rothschild2.jpg"},
       {"date_sold": "December 1, 1983", "price_adj": 35.8, "year_published": 1175, "period": "p1", "author": "Order of Saint Benedict", "author": "other", "title": "Gospels of Henry the Lion", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Evangeliar_heinrich_des_loewen.jpg/190px-Evangeliar_heinrich_des_loewen.jpg"},
       {"date_sold": "December 1, 2010", "price_adj": 16.1, "year_published": 1830, "period": "p4", "author": "John James Audubon", "author": "Audubon", "title": "The Birds of America", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Audubon-Flamingo.jpg/190px-Audubon-Flamingo.jpg"},
       {"date_sold": "January 1, 2000", "price_adj": 15.6, "year_published": 1830, "period": "p4", "author": "John James Audubon", "author": "Audubon", "title": "The Birds of America", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/3/39/Campephilus_principalisAWP066AA2.jpg/190px-Campephilus_principalisAWP066AA2.jpg"},
       {"date_sold": "January 1, 2012", "price_adj": 10.5, "year_published": 1830, "period": "p4", "author": "John James Audubon", "author": "Audubon", "title": "The Birds of America", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Zenaida_macrouraAWP17AA.jpg/190px-Zenaida_macrouraAWP17AA.jpg"},
       {"date_sold": "January 1, 1998", "price_adj": 14, "year_published": 1478, "period": "p2", "author": "Geoffrey Chaucer", "author": "Geoffrey Chaucer", "title": "The Canterbury Tales", "ratio": {"x": 0, "y": 0} },

       {"date_sold": "January 1, 2001", "price_adj": 10.5, "year_published": 1623, "period": "p3", "author": "William Shakespeare", "author": "William Shakespeare", "title": "Shakespeare's First Folio", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/Title_page_William_Shakespeare%27s_First_Folio_1623.jpg/190px-Title_page_William_Shakespeare%27s_First_Folio_1623.jpg"},
       {"date_sold": "January 1, 1985", "price_adj": 14.2, "year_published": 1802, "period": "p4", "author": "Pierre-Joseph Redouté", "author": "Pierre-Joseph Redouté", "title": "Les Liliacées", "ratio": {"x": 0, "y": 0} },
       {"date_sold": "January 1, 1987", "price_adj": 13.1, "year_published": 1450, "period": "p2", "author": "Other", "author": "other", "title": "Gutenberg Bible", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Gutenberg_bible_Old_Testament_Epistle_of_St_Jerome.jpg/190px-Gutenberg_bible_Old_Testament_Epistle_of_St_Jerome.jpg"},
       {"date_sold": "January 1, 2006", "price_adj": 6.8, "year_published": 1768, "period": "p3", "author": "Henri-Louis Duhamel du Monceau", "author": "Henri-Louis Duhamel du Monceau", "title": "Traité des Arbres Fruitiers", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Pomme_rambour.jpg/190px-Pomme_rambour.jpg"},
       {"date_sold": "December 1, 2010", "price_adj": 6, "year_published": 1892, "period": "p4", "author": "James Naismith", "author": "James Naismith", "title": "Rules of basketball", "ratio": {"x": 0, "y": 0} },

       {"date_sold": "December 1, 2007", "price_adj": 5.7, "year_published": 2006, "period": "p5", "author": "J. K. Rowling", "author": "J. K. Rowling", "title": "The Tales of Beedle the Bard", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/en/thumb/2/25/The_Tales_of_Beedle_the_Bard.jpg/190px-The_Tales_of_Beedle_the_Bard.jpg"},
       {"date_sold": "October 1, 2006", "price_adj": 5.3, "year_published": 1477, "period": "p2", "author": "Ptolemy", "Ptolemy": "other", "title": "Geographia Cosmographia", "ratio": {"x": 0, "y": 0} },
       {"date_sold": "August 1, 2014", "price_adj": 4.1, "year_published": 1477, "period": "p2", "author": "Jerry Siegel", "author": "Jerry Siegel, Joe Shuster", "title": "Action Comics 1", "ratio": {"x": 0, "y": 0} },
       {"date_sold": "April 1, 1999", "price_adj": 4.6, "year_published": 1794, "period": "p3", "author": "William Blake", "author": "William Blake", "title": "The First Book of Urizen", "ratio": {"x": 0, "y": 0} },
       {"date_sold": "January 1, 2005", "price_adj": 3.7, "year_published": 1650, "period": "p3", "author": "Unknown", "author": "unknown", "title": "Doria Atlas", "ratio": {"x": 0, "y": 0} },
       {"date_sold": "January 1, 1987", "price_adj": 5.9, "year_published": 1465, "period": "p2", "author": "Unknown", "author": "unknown", "title": "Biblia pauperum", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/4/41/BibliaPauperum.jpg/190px-BibliaPauperum.jpg"},
       {"date_sold": "January 1, 1991", "price_adj": 4.9, "year_published": 1776, "period": "p3", "author": "Other", "author": "other", "title": "United States Declaration of Independence", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/United_States_Declaration_of_Independence.jpg/190px-United_States_Declaration_of_Independence.jpg"},
       {"date_sold": "January 1, 1998", "price_adj": 3.6, "year_published": 1543, "period": "p2", "author": "Nicolaus Copernicus", "author": "Nicolaus Copernicus", "title": "De revolutionibus orbium coelestium", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Nicolai_Copernici_torinensis_De_revolutionibus_orbium_coelestium.djvu/page1-190px-Nicolai_Copernici_torinensis_De_revolutionibus_orbium_coelestium.djvu.jpg"},
 
       {"date_sold": "January 1, 1998", "price_adj": 3.4, "year_published": 1850, "period": "p4", "author": "John Gould", "author": "John Gould", "title": "Complete Folio of Birds", "ratio": {"x": 0, "y": 0} },
       {"date_sold": "January 1, 1989", "price_adj": 3.7, "year_published": 1610, "period": "p3", "author": "Miguel de Cervantes", "author": "Miguel de Cervantes", "title": "Don Quixote", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/6/69/Cervantes_Don_Quixote_1605.gif/190px-Cervantes_Don_Quixote_1605.gif"},
       {"date_sold": "January 1, 1998", "price_adj": 2.8, "year_published": 1543, "period": "p2", "author": "Andreas Vesalius", "author": "Andreas Vesalius", "title": "De humani corporis fabrica", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Vesalius_Fabrica_fronticepiece.jpg/190px-Vesalius_Fabrica_fronticepiece.jpg"},
       {"date_sold": "January 1, 1998", "price_adj": 2.6, "year_published": 1865, "period": "p4", "author": "Lewis Carroll", "author": "Lewis Carroll", "title": "Alice's Adventures in Wonderland", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/a/af/AlicesAdventuresInWonderlandTitlePage.jpg/190px-AlicesAdventuresInWonderlandTitlePage.jpg"},
       {"date_sold": "January 1, 1990", "price_adj": 3, "year_published": 1788, "period": "p3", "author": "Alexander Hamilton, John Jay, James Madison", "author": "other", "title": "The Federalist", "ratio": {"x": 1, "y": 1.5}, "img": "wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/The_Federalist_%281st_ed%2C_1788%2C_vol_I%2C_title_page%29_-_02.jpg/190px-The_Federalist_%281st_ed%2C_1788%2C_vol_I%2C_title_page%29_-_02.jpg"}
       ]
    },
    {
      "name": "date_min_max",
      "format": {"type": "json", "parse": {"min_max": "date"} },
      "values": [
        {"min_max": "1980"},
        {"min_max": "2015"}
      ]
    },
    {
      // Specify the names (corresponding to author in table) that should appear in the author legend.
      "name": "popular_authors",
      "values": [
        {"name": "Da Vinci"}, {"name": "Audubon"}, {"name": "unknown"}, {"name": "other"}
      ]
    },
    {
      // Filter the reference point from the dataset
      // This point is not included in the wikipedia table, but corresponds to data from the 'Background' section
      "name": "old_record",
      "source": "table",
      "transform": [{
        "type": "filter",
        "test": "datum.title == 'Gospels of Henry the Lion'"
      }]
    },
    {
      // Specify the values corresponding to the period attribute in the table.
      "name": "periods",
      "values": ["p1", "p2", "p3", "p4", "p5"]
    },
    {
      // Helper dataset for drawing images. Filtering this dataset based on the availability of an image ensures
      // that the image is drawn correctly and does not throw a 404 error. See transforms of this dataset for
      // more information on how it is used.
      "name": "drawImage",
      "values": [0]
    }
  ],

  "signals": [
    {
      // Tooltip signal: extract the data for the hovered point and provide an empty value.
      "name": "tooltip",
      "init": {"title": "Sale Dates of Most Expensive Books", "ratio": {"x": 0, "y":0} },
      "streams": [
        {"type": "@points:mouseover", "expr": "datum"},
        {"type": "@points:mouseout", "expr": "{title: 'Sale Dates of Most Expensive Books', ratio:{x: 0, y:0} }"}
      ]
    },
    {
      // Define the selected author (background select for none, point or legend for author)
      "name": "author",
      "init": "",
      "streams": [
        {"type": "click", "expr": "''"},
        {"type": "symbol:click", "expr": "datum.author"},
        {"type": "@author_legend:click", "expr": "datum.name"}
      ]
    },
    {
      // Define the selected period (background select for none or legend data)
      "name": "period",
      "init": "",
      "streams": [
        {"type": "click", "expr": "''"},
        {"type": "@period_legend_text:click", "expr": "datum.data"}
      ]
    },
    {
      // Scale the tooltip image ratio to the desired size
      "name": "image_size",
      "init": {"width":0, "height":0},
      "streams": [
        {"type": "tooltip", "expr": "{width:tooltip.ratio.x * 100, height:tooltip.ratio.y * 100}"}
      ]
    },
    {
      // Determine the x position of the tooltip
      "name": "xPosition",
      "init": {},
      "streams": [
        {"type": "tooltip", "expr": "tooltip.date_sold",  "scale": {"name": "scale_date"} }
      ]
    },
    {
      // Determine the y position of the tooltip
      "name": "yPosition",
      "init": {},
      "streams": [
        {"type": "tooltip", "expr": "tooltip.price_adj",  "scale": {"name": "scale_price"} }
      ]
    }
  ],

  "predicates": [
    {
      "name": "no_image",
      "type": "==",
      "operands": [{"arg": "img"}, {"value": null}]
    },
    {
      // True if the tooltip point corresponds to the (annotated) reference point
      "name": "record",
      "type": "==",
      "operands": [{"signal": "tooltip.title"}, {"value": "Gospels of Henry the Lion"}]
    },
    {
      // True if the input point corresponds to the selected author.
      "name": "author_selected",
      "type": "==",
      "operands": [{"signal": "author"}, {"arg": "author_name"}]
    },
    {
      // True if there is no author selected. 
      "name": "no_author_selected",
      "type": "==",
      "operands": [{"signal": "author"}, {"value": ""}]
    },
    {
      // True if no author is selected or if the input point corresponds to the selected author.
      "name": "author_visible",
      "type": "or",
      "arg": "author_name",
      "operands": [{"predicate": "no_author_selected"}, {"predicate": "author_selected", "author_name": "author_name"}]
    },
    {
      // True if the input point corresponds to the selected period.
      "name": "period_selected",
      "type": "==",
      "operands": [{"signal": "period"}, {"arg": "period_name"}]
    },
    {
      // True if there is no period selected.
      "name": "no_period_selected",
      "type": "==",
      "operands": [{"signal": "period"}, {"value": ""}]
    },
    {
      // True if no period is selected or if the input point corresponds to the selected period.
      "name": "period_visible",
      "type": "or",
      "arg": "period_name",
      "operands": [{"predicate": "no_period_selected"}, {"predicate": "period_selected", "period_name": "period_name"}]
    },
    {
      // True if nothing is currently selected.
      "name": "none_selected",
      "type": "and",
      "operands": [{"predicate": "no_period_selected"}, {"predicate": "no_author_selected"}]
    },
    {
      // True if the xPosition of the tooltip is in the left half of the scatterplot.
      "name": "left_offset",
      "type": "<",
      "operands": [{"signal": "xPosition"}, {"value": 550}]
    },
    {
      // True if the yPosition of the tooltip is in the bottom section of the scatterplot.
      "name": "bottom_offset",
      "type": ">",
      "operands": [{"signal": "yPosition"}, {"value": 150}]
    }
  ],

  "scales": [
    {
      "name": "scale_date",
      "type": "time",
      "domain": {"data": "date_min_max", "field": "min_max"},
      "range": "width",
      "nice": "year"
    },
    {
      "name": "scale_price",
      "type": "linear",
      "domain": {"data": "table", "field": "price_adj"},
      "range": "height",
      "nice": true
    },
    {
      "name": "scale_period_colour",
      "type": "ordinal",
      "domain": {"data": "periods", "field": "data"},
      "range": ["#bbaadd", "#ffaa33", "#dd7722", "#cc3366", "#ee1188"]
    },
    {
      "name": "scale_period_text",
      "type": "ordinal",
      "domain": {"data": "periods", "field": "data"},
      "range": ["before 1450", "1450–1600", "1600–1800", "1800-1950", "since 1950"]
    },
    {
      // Scale to position the labels for the period legend.
      "name": "scale_period_position",
      "type": "ordinal",
      "domain": {"data": "periods", "field": "data"},
      "range": [15, 75]
    },
    {
      // Scale to position the labels for the author legend.
      "name": "scale_author_position",
      "type": "ordinal",
      "domain": {"data": "popular_authors", "field": "name"},
      "range": [15, 75]
    }
  ],

  "axes": [
    {
      "type": "x",
      "scale": "scale_date",
      "title": "Date of sale",
      "tickSizeEnd": 0,
      "subdivide": 4
    },
    {
      "type": "y",
      "scale": "scale_price",
      "title": "Adjusted price (in $ millions)",
      "subdivide": 4,
      "grid": true,
      "layer": "back",
    }
  ],

  "marks": [
    {
      // The 'symbol' mark specifies the points visible in the scatterplot.
      "name": "points",
      "type": "symbol",
      "from": {
        "data": "table",
        "transform": [{"type": "sort", "by": "-year_published"}]
      },
      "properties": {
        "enter": {
          "x": {"scale": "scale_date", "field": "date_sold"},
          "y": {"scale": "scale_price", "field": "price_adj"},
          "fill": {"scale": "scale_period_colour", "field": "period"},
          "size": {"value": 150},
          "shape": {
            "rule": [
              {"predicate": {"name": "no_image", "img": {"field": "img"} }, "value": "square"},
              {"value": "circle"}
            ]
          }
        },
        "update": {
          "opacity": {
            // If the data point corresponds to the selected author, selected period, or if nothing is selected,
            // it should be completely visible. Otherwise, it should become transparent.
            "rule": [
              {"predicate": {"name": "author_selected", "author_name": {"field": "author"} }, "value": 1},
              {"predicate": {"name": "period_selected", "period_name": {"field": "period"} }, "value": 1},
              {"predicate": {"name": "none_selected"}, "value": 1},
              {"value": 0.25}
            ]
          },
          "stroke": {"value": "white"},
          "strokeWidth": {"value": 1}
        },
        "hover": {
          "stroke": {"value": "black"},
          "strokeWidth": {"value": 2}
        }
      }
    },
    {
      // The tooltip consists of two lines of text 'No image available'
      "name": "tooltip",
      "from": {
        // Only draw the tooltip when there is no image available (and mousing over a point).
        // If there is an image associated with the tooltip point or the default title is set, 
        // the filter will remove all data points and this group will not be drawn.
        "data": "drawImage",
        "transform": [{"type": "filter", "test": "tooltip.img == null && tooltip.title != 'Sale Dates of Most Expensive Books'"}]
      },
      "type": "group",
      "properties": {
        // Specify properties of the entire tooltip (background, fill, position, etc.)
        "update": {
          "width": {"value": 115},
          "height": {"value": 33},
          "opacity": {"value": 0.75},
          "fill": {
            "rule": [
              {"predicate": {"name": "record"}, "value": "white"},
              {"value": "black"}
            ]
          },
          "x": {
            "rule": [
              // Specify the xPosition of the text tooltip based on the point position to prevent the tooltip from 
              // being drawn outside the visible region (e.g. draw it to the left if the point is near the right edge).
              {"predicate": {"name": "left_offset"}, "scale": "scale_date", "signal": "tooltip.date_sold", "offset": 7},
              {"scale": "scale_date", "signal": "tooltip.date_sold", "offset": -122} 
            ]
          },
          "y": {
            "rule": [
              // Specify the yPosition of the text tooltip based on the point position to prevent the tooltip from 
              // being drawn outside the visible region (e.g. draw it below the point if the point is near the top).
              {"predicate": {"name": "bottom_offset"}, "scale": "scale_price", "signal": "tooltip.price_adj", "offset": -40},
              {"scale": "scale_price", "signal": "tooltip.price_adj", "offset": -60}
            ]
          }
        }
      },
      "marks": [
        {
          // Text: 'No image available'
          "type": "text",
          "properties": {
            "enter": {
              "align": {"value": "left"},
              "baseline": {"value": "top"},
              "text": {"value": "No image available"},
              "fill": {"value": "white"},
              "x": {"value": 9},
              "y": {"value": 3},
              "opacity": {"value": 1}
            }
          }
        }
      ]
    },
    {
      // Draw a white background behind the title and legend to hide the gridlines. 
      "name": "title_background",
      "type": "rect",
      "properties": {
        "enter": {
          "fill": {"value": "white"},
          "x": {"value": 2},
          "x2": {"value": 285},
          "y": {"value": 2},
          "y2": {"value": 125}
        }
      }
    },
    {
      // Update the book title when a point has been moused over.
      "name": "book_title",
      "type": "text",
      "properties": {
        "enter": {
          "align": {"value": "left"},
          "fill": {"value": "black"},
          "fontSize": {"value": 18},
          "fontStyle": {"value": "bold"},
          "text": {"signal": "tooltip.title"}
        },
        "update": {
          "x": {"value": 20},
          "y": {"value": 20},
          "text": {"signal": "tooltip.title"}
        }
      }
    },
    {
      // Update the book author when a point has been moused over.
      "name": "book_author",
      "type": "text",
      "properties": {
        "enter": {
          "align": {"value": "left"},
          "fill": {"value": "gray"},
          "fontSize": {"value": 14},
          "x": {"value": 20},
          "y": {"value": 40},
          "fontStyle": {"value": "italic"}
        },
        "update": {
          "text": {"signal": "tooltip.author"}
        }
      }
    },
    {
      // Manually create the author legend to support interaction.
      // Selecting text in the legend updates the opacity of the points.
      "type": "group",
      "properties": {
        "enter": {
          "x": {"value": 125},
          "y": {"value": 55}
        }
      },
      "marks": [
        {
          // Add a text mark for each author specified in "popular_authors"
          "name": "author_legend",
          "type": "text",
          "from": {"data": "popular_authors"},
          "properties": {
            "enter": {
              "align": {"value": "left"},
              "fill": {"value": "black"},
              "x": {"value": 0},
              "y": {"scale": "scale_author_position", "field": "name"},
              "fontSize": {"value": 12},
              "text": {"field": "name"}
            },
            "update": {
              "opacity": {
                "rule": [
                  {"predicate": {"name": "author_selected","author_name": {"field": "name"} }, "value": 1},
                  {"predicate": {"name": "none_selected"}, "value": 1},
                  {"value": 0.15}
                ]
              }
            }
          }
        },
        {
          // Add a text mark for the legend title.
          "type": "text",
          "properties": {
            "enter": {
              "align": {"value": "left"},
              "fill": {"value": "black"},
              "x": {"value": 0},
              "y": {"value": 0},
              "fontSize": {"value": 12},
              "fontStyle": {"value": "bold"},
              "text": {"value": "Most Represented Authors"}
            }
          }
        }
      ]
    },
    {
      // Manually create the period legend to support interaction.
      // Selecting text in the legend updates the opacity of the points.
      "name": "period_legend",
      "type": "group",
      "properties": {
        "enter": {
          "x": {"value": 20},
          "y": {"value": 55}
        }
      },
      "marks": [
        {
          // Add a text mark for each period specified in "periods"
          "name": "period_legend_text",
          "type": "text",
          "from": {"data": "periods"},
          "properties": {
            "enter": {
              "align": {"value": "left"},
              "fill": {"value": "black"},
              "x": {"value": 15},
              "y": {"scale": "scale_period_position", "field": "data"},
              "fontSize": {"value": 12},
              "text": {"scale": "scale_period_text", "field": "data"}
            },
            "update": {
              "opacity": {
                "rule": [
                  {
                    "predicate": {
                      "name": "period_selected",
                      "period_name": {"field": "data"}
                    },
                    "value": 1
                  },
                  {
                    "predicate": {
                      "name": "none_selected"
                    },
                    "value": 1
                  },
                  {"value": 0.15}
                ]
              }
            }
          }
        },
        {
          // Add a text mark for the legend title.
          "type": "text",
          "properties": {
            "enter": {
              "align": {"value": "left"},
              "fill": {"value": "black"},
              "x": {"value": 0},
              "y": {"value": 0},
              "fontSize": {"value": 12},
              "fontStyle": {"value": "bold"},
              "text": {"value": "Periods"}
            }
          }
        },
        {
          // Add a filled circle for each text mark in the legend to specify the point color.
          "name": "period_legend_symbol",
          "type": "symbol",
          "from": {"data": "periods"},
          "properties": {
            "enter": {
              "size": {"value": 75},
              "fill": {"scale": "scale_period_colour", "field": "data"},
              "x": {"value": 5},
              "y": {"scale": "scale_period_position", "field": "data", "offset": -5},
            }
          }
        }
      ]
    },
    {
      // Add a text mark for the annotation of the reference point.
      "name": "record_annotation",
      "type": "text",
      "from": {"data": "old_record"},
      "properties": {
        "enter": {
          "align": {"value": "left"},
          "fill": {"value": "grey"},
          "x": {"scale": "scale_date", "field": "date_sold", "offset": 9},
          "y": {"scale": "scale_price", "field": "price_adj", "offset": 3},
          "fontSize": {"value": 10},
          "fontStyle": {"value": "italic"},
          "text": {"value": "Record sale price prior to first listed book."}
        },
        "update": {
          "opacity": {
            "rule": [
              // Update the opacity of the text based on whether or not the author, period, or nothing is selected.
              {"predicate": {"name": "author_selected","author_name": {"field": "author"} }, "value": 1},
              {"predicate": {"name": "period_selected","period_name": {"field": "period"} }, "value": 1},
              {"predicate": {"name": "none_selected" }, "value": 1},
              {"value": 0.25}
            ]
          }
        }
      }
    },
    {
      // The book image tooltip.
      "type": "image",
      "from": {
        // Only draw the tooltip image when there is an image available.
        // If there is an image associated with the tooltip point the filter will keep the only element and
        // draw the image. Otherwise the value will be removed and nothing will not be drawn.
        "data": "drawImage",
        "transform": [{"type": "filter", "test": "tooltip.img != null"}]
      },
      "properties": {
        "update": {
          "url": {"signal": "tooltip.img"},
          "width": {"signal": "image_size.width"},
          "height": {"signal": "image_size.height"},
          // Align, baseline, x, and y all use the offset predicates to account for the position to update 
          // the image location so that the image is not drawn out of the visible range of the scatterplot.
          "align": {
            "rule": [
              // Specify the alignment based on the x position. 
              // If the point is in the right half of the scatterplot, draw it to the left.
              {"predicate": {"name": "left_offset"}, "value": "left"},
              {"value": "right"} 
            ]
          },
          "baseline": {
            "rule": [
              // Specify the baseline based on the y position.
              // If the point is near the bottom, display the image above the point.
              {"predicate": {"name": "bottom_offset"}, "value": "bottom"},
              {"value": "top"} 
            ]
          },
          "x": {
            "rule": [
              // Update the offset of the x position based on whether or not 
              // the point is displayed to the left or right.
              {"predicate": {"name": "left_offset"}, "scale": "scale_date", "signal": "tooltip.date_sold", "offset": 7},
              {"scale": "scale_date", "signal": "tooltip.date_sold", "offset": -7} 
            ]
          },
          "y": {
            "rule": [
              // Update the offset of the y position based on whether or not
              // the point is displayed to the bottom or top.       
              {"predicate": {"name": "bottom_offset"}, "scale": "scale_price", "signal": "tooltip.price_adj", "offset": -7},
              {"scale": "scale_price", "signal": "tooltip.price_adj", "offset": 7}
            ]
          }
        }
      }
    }
  ]
}

</graph>