Как я могу покрасить точки в XY scatterplot в соответствии со значением столбца?

рассмотрим следующую таблицу:

     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

я использовал функцию scatterplot в Excel для создания следующей диаграммы:

enter image description here

однако каждая точка на графике имеет дополнительное свойство:GROUP. Есть четыре группы: red, orange, black и green. Я хотел бы покрасить каждую точку соответственно, чтобы я мог видеть шаблон (group почти всегда находится в левой части диаграммы). Поскольку мой список имеет длину 500 строк, я не могу сделать это вручную. Как я могу сделать это автоматически?

6 ответов


Я отвечал на очень похожий вопрос:

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

вам просто нужно повторить серию'.Points сбор, а затем вы можете назначить точки' .Format.Fill.ForeColor.RGB значение на основе любых критериев, которые вам нужны.

обновлено

код ниже будет окрашивать диаграмму на скриншоте. Это предполагает использование только трех цветов. Можно добавить дополнительные операторы case для других значений цвета и обновите назначение myColor к соответствующим значениям RGB для каждого.

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

не-VBA решение:

вам нужно создать дополнительную группу данных для каждой группы цветов, которые представляют значения Y для этой конкретной группы. Эти группы можно использовать для создания нескольких наборов данных на графике.

вот пример использования ваших данных:

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

теперь вы можете генерировать график, используя различные наборы данных. Вот изображение, показывающее только этот пример данные:

enter image description here

вы можете изменить ряд (X;Y) значения B:B ; E:E, B:B ; F:F, B:B ; G:G соответственно, сделать так, чтобы график автоматически обновляется при добавлении новых данных.


Я вижу, что есть решение VBA и не-VBA решение, которые оба действительно хороши. Я хотел предложить свой решение Javascript.

существует надстройка Excel под названием Funfun что позволяет использовать javascript, HTML и css в Excel. Он имеет онлайн-редактор со встроенной электронной таблицей, где вы можете построить свою диаграмму.

Я написал этот код для вас диаграмма.js:

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

чтобы создать эту диаграмму, я ввел свои данные в электронную таблицу и прочитал ее с помощью файла json, это .

Я обязательно помещу его в правильный формат, в script.js, поэтому я могу добавить его в свою диаграмму:

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]);
}

затем я создаю диаграмму разброса с каждой точкой, имеющей свой назначенный цвет и позиция:

 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  
    });
  }

после того, как я создал свою диаграмму рассеяния, я могу загрузить ее в Excel, вставив URL-адрес в норм надстройки Excel. Вот как это выглядит с моим примером:

final

как только это будет сделано, вы можете мгновенно изменить цвет или положение точки в Excel, изменив значения в электронной таблице.

если вы хотите добавить дополнительные точки на диаграммах, вам просто нужно изменить радиус data на short файл json.

надеюсь, что это решение Javascript помогает !

раскрытие информации: я разработчик funfun


попробуйте это:

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

недавно мне пришлось сделать что-то подобное, и я решил это с помощью кода ниже. Надеюсь, это поможет!

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

Если вы код свой оси х категорий текста, перечислить их в одном столбце, то в соседних столбцов списка участков пунктов для соответствующих переменных от соответствующих текстовый код категории и просто оставить пустые ячейки против не-текст код категории, вы можете точечную диаграмму и получить результат. Любые вопросы, дайте мне знать. enter image description here