7
votes

Comment générer des cartes de chaleur compte tenu des points

Je veux générer une carte de chaleur sous forme Windows. J'ai un ensemble de points comme entrée. Comment faire de cela de la manière la plus simple? Merci.


0 commentaires

8 Réponses :


2
votes

Divisez la surface en une grille de cellules et comptez les points à l'intérieur de chaque cellule.

Compte tenu du nombre de points, calculez une couleur pour chaque cellule


0 commentaires

6
votes

Voici une méthode simple qui générera une couleur basée sur la position relative d'une valeur comprise entre min et max. Les valeurs plus proches de MIN seront plus vertes, tandis que les valeurs plus proches de Max seront plus rouges.
Pour utiliser cette méthode, générez votre liste de valeurs et calculez les valeurs min et max. Si vous construisez une grille, vous pouvez gérer l'événement Rowdatabound ou quelque chose de similaire et appelez la méthode HeatMap à partir de là. Obtenez une référence à la cellule et réglez la couleur de fond sur la couleur renvoyée par la méthode 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
   };
}


2 commentaires

Curtis, qu'est-ce que votre solution correcte? Le code que j'ai publié est spacieux de manière intentionnelle mais il fonctionne (dans WPF).


Votre code ne construit pas dans une application de formulaire Windows. Les champs Argb sont prêts uniquement. La couleur est une structure et ARGB n'a que des méthodes.



4
votes

Ceci est une solution pour le code de 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);                                    
    }


2 commentaires

Et comment est-ce exactement différent de La réponse de Sam ?


Sous Windows Forms, le code de Sam ne fonctionne pas. Les champs Argb sont en lecture seule.



5
votes

Bâtiment sur les réponses déjà ici, cette méthode vous permet de spécifier les couleurs code> code> que vous souhaitez utiliser comme couleurs max et min.

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


1 commentaires

Si j'utilise les couleurs suivantes, Couleur FirstColour = Color.Blue; Couleur secondcolour = Color.Yellow; Je viens d'avoir des nuances de gris



1
votes

une solution passant de rouge au jaune au vert xxx


0 commentaires

0
votes

Cela a bien fonctionné pour moi. xxx


0 commentaires

0
votes

Si vous voulez du rouge au vert via jaune, vous pouvez également utiliser HSL pour obtenir votre chaleur. Les chiffres dans cette instance seront 0 à 60, où 0 = rouge et 60 = vert ( Voir la figure 11 sur Ce lien ).

Pour mettre en œuvre, vous devez utiliser System.Runtime.Interservices et ajoutez les éléments suivants: P>

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


0 commentaires

1
votes

La version C # de "Curtis White" S Réponse:

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


0 commentaires