OxyPlotにHeatMapSeriesというのがあるというのを知った.これまでは,Bitmapで自分で描いていた.
Bitmapで自分で描くより楽だ.例えばここのようなサンプルが良い.
下は参考ページのやり方・名前の取り方をほぼそのまま参照している.Windows Forms用に少し手直しが入っているのと,linearColorAxis1.Palette = OxyPalettes.Gray(10);を追加しているところくらいが異なる.(参考ではRainbowになっている?)
縦横に正弦波が0.5 秒おきに流れていく(感じ).
using OxyPlot; using OxyPlot.Axes; using OxyPlot.Series; using OxyPlot.WindowsForms; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace HeatmapTest { private OxyPlot.WindowsForms.PlotView plotView1; private PlotModel plotModelSpectrogram = new PlotModel(); public HeatMapSeries heatMapSeries1 = new HeatMapSeries(); private Double[,] Data = new Double[240, 250]; private double t = 0; private System.Windows.Forms.Timer timer1; public Form1() { InitializeComponent(); this.plotView1 = new OxyPlot.WindowsForms.PlotView(); this.plotView1.Dock = System.Windows.Forms.DockStyle.Fill; this.plotView1.Location = new System.Drawing.Point(0, 0); this.plotView1.Name = "plotView1"; this.plotView1.PanCursor = System.Windows.Forms.Cursors.Hand; this.plotView1.Size = new System.Drawing.Size(633, 362); this.plotView1.TabIndex = 0; this.plotView1.Text = "plotView1"; this.plotView1.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; this.plotView1.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; this.plotView1.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; this.Controls.Add(this.plotView1); plotModelSpectrogram.Title = "TEST"; var linearColorAxis1 = new LinearColorAxis(); linearColorAxis1.Palette = OxyPalettes.Gray(10); linearColorAxis1.Position = AxisPosition.Right; linearColorAxis1.Minimum = 0.0; linearColorAxis1.Maximum = 100; plotModelSpectrogram.Axes.Add(linearColorAxis1); var linearAxis1 = new LinearAxis(); linearAxis1.Position = AxisPosition.Bottom; linearAxis1.IsAxisVisible = false; linearAxis1.IsZoomEnabled = false; plotModelSpectrogram.Axes.Add(linearAxis1); // Dummy var linearAxis_a = new LinearAxis(); linearAxis_a.Position = AxisPosition.Bottom; linearAxis_a.Minimum = 0.0; linearAxis_a.Maximum = 120.0; linearAxis_a.Title = "Time s"; linearAxis_a.IsZoomEnabled = false; plotModelSpectrogram.Axes.Add(linearAxis_a); var linearAxis2 = new LinearAxis(); linearAxis2.Position = AxisPosition.Left; linearAxis2.IsAxisVisible = false; linearAxis2.IsZoomEnabled = false; plotModelSpectrogram.Axes.Add(linearAxis2); // Dummy var linearAxis_b = new LinearAxis(); linearAxis_b.Position = AxisPosition.Left; linearAxis_b.Minimum = 0.0; linearAxis_b.Maximum = 1000.0; linearAxis_b.Title = "Frequency kHz"; linearAxis_b.IsZoomEnabled = false; plotModelSpectrogram.Axes.Add(linearAxis_b); heatMapSeries1.Data = new double[240, 250]; heatMapSeries1.X0 = 0.0; heatMapSeries1.X1 = 100.0; heatMapSeries1.Y0 = 0.0; heatMapSeries1.Y1 = 1000.0; plotModelSpectrogram.Series.Add(heatMapSeries1); this.plotView1.Model = plotModelSpectrogram; this.timer1 = new Timer(); this.timer1.Interval = 500; this.timer1.Enabled = true; this.timer1.Tick += new System.EventHandler(this.timer1_Tick); } private void timer1_Tick(object sender, EventArgs e) { PlotSpectrogram(); } private void AddLastData(Double[] data) { for (int i = 0; i < Data.GetLength(0) - 1; i++) { for (int j = 0; j < Data.GetLength(1); j++) { Data[i, j] = Data[i + 1, j]; } } for (int j = 0; j < Data.GetLength(1); j++) { Data[Data.GetLength(0) - 1, j] = data[j]; } var pldata = new double[240, 250]; Array.Copy(Data, pldata, Data.Length); heatMapSeries1.Data = pldata; } public void PlotSpectrogram() { Double[] data = new Double[Data.GetLength(1)]; for (int i = 0; i < data.Length; i++) { data[i] = (50.0 + 20.0 * Math.Sin(0.2 * i) + 20.0 * Math.Sin(t)); } t += 0.5; AddLastData(data); plotModelSpectrogram.InvalidatePlot(true); } } }