Sorry @pemp for the late response. I just saw your question.
You did not specify versions of libraries, so I could not run your code on Jupyter - I was able to run it as a regular file and see the output. I looked at your code. It seems that you are creating your own dashboard rather than using existing primitives and using callback functions to handle events of changing widget value.
I suspect that the @pn.depends decorators that you use are not recognized by the save command and therefore you loose the interactivity. What you are seeing is the plot specified by the default option. Although it seems to you that your plot is static since you do not load any new data your dashboard is actually dynamic. It is dynamic since it plots a new plot only when you trigger the widget and the python callback functions that update color only execute when you trigger them by changing the value in the widget.
In the example I have about with holoviews, the system renders all the plots behind the scenes and triggering the plot change does not call a python function. In fact, holoviews generates all the plots beforehand.
In your code the system does not know in advance how many colors are there. You can potentially change it dynamically somewhere else in your code. In my example, all plots for each option have been generated in a for loop before I assemble them in holoviews.
If you want to convert your example to a static html file, you will have to make some compromises on looks and prepare all plots before you render them.
Note that panel is designed so you can create amazing dynamic contents that you cannot save into a static html file. However, you can still create very sophisticated plots that will save to one html file.