func TestHeatMapWithContour(t *testing.T) { if !*visualDebug { return } m := unitGrid{mat64.NewDense(3, 4, []float64{ 2, 1, 4, 3, 6, 7, 2, 5, 9, 10, 11, 12, })} h := NewHeatMap(m, palette.Heat(12, 1)) levels := []float64{1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5} c := NewContour(m, levels, palette.Rainbow(10, palette.Blue, palette.Red, 1, 1, 1)) c.LineStyles[0].Width *= 5 plt, _ := plot.New() plt.Add(h) plt.Add(c) plt.Add(NewGlyphBoxes()) plt.X.Padding = 0 plt.Y.Padding = 0 plt.X.Max = 3.5 plt.Y.Max = 2.5 plt.Save(7, 7, "heat.svg") }
func ExampleHeatMap() { m := unitGrid{mat64.NewDense(3, 4, []float64{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, })} h := NewHeatMap(m, palette.Heat(12, 1)) p, err := plot.New() if err != nil { log.Panic(err) } p.Title.Text = "Heat map" p.Add(h) p.X.Padding = 0 p.Y.Padding = 0 p.X.Max = 3.5 p.Y.Max = 2.5 err = p.Save(100, 100, "testdata/heatMap.png") if err != nil { log.Panic(err) } }
func main() { var levels []float64 for l := 100.5; l < volcano.Matrix.(*mat64.Dense).Max(); l += 5 { levels = append(levels, l) } c := plotter.NewContour(volcano, levels, palette.Rainbow(len(levels), (palette.Yellow+palette.Red)/2, palette.Blue, 1, 1, 1)) quarterStyle := draw.LineStyle{ Color: color.Black, Width: vg.Points(0.5), Dashes: []vg.Length{0.2, 0.4}, } halfStyle := draw.LineStyle{ Color: color.Black, Width: vg.Points(0.5), Dashes: []vg.Length{5, 2, 1, 2}, } c.LineStyles = append(c.LineStyles, quarterStyle, halfStyle, quarterStyle) h := plotter.NewHeatMap(volcano, palette.Heat(len(levels)*2, 1)) p, err := plot.New() if err != nil { panic(err) } p.Title.Text = "Maunga Whau Volcano" p.Add(h) p.Add(c) p.X.Padding = 0 p.Y.Padding = 0 _, p.X.Max, _, p.Y.Max = h.DataRange() name := "example_volcano" for _, ext := range []string{ ".eps", ".pdf", ".svg", ".png", ".tiff", ".jpg", } { if err := p.Save(4, 4, name+ext); err != nil { panic(err) } } }
func HeatMap(image []float64, index int, fileName string) { dim := int(math.Sqrt(float64(len(image)))) m := NewGrid(mat64.NewDense(dim, dim, image)) h := plotter.NewHeatMap(m, palette.Heat(10, 1)) p, err := plot.New() if err != nil { panic(err) } p.Title.Text = "Heat map" p.Y.Max = MaxFloat(image) p.X.Max = MaxFloat(image) p.Add(h) err = p.Save(6*vg.Inch, 6*vg.Inch, fileName+strconv.FormatInt(int64(index), 16)+".png") if err != nil { panic(err) } }
func Example_heatMap() *plot.Plot { m := unitGrid{mat64.NewDense(3, 4, []float64{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, })} h := plotter.NewHeatMap(m, palette.Heat(12, 1)) p, err := plot.New() if err != nil { panic(err) } p.Title.Text = "Heat map" p.Add(h) p.X.Padding = 0 p.Y.Padding = 0 p.X.Max = 3.5 p.Y.Max = 2.5 return p }
func mouseTracks(scores []rings.Scorer, highlight []string, palname string, diameter vg.Length, lenRange int) (pp []plot.Plotter, lo, hi float64, err error) { var p []plot.Plotter radius := diameter / 2 // Relative sizes. const ( gap = 0.005 label = 117. / 110. countsInner = 25. / 110. countsOuter = 40. / 110. heatInner = 45. / 110. heatOuter = 75. / 110. traceInner = 80. / 110. traceOuter = 95. / 110. karyotypeInner = 100. / 110. karyotypeOuter = 1. large = 7. / 110. small = 2. / 110. ) sty := plotter.DefaultLineStyle sty.Width /= 2 chr := make([]feat.Feature, len(mm10.Chromosomes)) for i, c := range mm10.Chromosomes { chr[i] = c } mm, err := rings.NewGappedBlocks( chr, rings.Arc{rings.Complete / 4 * rings.CounterClockwise, rings.Complete * rings.Clockwise}, radius*karyotypeInner, radius*karyotypeOuter, gap, ) if err != nil { return nil, 0, 0, err } mm.LineStyle = sty pal, err := brewer.GetPalette(brewer.TypeQualitative, palname, len(highlight)) if err == nil { for i, hn := range highlight { for _, c := range mm.Set { if hn == strings.ToLower(c.Name()) { arc, err := mm.Base.ArcOf(c, nil) arc.Theta += rings.Complete * gap / 2 arc.Phi -= rings.Complete * gap if err != nil { fmt.Printf("could not find: %s\n", hn) break } col := pal.Colors()[i] nc := color.NRGBAModel.Convert(col).(color.NRGBA) nc.A = 0x40 h := rings.NewHighlight( nc, arc, radius*(traceInner-2.5/110.), radius*(label+5./110.), ) h.LineStyle = sty h.LineStyle.Width /= 4 p = append(p, h) break } } } } else if len(highlight) > 0 { fmt.Println("no palette") } p = append(p, mm) bands := make([]feat.Feature, len(mm10.Bands)) cens := make([]feat.Feature, 0, len(mm10.Chromosomes)) for i, b := range mm10.Bands { bands[i] = colorBand{b} s := b.Start() // This condition depends on p -> q sort order in the $karyotype.Bands variable. // All standard genome packages follow this, though here the test is more general than // actually required since mm is telocentric. if b.Band[0] == 'q' && (s == 0 || mm10.Bands[i-1].Band[0] == 'p') { cens = append(cens, colorBand{&genome.Band{Band: "cen", Desc: "Band", StartPos: s, EndPos: s, Giemsa: "acen", Chr: b.Location()}}) } } b, err := rings.NewBlocks(bands, mm, radius*karyotypeInner, radius*karyotypeOuter) if err != nil { return nil, 0, 0, fmt.Errorf("bands: %v", err) } p = append(p, b) c, err := rings.NewBlocks(cens, mm, radius*karyotypeInner, radius*karyotypeOuter) if err != nil { return nil, 0, 0, fmt.Errorf("centromeres: %v", err) } p = append(p, c) font, err := vg.MakeFont("Helvetica", radius*large) if err != nil { return nil, 0, 0, err } lb, err := rings.NewLabels(mm, radius*label, rings.NameLabels(mm.Set)...) if err != nil { return nil, 0, 0, err } lb.TextStyle = draw.TextStyle{Color: color.Gray16{0}, Font: font} p = append(p, lb) s, err := rings.NewScores(scores, mm, radius*heatInner, radius*heatOuter, &rings.Heat{Palette: palette.Heat(10, 1).Colors()}, ) if err != nil { return nil, 0, 0, err } p = append(p, s) smallFont, err := vg.MakeFont("Helvetica", radius*small) if err != nil { return nil, 0, 0, err } traces := make([]rings.Scorer, len(scores)) for i, s := range scores { traces[i] = &tfs{s.(*feature)} } t, err := rings.NewScores(traces, mm, radius*traceInner, radius*traceOuter, &rings.Trace{ LineStyles: func() []draw.LineStyle { ls := []draw.LineStyle{sty, sty} for i, c := range brewer.Set1[3].Colors()[:len(ls)] { nc := color.NRGBAModel.Convert(c).(color.NRGBA) nc.A = 0x80 ls[i].Color = nc } return ls }(), Join: true, Axis: &rings.Axis{ Angle: rings.Complete / 4, Grid: plotter.DefaultGridLineStyle, LineStyle: sty, Tick: rings.TickConfig{ Marker: plot.DefaultTicks{}, LineStyle: sty, Length: 2, Label: draw.TextStyle{Color: color.Gray16{0}, Font: smallFont}, }, }, }, ) if err != nil { return nil, 0, 0, err } if maxTrace != 0 { t.Max = maxTrace if t.Min > t.Max { return nil, 0, 0, fmt.Errorf("maximum trace out of range: min=%f", t.Min) } } if !math.IsInf(t.Max-t.Min, 0) { p = append(p, t) } counts := make([]rings.Scorer, len(scores)) for i, s := range scores { counts[i] = ctfs{s.(*feature)} } ct, err := rings.NewScores(counts, mm, radius*countsInner, radius*countsOuter, &rings.Trace{ LineStyles: func() []draw.LineStyle { ls := []draw.LineStyle{sty} ls[0].Color = color.Gray16{0} return ls }(), Join: true, Axis: &rings.Axis{ Angle: rings.Complete / 4, Grid: plotter.DefaultGridLineStyle, LineStyle: sty, Tick: rings.TickConfig{ Marker: plot.DefaultTicks{}, LineStyle: sty, Length: 2, Label: draw.TextStyle{Color: color.Gray16{0}, Font: smallFont}, }, }, }, ) if err != nil { return nil, 0, 0, err } if maxCounts != 0 { ct.Max = maxCounts if ct.Min > ct.Max { return nil, 0, 0, fmt.Errorf("maximum counts out of range: min=%f", ct.Min) } } p = append(p, ct) return p, s.Min, s.Max, nil }