05-draw-headmap.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package main
  2. import (
  3. "math"
  4. "math/rand"
  5. "gonum.org/v1/plot"
  6. "gonum.org/v1/plot/palette/moreland"
  7. "gonum.org/v1/plot/plotter"
  8. "gonum.org/v1/plot/vg"
  9. "gonum.org/v1/plot/vg/draw"
  10. )
  11. func main() {
  12. points := plotter.XYs{}
  13. for i := 0; i < 10; i++ {
  14. points = append(points, plotter.XY{
  15. X: 100 * rand.Float64(),
  16. Y: 100 * rand.Float64(),
  17. })
  18. }
  19. scatter, err := plotter.NewScatter(points)
  20. if err != nil {
  21. panic(err)
  22. }
  23. scatter.Shape = draw.CircleGlyph{}
  24. heatmap := plotter.NewHeatMap(Heat(points), moreland.SmoothBlueRed().Palette(100))
  25. plt := plot.New()
  26. plt.Y.Min, plt.X.Min, plt.Y.Max, plt.X.Max = 0, 0, 100, 100
  27. plt.Add(heatmap, scatter)
  28. if err := plt.Save(5*vg.Inch, 5*vg.Inch, "05-draw-heatmap.png"); err != nil {
  29. panic(err)
  30. }
  31. }
  32. type Heat plotter.XYs
  33. func (h Heat) Dims() (c, r int) { return 100, 100 }
  34. func (h Heat) X(c int) float64 { return float64(c) }
  35. func (h Heat) Y(r int) float64 { return float64(r) }
  36. func (h Heat) Z(c, r int) float64 {
  37. var sum float64
  38. for _, p := range h {
  39. sum += math.Sqrt(math.Pow(p.X-h.X(c), 2) + math.Pow(p.Y-h.Y(r), 2))
  40. }
  41. return -sum
  42. }