web-dev-qa-db-de.com

Wie kann ich Punkte in einem xy-Scatterplot nach Spaltenwert färben?

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:

enter image description here

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?

39
Pr0no

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.

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

Nicht-VBA-Lösung:

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:

enter image description here

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.

67
chancea

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:

 final

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

1
nicolas dejean

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 .  enter image description here

0

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
0
HelloKitty