1. To join attributes from a csv file and a TopoJSON file, you first need to attach both files. Then, you need to find a common unique identifier in both datasets. Whether it may be an FIPS code or something else.
2. Bivariate mapping uses a 3x3 grid to show two variables and their correlation. There are predefined color combinations found in Observable named RdBu, BuPu, GnBu, and PuOr. To start, you just need to choose two variables, choose two different colors, and then form the matrix. Using the schemes function can allow you to determine the pre-made color scheme choices. Or, you can go to ColorBrewer and choose a color scheme. It is important to consider color blindness when determining your color scheme.
3. To create the legend, you must use the svg function to hold the legend. Then include the d3.cross and d3.range in order to form the combinations of the variables. This also allows you to position your grid and include the data. To make sure the legend is not hidden behind your map, you would need to use the function svg.append to translate your legend using x and y coordinates to move the legend to a spot that is visible next to your map.
4. To show values when you hover over polygons, using the function .append("title") followed by .text and then including .properties(idAttribute) and then formatting that data will allow the data to be seen when you hover over the polygons.