Rendering a heat map for 400.000 points
Unless you need some sort of high level interaction with those points, to create 400,000 shapes (which are FrameworkElement, all but lightweight) is a waste of time and resources.

Did you consider to use an image, drawing them inside a WriteableImage and to display the image instead? Check MSDN for DrawingVisual and DrawingContext subjects. I used this method for small multiples composed with really huge heatmaps and it worked like a charm. Simple hittesting (for example to show a tooltip with exact value) is trivial to implement using X-Y coordinates.

You will keep your visual tree almost empty, you won't create few thousands brushes each time (but you can create your color palette once and use it multiple times) and redrawing will be as fast as you want. In most applications you don't need an infinite number of color shades, consider to limit palette to 256 entries and to map values to those discrete values. 

You will need to create an image with the proper size but this has a great advantage:


When redrawing is requested then immediately create a very low-res image with few hundred points. 
Start a background thread to draw the full-resolution image (using current canvas size).
When image is ready then simply replace the old low-res one.


In this way you can even easily debounce multiple requests caused by resize operations (if you care at all).

Note: to pick one point every N is not a proper decimation method because it doesn't preserve local minimum and maximum; you may (will!) visualize wrong results. Consider using minmax or, only if your type of data allows it, at least an average.