Как я могу раскрасить точки на диаграмме рассеяния 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, чтобы создать следующую диаграмму:

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

 chancea19 июн. 2013 г., 17:11
сортировка столбца группы и затем создание 4 графиков (по 1 для каждой группы) вне вопроса?
 Dan25 февр. 2016 г., 11:31
Если ваши данные должны быть цветными в соответствии с непрерывными последовательными данными, это может помочь:stackoverflow.com/q/35624585/1011724
 guthrie07 дек. 2015 г., 02:18
Это очень ограниченное решение и плохой дизайн, поскольку оно создает невидимую тесную связь между упорядочением данных, которое может быть на другом листе графика. Также тогда нельзя сортировать данные для других представлений, не разрушая сюжет, и, как только заметки, возможно, даже не зная об этом.
 chancea19 июн. 2013 г., 18:29
Да, под 4 участками я подразумеваю 4 набора данных в 1 графике. Они будут накладываться друг на друга. Сортировка столбца по группам позволит вам вручную выбирать наборы данных, но это не поможет, если вы когда-нибудь добавите данные в свою электронную таблицу. Мой ответ ниже объясняет более автоматизированный способ, когда я говорю графики, на которые я ссылаюсь ->Select Data Source Add
 momobo19 июн. 2013 г., 16:51
Вы можете попробовать адаптировать эту технику:peltiertech.com/WordPress/...
 Pr0no19 июн. 2013 г., 18:25
@chancea Мне нужно, чтобы все точки появлялись на одном графике, как показано выше, а не на 4 разных графиках. Если ваше решение требует четырехкратной работы, но все точки отображаются на одном графике, это было бы здорово. Это поможет вашему вопросу?

Ответы на вопрос(6)

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

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

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

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

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
 yakatz07 нояб. 2017 г., 18:38
Добро пожаловать в StackOverflow. Пожалуйста, оставляйте комментарии с вашим кодом, чтобы люди могли понять, как он работает.

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

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

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

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

Надеюсь этоРешение Javascript помогает!

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

Решение не 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

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

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

 Hatt27 июн. 2018 г., 20:37
Это отличный ответ.
 user251861804 июн. 2014 г., 16:07
+1 за решение без макросов
 Jon Peltier29 мар. 2015 г., 16:31
Вы действительно неНе нужно ничего делать со значениями X. Все четыре серии цветов могут разделять столбец B 's значения для X. Используйте формульный подход, использованный выше в столбце G, чтобы сгенерировать значения Y для красного, но повторите для остальных трех цветов.
Решение Вопроса

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

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

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

ОБНОВЛЕНО

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

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
 Pr0no19 июн. 2013 г., 20:07
Кто-то, должно быть, отклонил редактирование, которое я сделал, прежде чем вы смогли увидеть его В любом случае, я подумал, что кнопка редактирования была там, чтобы сделать дополнения, вместо того, чтобы делать еще один комментарий. Теперь я знаю лучше :-) Спасибо за вашу помощь, это работает как шарм!
 David Zemens19 июн. 2013 г., 20:08
Я видел, что три человека отклонили его (потому что это был комментарий или ответ на существующий ответ, а не конструктивное редактирование по своей сути). Не беспокойся, хотя. Рад, что это работает для вас!
 Pr0no19 июн. 2013 г., 18:22
Спасибо! Тем не менее, не могли бы вы объяснить мне, как я могу динамически изменить цвет в зависимости от значения вGROUP столбец? Я добавил псевдокод в ваш пост, но нене знаю, как на самом деле соединить точкуp правильноGROUP значение...
 David Zemens19 июн. 2013 г., 18:37
Я нене вижу изменений вмой публиковать, в любом случае, пожалуйста, не пересматривайте содержание кого-либоs ответ, кроме как для исправления очевидных ошибок или для форматирования / читабельности. Не делайтеКогда-либо добавить контент кому-то ещесообщения / ответы. Я на мгновение изменю свой ответ, чтобы он был немного более приспособленным для вашей конкретной проблемы.

Ваш ответ на вопрос