c# 画热力图(二)

public void DrawHeat(string filePath, string sheetName)
        {
            string ParamPalettePath = @"D:\Ventuz5\01\Images\HeatMap/palette.png";//颜色板

            DataTable dt = GetExcelTable(filePath, sheetName,2);
            List<double> lon = new List<double>();
            List<double> lat = new List<double>();
            List<double> weight = new List<double>();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                string[] lonAndLat = dt.Rows[i]["坐标值"].ToString().Split(',');
                double lonStr = Convert.ToDouble(lonAndLat[0]);
                double latStr = Convert.ToDouble(lonAndLat[1]);
                double weightStr = Convert.ToDouble(dt.Rows[i]["权重值"].ToString());
                lon.Add(lonStr);lat.Add(latStr);weight.Add(weightStr);

            }
                double latRange = Math.Abs(lat.Max() - lat.Min());
                double lngRange = Math.Abs(lon.Max() - lon.Min());
                int width = 0;
                int height = 0;
                double scale = 1;
                if (lngRange > latRange)
                {
                    width = 500;
                    scale = lngRange / 500;
                    height = (int)(latRange / lngRange * 500);
                }
                else
                {
                    height =500;
                    scale = latRange / 500;
                    width = (int)(lngRange / latRange * 500);
                }
                Bitmap bitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                RayHeatMap heatMap = new RayHeatMap();
                heatMap.BrushStop = 0.3f;
                heatMap.Radius = 30;
                for (int i = 0; i < lat.Count; i++)
                {
                    int y = (int)((lat[i] - lat.Min()) / scale);
                    int x = (int)((lon[i] - lon.Min()) / scale);
                    int weightInt = (int)((double)weight[i] / weight.Max() * 255);
                    heatMap.AddPoint(new Point(x, y), weightInt);
                }
                heatMap.Draw(ref bitmap);
                heatMap.Colorize(ref bitmap, ParamPalettePath);
                DirectoryInfo dir = new DirectoryInfo(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(ParamPalettePath), "ShenZhen"));
                if (!dir.Exists)
                    dir.Create();
                string name = DateTime.Now.ToString("yyyyMMddHHmm") + ".png";
                string filePaths = System.IO.Path.Combine(dir.ToString(), name);
                FileStream fs = File.Open(filePaths, FileMode.Create);
                bitmap.Save(fs, System.Drawing.Imaging.ImageFormat.Png);
                fs.Close();
        }

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用C#绘制小波包数据热力图的示例代码: ```csharp using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; namespace WaveletPacketHeatmap { public partial class Form1 : Form { private Chart chart; public Form1() { InitializeComponent(); // 创建 Chart 控件 chart = new Chart(); chart.Parent = this; chart.Dock = DockStyle.Fill; chart.BackColor = Color.White; // 添加热力图 AddHeatmap(); } private void AddHeatmap() { // 读取小波包数据 double[,] data = ReadWaveletPacketData("wavelet_packet_data.txt"); // 创建数据序列 List<double> values = new List<double>(); for (int i = 0; i < data.GetLength(0); i++) { for (int j = 0; j < data.GetLength(1); j++) { values.Add(data[i, j]); } } // 计算数据范围 double minValue = values.Min(); double maxValue = values.Max(); // 创建热力图序列 List<DataPoint> points = new List<DataPoint>(); for (int i = 0; i < data.GetLength(0); i++) { for (int j = 0; j < data.GetLength(1); j++) { double value = data[i, j]; double intensity = (value - minValue) / (maxValue - minValue); Color color = Color.FromArgb((int)(255 * intensity), 0, 0); points.Add(new DataPoint(j, i, value) { Color = color }); } } // 创建热力图 Series heatmap = new Series(); heatmap.ChartType = SeriesChartType.Point; heatmap.Points.AddRange(points.ToArray()); chart.Series.Add(heatmap); // 设置坐标轴 chart.ChartAreas.Add(new ChartArea()); chart.ChartAreas[0].AxisX.Minimum = 0; chart.ChartAreas[0].AxisX.Maximum = data.GetLength(1); chart.ChartAreas[0].AxisY.Minimum = 0; chart.ChartAreas[0].AxisY.Maximum = data.GetLength(0); chart.ChartAreas[0].AxisX.Interval = 1; chart.ChartAreas[0].AxisY.Interval = 1; chart.ChartAreas[0].AxisX.MajorGrid.Enabled = false; chart.ChartAreas[0].AxisY.MajorGrid.Enabled = false; chart.ChartAreas[0].AxisX.MajorTickMark.Enabled = false; chart.ChartAreas[0].AxisY.MajorTickMark.Enabled = false; chart.ChartAreas[0].AxisX.LabelStyle.Enabled = false; chart.ChartAreas[0].AxisY.LabelStyle.Enabled = false; } private double[,] ReadWaveletPacketData(string filename) { List<double[]> rows = new List<double[]>(); using (StreamReader reader = new StreamReader(filename)) { while (!reader.EndOfStream) { string line = reader.ReadLine(); string[] values = line.Split('\t'); double[] row = new double[values.Length]; for (int i = 0; i < values.Length; i++) { row[i] = double.Parse(values[i]); } rows.Add(row); } } double[,] data = new double[rows.Count, rows[0].Length]; for (int i = 0; i < rows.Count; i++) { for (int j = 0; j < rows[i].Length; j++) { data[i, j] = rows[i][j]; } } return data; } } } ``` 在上面的示例代码中,`ReadWaveletPacketData` 方法用于从文件中读取小波包数据,`AddHeatmap` 方法用于创建热力图并添加到 Chart 控件中。通过设置数据点的颜色来实现热力图效果。最后需要设置坐标轴的范围、网格线、刻度标记和标签等属性来展示热力图
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值