Racial Dot Map in DRA2020

Terry Crowley
Dave’s Redistricting
4 min readOct 12, 2022


DRA2020 now provides the ability to overlay a “racial dot map” on your map as you draw or view your map.

Dot map rendering for New York area

Like demographic precinct or district coloring, the racial dot map layer provides insight into the mix of race and ethnicities within a particular area. Each colored dot represents a single individual and their race/ethnicity as reported by the census. The coloring used is White — blue, Black or combination — green, Asian or Pacific Islander — red, Hispanic — orange, Other — brown.

Depending on zoom level, some dots will overlap, resulting in a blending of colors based on the number of individuals and their race or ethnicity represented by that point on the map.

Unlike demographic coloring, the dot map layer also provides insight on population density within a particular area (down to the census block level) and the fine-grained mixing of different racial and ethnic individuals within an area.

You control the display of the dot map layer from the Overlays panel.

The data used to generate the dot map is derived from the specific total population or voting age population dataset selected in the maps dataset properties panel.

Racial Dot Map is derived from either the maps Census or VAP dataset

You control which of these two datasets DRA2020 uses with the drop down control next to the Racial Dot checkbox. That dropdown displays a dialog that allows you to pick which of those two map datasets to use.

Control which dataset is represented by the dot map

This dialog can also be used to control the opacity of the racial dot map layer.

Background and Implementation Details

The racial dot map layer was inspired by the Racial Dot Map project at the University of Virginia’s Cooper Center. It was fully re-implemented by the DRA team.

The implementation approach was to first generate a single latitude and longitude point labeled with race/ethnicity for every individual reported by the census (so for example approximately 335M points for the 2020 total population census and 261M points for the voting age population for the 2020 census). We do this separately for each of the census and voting age population datasets we support (e.g. ACS or prisoner-adjusted as well).

The census block-level information provides the outline of a census block and the total population for that block and the racial and ethnic breakdown. The generation process walks through each of several million census blocks and generates a random point within that census block for each individual and labels it with race/ethnicity. We generate a random point within the block because census data does not include specific location within a block for an individual (for privacy and other reasons). This does mean that a point might show up in the middle of a park or body of water (although parks and bodies of water often have their own unique census block so that happens fairly rarely).

Once the point information is generated, we walk over that information for each of 10 zoom levels and generate bitmaps that blend the point data into bitmap tiles. We use different blending of opacity at different zoom levels to try to achieve something that can be easily interpreted. At the highest zoom levels, individual dots are visible. Note that we only generate tiles to zoom level 13, so beyond that level the bitmaps are scaled and dots start to look a bit fuzzy.

The generation process takes several hours to complete on a modern iMac for each dataset and generates about 8GB of bitmap tile data for each dataset.

We decided to not expose partisan data using the same technique for several reasons. Election results are updated much more frequently and are updated at the granularity of states, not the entire country. So keeping the layers up to date is a much more expensive proposition. Also, DRA2020 allows you to select arbitrary combinations of election results which is not feasible to support in a pre-rendered bitmap layer. Finally, election results are only available at a granularity of precincts, so the fine-grained block-level rendering used in the bitmap layer could be more misleading.



Terry Crowley
Dave’s Redistricting

Programmer, Ex-Microsoft Technical Fellow, Sometime Tech Blogger, Passionate Ultimate Frisbee Player