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

envisagez 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 dans le graphique a une propriété supplémentaire: GROUP. Il y a quatre groupes: red, orange,black et green. Je voudrais colorer chaque point en conséquence, de sorte que je pourrais peut-être voir un modèle (groupe greenétant presque toujours sur le côté gauche de la carte, par instance.) Parce que ma liste est longue de 500 lignes, Je ne peux pas le faire manuellement. Comment puis-je faire cela automatiquement?

37
demandé sur Pr0no 2013-06-19 18:35:27

6 réponses

j'ai répondu à une question très semblable:

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

vous avez simplement besoin d'itérer sur la série'.Points collection, et ensuite, vous pouvez affecter des points' .Format.Fill.ForeColor.RGB valeur basée sur les critères dont vous avez besoin.

UPDATED

le code ci-dessous colore le graphique par la capture d'écran. Cela suppose seulement trois couleurs sont utilisées. Vous pouvez ajouter des énoncés de cas supplémentaires pour autres valeurs de couleur, et mettre à jour l'affectation de myColor aux valeurs RVB appropriées pour chacun.

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
14
répondu David Zemens 2017-05-23 12:09:52

Non-VBA Solution:

vous devez créer un groupe supplémentaire de données pour chaque groupe de couleur qui représente les valeurs de Y pour ce groupe particulier. Vous pouvez utiliser ces groupes pour créer plusieurs ensembles de données dans votre graphique.

Voici un exemple d'utilisation de 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())

ça devrait ressembler à Ça par la suite:

     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 juste cet exemple données:

enter image description here

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

62
répondu chancea 2015-04-24 15:48:08

je vois qu'il y a une solution VBA et une solution non-VBA, qui sont toutes deux très bonnes. Je voulais proposer mon solution Javascript.

il y a un Add-in Excel appelé Funfun cela vous permet d'utiliser javascript, HTML et css dans Excel. Il a un éditeur en ligne avec un tableur intégré où vous pouvez construire votre diagramme.

j'ai écrit ce code pour vous avec Graphique.js:

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

pour créer ce diagramme, j'ai entré mes données sur le tableur et je les ai lues avec un fichier json, c'est le short fichier.

je fais en sorte de le mettre dans le bon format, dans script.js, afin que je puisse 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 alors le diagramme de dispersion avec chaque point ayant sa couleur désignée et 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 scatter chart je peux le télécharger dans Excel en collant L'URL dans le funfun Excel add-in. Voici à quoi il ressemble avec mon exemple:

final

une fois que cela est fait, vous pouvez changer la couleur ou la position d'un point instantanément, dans Excel, en changeant les valeurs dans le tableur.

Si vous voulez ajouter des points dans les charts, vous avez juste besoin de modifier le rayon de data dans le short fichier json.

Espérons que ce solution Javascript aide !

Divulgation : je suis un développeur de funfun

1
répondu nicolas dejean 2018-01-19 14:13:08

essaye ceci:

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
répondu HelloKitty 2017-04-07 15:16:35

récemment j'ai dû faire quelque chose de similaire et je l'ai résolu avec le code ci-dessous. Espérons que cela 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
0
répondu Jose Miguel Chaves Miranda 2017-11-07 17:32:47

si vous cochez vos catégories de texte de l'axe des x, énumérez-les dans une colonne unique, puis dans les colonnes adjacentes énumérez les points de représentation graphique pour les variables respectives par rapport au code de catégorie de texte pertinent et laissez juste des cellules Vierges par rapport au code de catégorie de texte non pertinent, vous pouvez représenter graphique de dispersion et obtenir le résultat affiché. Des questions faites le moi savoir. enter image description here

0
répondu Andrew Blosfelds 2018-08-08 02:19:21