old_contents: import pandas as pd
  
  from bokeh.models import ColumnDataSource, LabelSet
  from bokeh.plotting import figure, show, output_file
  from bokeh.sampledata.periodic_table import elements
  
  elements = elements.copy()
  elements = elements[elements["atomic number"] <= 82]
  elements = elements[~pd.isnull(elements["melting point"])]
  mass = [float(x.strip("[]")) for x in elements["atomic mass"]]
  elements["atomic mass"] = mass
  
  palette = ["#053061", "#2166ac", "#4393c3", "#92c5de", "#d1e5f0",
             "#f7f7f7", "#fddbc7", "#f4a582", "#d6604d", "#b2182b", "#67001f"]
  
  melting_points = elements["melting point"]
  low = min(melting_points)
  high= max(melting_points)
  melting_point_inds = [int(10*(x-low)/(high-low)) for x in melting_points] #gives items in colors a value from 0-10
  elements['melting_colors'] = [palette[i] for i in melting_point_inds]
  
  TOOLS = "pan,wheel_zoom,box_zoom,reset,save"
  TITLE = "Density vs Atomic Weight of Elements (colored by melting point)"
  
  p = figure(tools=TOOLS, toolbar_location="above", logo="grey", plot_width=1200, title=TITLE)
  p.background_fill_color= "#dddddd"
  p.xaxis.axis_label="atomic weight (amu)"
  p.yaxis.axis_label="density (g/cm^3)"
  p.grid.grid_line_color="white"
  
  source = ColumnDataSource(elements)
  
  p.circle("atomic mass", "density", size=12, source=source,
           color='melting_colors', line_color="black", fill_alpha=0.8)
  
  labels = LabelSet(x="atomic mass", y="density", text="symbol", y_offset=8,
                    text_font_size="8pt", text_color="#555555",
                    source=source, text_align='center')
  p.add_layout(labels)
  
  output_file("elements.html", title="elements.py example")
  
  show(p)
  
new_contents: import pandas as pd
  
  from bokeh.models import ColumnDataSource, LabelSet, HoverTool
  from bokeh.plotting import figure, show, output_file
  from bokeh.sampledata.periodic_table import elements
  
  elements = elements.copy()
  elements = elements[elements["atomic number"] <= 82]
  elements = elements[~pd.isnull(elements["melting point"])]
  mass = [float(x.strip("[]")) for x in elements["atomic mass"]]
  elements["atomic mass"] = mass
  
  palette = ["#053061", "#2166ac", "#4393c3", "#92c5de", "#d1e5f0",
             "#f7f7f7", "#fddbc7", "#f4a582", "#d6604d", "#b2182b", "#67001f"]
  
  melting_points = elements["melting point"]
  low = min(melting_points)
  high = max(melting_points)
  melting_point_inds = [int(10*(x-low)/(high-low)) for x in melting_points] #gives items in colors a value from 0-10
  elements['melting_colors'] = [palette[i] for i in melting_point_inds]
  
  TITLE = "Density vs Atomic Weight of Elements (colored by melting point)"
  tools = "pan,wheel_zoom,box_zoom,reset,save".split(',')
  hover = HoverTool(tooltips=[
      ("name", "@name"),
      ("symbol:", "@symbol"),
      ("density", "@density"),
      ("atomic weight", "@{atomic mass}"),
      ("melting point", "@{melting point}")
  ])
  tools.append(hover)
  
  p = figure(tools=tools, toolbar_location="above", logo="grey", plot_width=1200, title=TITLE)
  p.background_fill_color = "#dddddd"
  p.xaxis.axis_label = "atomic weight (amu)"
  p.yaxis.axis_label = "density (g/cm^3)"
  p.grid.grid_line_color = "white"
  
  source = ColumnDataSource(elements)
  
  p.circle("atomic mass", "density", size=12, source=source,
           color='melting_colors', line_color="black", fill_alpha=0.8)
  
  labels = LabelSet(x="atomic mass", y="density", text="symbol", y_offset=8,
                    text_font_size="8pt", text_color="#555555",
                    source=source, text_align='center')
  p.add_layout(labels)
  
  output_file("elements.html", title="elements.py example")
  
  show(p)
  
subject: Add tooltip to elements example (#7501)