I made this with D3 on Observable. I’ve written a couple posts about how I made it:
but the best resource is the Observable Notebook itself which contains quite a bit of explanation of what I did.