2011-03-18 104 views

回答

2

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

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

6

这是一个简单的方法,将根据最小值和最大值之间的值的相对位置生成颜色。接近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 
    }; 
} 
+0

柯蒂斯,那么你的补丁修复?我发布的代码是intentally稀疏,但它运行(在WPF中)。 – Sam 2012-07-21 00:24:50

+2

您的代码不在Windows窗体应用程序中生成。 ARGB字段仅准备好。颜色是一个结构和ARGB只有获得方法。 – 2014-06-03 21:58:41

2

这是修复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);          
    } 
+0

和[Sam's answer](http://stackoverflow.com/a/11570954/947171)有何不同? – 2014-03-14 20:08:34

+2

在Windows窗体中,Sam的代码无法运行。 ARGB字段仅准备好。 – 2014-06-03 21:58:19

4

大厦,该方法允许你指定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

+0

如果我使用以下颜色 颜色firstColour = Color.Blue; 颜色secondColour = Color.Yellow; 我只是得到灰色阴影 – Chris 2014-11-30 20:31:47

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; 
    } 
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); 
    } 
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是一个长期的价值和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

0

“柯蒂斯白” 的回答的C#版本:

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); 
     }