I agree and I think that’s why I end up re-learning d3 over and over.
But having to do it yourself is a lot of work so you have to make an executive decision between shoehorning some plotting library that can’t do a chart feature that honestly should be supported versus building an entire chart from scratch.
Maybe 80% of what I do is applications, 10% systems and 10% data analysis. Often I will spend two weeks making Jupyter notebooks and then not look at it for two months.
I find most plotting libs have a lot of arbitrary things to remember, they usually have several nano DSLs (strings that get interpreted in ways more complex than atoi.). On top of that most plotting libs have something wrong from my point of view in various areas like deciding the range of the axes or handling huge numbers of points or something.
D3 makes you do a lot yourself but the interfaces it provides to do that are conceptually straightforward. Instead of using someone else’s bloated and buggy general purpose code though an APi that feels like assembling a ship in a bottle you can just do it right with D3.js.