it-swarm.com.ru

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

Рассмотрим следующий лист:

     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. Я хотел бы раскрасить каждую точку соответствующим образом, чтобы я мог видеть шаблон (например, группа green была почти всегда в левой части графика). Поскольку мой список состоит из 500 строк, я не могу сделать это вручную. Как я могу сделать это автоматически?

39
Pr0no

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

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

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

UPDATED

Код ниже раскрасит диаграмму согласно скриншоту. Это предполагает только три цвета. Вы можете добавить дополнительные операторы 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
15
David Zemens

Решение не 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 соответственно, чтобы сделать так, чтобы график автоматически обновлялся при добавлении дополнительных данных.

67
chancea

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

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

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

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

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

Я уверен, что поставил его в правильном формате, в 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-адрес в funfun Excel надстройку . Вот как это выглядит с моим примером:

 final

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

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

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

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

1
nicolas dejean

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

0
Andrew Blosfelds

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

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
0
Jose Miguel Chaves Miranda

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

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