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:
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?
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.
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
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:
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.
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:
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
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 .
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