Betrachten Sie das folgende Arbeitsblatt:
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
Ich habe die Streudiagramm-Funktion in Excel verwendet, um das folgende Diagramm zu erstellen:
Jeder Punkt im Diagramm hat jedoch eine zusätzliche Eigenschaft: GROUP
. Es gibt vier Gruppen: red
, orange
, black
und green
. Ich möchte jeden Punkt entsprechend einfärben, sodass ich vielleicht ein Muster sehen könnte (Gruppe green
, die fast immer auf der linken Seite des Diagramms ist). Da meine Liste 500 Zeilen lang ist, kann ich dies nicht manuell tun. Wie kann ich das automatisch machen?
Ich habe eine sehr ähnliche Frage beantwortet:
https://stackoverflow.com/a/15982217/1467082
Sie müssen lediglich die .Points
-Sammlung der Serie durchlaufen, und Sie können den .Format.Fill.ForeColor.RGB
-Wert der Punkte basierend auf den gewünschten Kriterien zuweisen.
AKTUALISIERTE
Der folgende Code färbt das Diagramm gemäß dem Screenshot. Dies setzt nur drei Farben voraus. Sie können zusätzliche Case-Anweisungen für andere Farbwerte hinzufügen und die Zuweisung von myColor
auf die entsprechenden RGB-Werte für jeden aktualisieren.
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
Sie müssen für jede Farbgruppe eine zusätzliche Datengruppe erstellen, die die Y-Werte für diese bestimmte Gruppe darstellt. Sie können diese Gruppen verwenden, um mehrere Datensätze in Ihrem Diagramm zu erstellen.
Hier ein Beispiel, das Ihre Daten verwendet:
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())
Es sollte danach so aussehen:
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
Jetzt können Sie Ihre Grafik mit verschiedenen Datensätzen erstellen. Hier ist ein Bild, das nur diese Beispieldaten zeigt:
Sie können die Werte der Serie (X;Y)
in B:B ; E:E
, B:B ; F:F
, B:B ; G:G
ändern, damit die Grafik automatisch aktualisiert wird, wenn Sie weitere Daten hinzufügen.
Ich sehe, dass es eine VBA-Lösung und eine Nicht-VBA-Lösung gibt, die beide wirklich gut sind. Ich wollte meine Javascript-Lösung vorschlagen.
Es gibt ein Excel-Add-In namens Funfun , mit dem Sie Javascript, HTML und CSS in Excel verwenden können. Es verfügt über einen Online-Editor mit einer eingebetteten Tabelle, in der Sie Ihr Diagramm erstellen können.
Ich habe diesen Code für Sie mit Chart.js geschrieben:
https://www.funfun.io/1/#/edit/5a61ed15404f66229bda3f44
Um dieses Diagramm zu erstellen, habe ich meine Daten in die Kalkulationstabelle eingegeben und sie mit einer Json-Datei gelesen. Es handelt sich um die short
-Datei.
Ich stelle sicher, dass ich es in das richtige Format in script.js
setze, damit ich es meinem Chart hinzufügen kann:
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]);
}
Dann erstelle ich das Scatter-Diagramm, wobei jeder Punkt seine gewünschte Farbe und Position hat:
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
});
}
Nachdem ich mein Streudiagramm erstellt habe, kann ich es in Excel hochladen, indem Sie die URL in das funfun Excel-Add-In einfügen. So sieht es mit meinem Beispiel aus:
Sobald dies erledigt ist, können Sie in Excel die Farbe oder Position eines Punkts sofort ändern, indem Sie die Werte in der Kalkulationstabelle ändern.
Wenn Sie zusätzliche Punkte in die Diagramme einfügen möchten, müssen Sie lediglich den Radius von data
in der short
-Json-Datei ändern.
Hoffe, diese Javascript-Lösung hilft!
Disclosure: Ich bin ein Entwickler von Funfun
Wenn Sie Ihre Textkategorien für die X-Achse codieren, sie in einer einzigen Spalte auflisten, Listenpunkte für die jeweiligen Variablen mit dem relevanten Textkategoriecode in benachbarten Spalten auflisten und leere Zellen gegenüber dem nicht relevanten Textkategoriecode lassen, können Sie Plot- und Get-Elemente streuen das angezeigte Ergebnis. Irgendwelche Fragen lass es mich wissen .
Vor kurzem musste ich etwas Ähnliches tun und es mit dem folgenden Code gelöst werden. Ich hoffe es hilft!
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
Versuche dies:
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