web-dev-qa-db-fra.com

Comment puis-je colorer des points dans un diagramme de dispersion xy en fonction de la valeur de la colonne?

Considérez la feuille de travail suivante:

     A       B        C        D
1 COMPANY  XVALUE   YVALUE   GROUP
2 Apple     45       35       red
3 Xerox     45       38       red
4 KMart     63       50       orange
5 Exxon     53       59       green

J'ai utilisé la fonction scatterplot dans Excel pour créer le graphique suivant:

enter image description here

Cependant, chaque point du graphique a une propriété supplémentaire: GROUP. Il existe quatre groupes: red, orange, black et green. Je voudrais colorier chaque point en conséquence, afin de pouvoir peut-être voir un motif (le groupe green étant presque toujours du côté gauche du graphique, par exemple) Comme ma liste compte 500 lignes, je ne peux pas le faire manuellement. Comment puis-je le faire automatiquement?

39
Pr0no

J'ai répondu à une question très similaire:

https://stackoverflow.com/a/15982217/1467082

Vous devez simplement parcourir la collection .Points de la série, puis affecter la valeur .Format.Fill.ForeColor.RGB des points en fonction des critères dont vous avez besoin. 

MIS À JOUR

Le code ci-dessous coloriera le graphique selon la capture d'écran. Cela suppose seulement que trois couleurs sont utilisées. Vous pouvez ajouter des instructions case supplémentaires pour d'autres valeurs de couleur et mettre à jour l'affectation de myColor aux valeurs RVB appropriées pour chacune.

screenshot

Option Explicit
Sub ColorScatterPoints()
    Dim cht As Chart
    Dim srs As Series
    Dim pt As Point
    Dim p As Long
    Dim Vals$, lTrim#, rTrim#
    Dim valRange As Range, cl As Range
    Dim myColor As Long

    Set cht = ActiveSheet.ChartObjects(1).Chart
    Set srs = cht.SeriesCollection(1)

   '## Get the series Y-Values range address:
    lTrim = InStrRev(srs.Formula, ",", InStrRev(srs.Formula, ",") - 1, vbBinaryCompare) + 1
    rTrim = InStrRev(srs.Formula, ",")
    Vals = Mid(srs.Formula, lTrim, rTrim - lTrim)
    Set valRange = Range(Vals)

    For p = 1 To srs.Points.Count
        Set pt = srs.Points(p)
        Set cl = valRange(p).Offset(0, 1) '## assume color is in the next column.

        With pt.Format.Fill
            .Visible = msoTrue
            '.Solid  'I commented this out, but you can un-comment and it should still work
            '## Assign Long color value based on the cell value
            '## Add additional cases as needed.
            Select Case LCase(cl)
                Case "red"
                    myColor = RGB(255, 0, 0)
                Case "orange"
                    myColor = RGB(255, 192, 0)
                Case "green"
                    myColor = RGB(0, 255, 0)
            End Select

            .ForeColor.RGB = myColor

        End With
    Next


End Sub
15
David Zemens

Solution non-VBA:

Vous devez créer un groupe de données supplémentaire pour chaque groupe de couleurs représentant les valeurs Y pour ce groupe particulier. Vous pouvez utiliser ces groupes pour créer plusieurs jeux de données dans votre graphique.

Voici un exemple utilisant vos données:

     A       B        C        D                    E                        F                            G
----------------------------------------------------------------------------------------------------------------------
1| COMPANY  XVALUE   YVALUE   GROUP                 Red                     Orange                       Green
2| Apple     45       35       red         =IF($D2="red",$C2,NA()) =IF($D2="orange",$C2,NA()) =IF($D2="green",$C2,NA())
3| Xerox     45       38       red         =IF($D3="red",$C3,NA()) =IF($D3="orange",$C3,NA()) =IF($D3="green",$C3,NA())
4| KMart     63       50       orange      =IF($D4="red",$C4,NA()) =IF($D4="orange",$C4,NA()) =IF($D4="green",$C4,NA())
5| Exxon     53       59       green       =IF($D5="red",$C5,NA()) =IF($D5="orange",$C5,NA()) =IF($D5="green",$C5,NA())

Cela devrait ressembler à ceci après:

     A       B        C        D          E           F          G
---------------------------------------------------------------------
1| COMPANY  XVALUE   YVALUE   GROUP       Red         Orange     Green
2| Apple     45       35       red         35         #N/A       #N/A    
3| Xerox     45       38       red         38         #N/A       #N/A
4| KMart     63       50       orange     #N/A         50        #N/A
5| Exxon     53       59       green      #N/a        #N/A        59

Vous pouvez maintenant générer votre graphique en utilisant différents ensembles de données. Voici une image montrant uniquement ces données d'exemple:

enter image description here

Vous pouvez modifier les valeurs de la série (X;Y) en B:B ; E:E, B:B ; F:F, B:B ; G:G respectivement pour que le graphique soit automatiquement mis à jour lorsque vous ajoutez des données.

67
chancea

Je vois qu'il existe une solution VBA et une solution non-VBA, qui sont toutes les deux vraiment bonnes. Je voulais proposer ma solution Javascript.

Il existe un complément Excel appelé Funfun qui vous permet d’utiliser javascript, HTML et css dans Excel. Il dispose d'un éditeur en ligne avec une feuille de calcul intégrée dans laquelle vous pouvez créer votre graphique.

J'ai écrit ce code pour vous avec Chart.js :

https://www.funfun.io/1/#/edit/5a61ed15404f66229bda3f44

Pour créer ce graphique, j'ai entré mes données dans la feuille de calcul et les ai lues avec un fichier JSON, c'est le fichier short.

Je m'assure de le mettre dans le bon format, en script.js, afin de pouvoir l'ajouter à mon tableau:

var data = [];
var color = [];
var label = [];

for (var i = 1; i < $internal.data.length; i++)
{
    label.Push($internal.data[i][0]);
    data.Push([$internal.data[i][1], $internal.data[i][2]]);
    color.Push($internal.data[i][3]);
}

Je crée ensuite le diagramme de dispersion avec chaque point ayant sa couleur et sa position:

 var dataset = [];
  for (var i = 0; i < data.length; i++) {   
    dataset.Push({
      data: [{
        x: data[i][0],
        y: data[i][1] 
      }],
      pointBackgroundColor: color[i],
      pointStyle: "cercle",
      radius: 6  
    });
  }

Après avoir créé mon diagramme de dispersion, je peux le télécharger dans Excel en collant l’adresse URL dans le complément funfun Excel . Voici à quoi cela ressemble avec mon exemple:

 final

Ceci fait, vous pouvez changer la couleur ou la position d'un point instantanément, dans Excel, en modifiant les valeurs de la feuille de calcul.

Si vous souhaitez ajouter des points supplémentaires dans les graphiques, il vous suffit de modifier le rayon data dans le fichier short json.

J'espère que cette solution Javascript aide!

Divulgation: Je suis développeur de funfun

1
nicolas dejean

Si vous codez vos catégories de texte d'axe x, les répertoriez dans une seule colonne, puis, dans les colonnes adjacentes, répertoriez les points de la parcelle pour les variables respectives par rapport au code de catégorie de texte pertinent et laissez les cellules vides par rapport au code de catégorie de texte non pertinent. le résultat affiché. Toutes les questions faites le moi savoir .  enter image description here

0
Andrew Blosfelds

Récemment, j'ai dû faire quelque chose de similaire et je l'ai résolu avec le code ci-dessous. J'espère que ça aide!

Sub ColorCode()
Dim i As Integer
Dim j As Integer
i = 2
j = 1

Do While ActiveSheet.Cells(i, 1) <> ""


If Cells(i, 5).Value = "RED" Then
ActiveSheet.ChartObjects("YourChartName").Chart.FullSeriesCollection(1).Points(j).MarkerForegroundColor = RGB(255, 0, 0)



Else

If Cells(i, 5).Value = "GREEN" Then
ActiveSheet.ChartObjects("YourChartName").Chart.FullSeriesCollection(1).Points(j).MarkerForegroundColor = RGB(0, 255, 0)

Else

If Cells(i, 5).Value = "GREY" Then
ActiveSheet.ChartObjects("YourChartName").Chart.FullSeriesCollection(1).Points(j).MarkerForegroundColor = RGB(192, 192, 192)

Else

If Cells(i, 5).Value = "YELLOW" Then
ActiveSheet.ChartObjects("YourChartName").Chart.FullSeriesCollection(1).Points(j).MarkerForegroundColor = RGB(255, 255, 0)

End If
End If
End If
End If

i = i + 1
j = j + 1

Loop



End Sub

Essaye ça:

Dim xrndom As Random
    Dim x As Integer
    xrndom = New Random

    Dim yrndom As Random
    Dim y As Integer
    yrndom = New Random
    'chart creation
    Chart1.Series.Add("a")
    Chart1.Series("a").ChartType = DataVisualization.Charting.SeriesChartType.Point
    Chart1.Series("a").MarkerSize = 10
    Chart1.Series.Add("b")
    Chart1.Series("b").ChartType = DataVisualization.Charting.SeriesChartType.Point
    Chart1.Series("b").MarkerSize = 10
    Chart1.Series.Add("c")
    Chart1.Series("c").ChartType = DataVisualization.Charting.SeriesChartType.Point
    Chart1.Series("c").MarkerSize = 10
    Chart1.Series.Add("d")
    Chart1.Series("d").ChartType = DataVisualization.Charting.SeriesChartType.Point
    Chart1.Series("d").MarkerSize = 10
    'color
    Chart1.Series("a").Color = Color.Red
    Chart1.Series("b").Color = Color.Orange
    Chart1.Series("c").Color = Color.Black
    Chart1.Series("d").Color = Color.Green
    Chart1.Series("Chart 1").Color = Color.Blue

    For j = 0 To 70
        x = xrndom.Next(0, 70)
        y = xrndom.Next(0, 70)
        'Conditions
        If j < 10 Then
            Chart1.Series("a").Points.AddXY(x, y)
        ElseIf j < 30 Then
            Chart1.Series("b").Points.AddXY(x, y)
        ElseIf j < 50 Then
            Chart1.Series("c").Points.AddXY(x, y)
        ElseIf 50 < j Then
            Chart1.Series("d").Points.AddXY(x, y)
        Else
            Chart1.Series("Chart 1").Points.AddXY(x, y)
        End If
    Next
0
HelloKitty