如何根据点生成热图

时间:2011-03-18 09:43:19

标签: c# .net

我想以windows形式生成热图。我有一组点作为输入。如何以最简单的方式做到这一点? 感谢。

8 个答案:

答案 0 :(得分:6)

这是一个简单的方法,它将根据min和max之间的值的相对位置生成颜色。接近min的值将更加环保,而接近max的值将更加红色 要使用此方法,请生成值列表并计算最小值和最大值。如果要构建网格,可以处理RowDataBound事件或类似事件,并从那里调用HeatMap方法。获取对单元格的引用,并将背景颜色设置为HeatMap方法返回的颜色。

public Color HeatMap(decimal value, decimal min, decimal max)
{
   decimal val = (value - min) / (max-min);
   return new Color
   {
       A = 255,
       R = Convert.ToByte(255 * val),
       G = Convert.ToByte(255 * (1-val)),
       B = 0
   };
}

答案 1 :(得分:5)

根据此处已有的答案,此方法允许您指定要用作最大和最小颜色的Colors

private Color HeatMapColor(double value, double min, double max)
{
    Color firstColour = Color.RoyalBlue;
    Color secondColour = Color.LightSkyBlue;

    // Example: Take the RGB
    //135-206-250 // Light Sky Blue
    // 65-105-225 // Royal Blue
    // 70-101-25 // Delta

    int rOffset = Math.Max(firstColour.R, secondColour.R);
    int gOffset = Math.Max(firstColour.G, secondColour.G);
    int bOffset = Math.Max(firstColour.B, secondColour.B);

    int deltaR = Math.Abs(firstColour.R - secondColour.R);
    int deltaG = Math.Abs(firstColour.G - secondColour.G);
    int deltaB = Math.Abs(firstColour.B - secondColour.B);

    double val = (value - min) / (max - min);
    int r = rOffset - Convert.ToByte(deltaR * (1 - val));
    int g = gOffset - Convert.ToByte(deltaG * (1 - val));
    int b = bOffset - Convert.ToByte(deltaB * (1 - val));        

    return Color.FromArgb(255, r, g, b);
}

对于包含一些示例数据的测试DataGrid,结果如下所示。

enter image description here

答案 2 :(得分:3)

这是Sam代码的修复。

  public Color HeatMapColor(decimal value, decimal min, decimal max)
    {
        decimal val = (value - min) / (max - min);
        int r = Convert.ToByte(255 * val);
        int g = Convert.ToByte(255 * (1 - val));
        int b = 0;

        return Color.FromArgb(255,r,g,b);                                    
    }

答案 3 :(得分:2)

将表面划分为单元格网格,并计算每个单元格内的点数。

给定点数,计算每个单元格的颜色

答案 4 :(得分:1)

Crt版“柯蒂斯怀特”的回答:

public Color HeatMap(decimal value, decimal min, decimal max)
        {
            decimal val = (value - min) / (max - min);
            int A, B, R, G;
            A = 255;
            R = Convert.ToByte(255 * val);
            B = Convert.ToByte(255 * (1 - val));
            G = 0;
            return Color.FromArgb(A, R, G, B);
        }

答案 5 :(得分:0)

从红色到黄色到绿色的解决方案

static Color CreateHeatColor(int value, decimal max)
    {
        if (max == 0) max = 1M;
        decimal pct = value/max;
         Color color = new Color();

        color.A = 255;

        if (pct < 0.34M)
        {
            color.R = (byte) (128 + (127 * Math.Min(3 * pct, 1M)));
            color.G = 0;
            color.B = 0;
        }
        else if (pct < 0.67M)
        {
            color.R = 255;
            color.G = (byte) (255 * Math.Min(3 * (pct - 0.333333M), 1M));
            color.B = 0;
        }
        else
        {
            color.R = (byte)(255 * Math.Min(3 * (1M - pct), 1M));
            color.G = 255;
            color.B = 0;
        }

        return color;
    }

答案 6 :(得分:0)

这对我很有用。

public Color HeatMap(float value, float max)
    {
        int r, g, b;
        float val = value / max; // Assuming that range starts from 0
        if (val > 1)
            val = 1;
        if (val > 0.5f)
        {
            val = (val - 0.5f) * 2;
            r = Convert.ToByte(255 * val);
            g = Convert.ToByte(255 * (1 - val));
            b = 0;
        }
        else
        {
            val = val * 2;
            r = 0;
            g = Convert.ToByte(255 * val);
            b = Convert.ToByte(255 * (1 - val));
        }
        return Color.FromArgb(255, r, g, b);
    }

答案 7 :(得分:0)

如果您想通过黄色将红色变为绿色,您还可以使用HSL来获取热图。该实例中的数字为0 - 60,其中0 =红色,60 =绿色(see figure 11 on this link)。

要实现,您需要使用System.Runtime.InteropServices并添加以下内容:

[DllImport("shlwapi.dll")]
public static extern int ColorHLSToRGB(int H, int L, int S);

在该方法中,val是一个long值,m_iMax是集合中的最大数字,您可以根据需要进行更改:

if (val == 0)
    return ColorTranslator.ToHtml(Color.FromArgb(255, 255, 255)); // white
else
{
  // 0 = red, 60 = green
  int col = 60 - (int)(60 * val / m_iMax);

  return ColorTranslator.ToHtml(ColorTranslator.FromWin32(ColorHLSToRGB(col, 120, 240)));
}

以下是HTML表格中上述代码的结果:

Heatmap