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