378 karma · joined July 26, 2011
Creator of https://plotly.express/ and https://react-pivottable.js.org/ and https://pivottable.js.org/
Personal Website: http://nicolas.kruchten.com/
Email first at last dot com.
It’s especially important in data tables when coupled with tabular numbers (essentially mono spaced numbers) so you can e.g. bold a cell without having the thousands or decimal separators get out of alignment in a column of numbers. Spreadsheet programs use fonts with this property.
I'm not sure this is very helpful to predict traffic patterns over the next 20-30 years in a policy-sensitive way... All the historical data in the world wouldn't have predicted the rise of Uber, the pandemic, the maybe-eventual rise of self-driving cars etc.
For reference, the four stages go like this: you start with "trip supply and demand" by zone, then inter-zone trips are generated by matching those up, then mode choice is computed per trip based on cost and travel time priors, then assignment to the network which results in actual trips and computed travel times based on route selection and congestion.
The travel times can then be fed back into mode-choice and iterated on: people will make the transit-vs-car choice differently based on the relative costs (in time and money and inconvenience) so iterating the last two steps can go a ways towards modelling that equilibrium.
Folks can exert some amount of choice around which trips they make (as mentioned in the article) and where they work, based on how easy it is to get there, so feeding the travel costs back into trip-generation can account for some of that, and over a longer horizon, both workers and employers can exert some control over where they live/site their facilities, so all 4 stages can be iterated as well.
None of this is perfect, and it's not always done, and the rest of the article's points stand, but I just wanted to say the modelling is not all that primitive :)
Edit: I studied this stuff in university 15 years ago with Professor Eric Miller, who wrote this book on how to integrate all this stuff in an iterative way... https://link.springer.com/article/10.1007/s11067-005-2630-5
This is the same approach used by non-Plotly systems like Bokeh in Python (and at one time in R?), Highcharter in R (targets the Highcharts Javascript library) and Altair in Python (targets the Vega-Lite Javascript library).
One of the major advantages of this approach is that it makes it easy to move from visualizing data locally to embedding these same visualizations into a web application, which is what Plotly's Dash library is for: https://dash.plotly.com/
I'll shamelessly plug Plotly Express (https://plotly.express/) here as something that works in a similar way, i.e. generates JSON figure descriptions rendered in Javascript, with an even more minimal API, that now accepts both long and wide data :)
And yes, the desktop-app build toolchain is a pain to maintain.
I wish I had more time to work on the Jupyter version but Plotly Express and the JupyterLab Chart Editor keep me pretty busy at Plotly these days!
There's even a Dash wrapper now: https://community.plotly.com/t/show-and-tell-dash-pivottable...
See https://plot.ly/python/is-plotly-free/ for full details.
Here's the full Javascript reference for all of these attributes: https://plot.ly/javascript/reference/
a) customize every aspect of the chart, from the fonts to the length of the axis ticks to the legend placement etc (see the full list of thousands of available customization attributes here: https://plot.ly/python/reference/)
b) export to raster or vector formats for publication (https://plot.ly/python/static-image-export/)
c) use high-level grammar-of-graphics-inspired tools like https://plotly.express/ to create complex charts in a single line of code.
Here is the relevant documentation: https://plot.ly/python/static-image-export/
Under the hood it works the same way: Plotly.py generates JSON figure descriptions which are passed to Plotly.js for rendering.
The whole thing is, of course, free and open-source and well-documented :)