Как я могу покрасить точки в 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 для создания следующей диаграммы:
однако каждая точка на графике имеет дополнительное свойство:GROUP
. Есть четыре группы: red
, orange
, black
и green
. Я хотел бы покрасить каждую точку соответственно, чтобы я мог видеть шаблон (group почти всегда находится в левой части диаграммы). Поскольку мой список имеет длину 500 строк, я не могу сделать это вручную. Как я могу сделать это автоматически?
6 ответов
Я отвечал на очень похожий вопрос:
https://stackoverflow.com/a/15982217/1467082
вам просто нужно повторить серию'.Points
сбор, а затем вы можете назначить точки' .Format.Fill.ForeColor.RGB
значение на основе любых критериев, которые вам нужны.
обновлено
код ниже будет окрашивать диаграмму на скриншоте. Это предполагает использование только трех цветов. Можно добавить дополнительные операторы case для других значений цвета и обновите назначение 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
не-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: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. Вот как это выглядит с моим примером:
как только это будет сделано, вы можете мгновенно изменить цвет или положение точки в 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
Если вы код свой оси х категорий текста, перечислить их в одном столбце, то в соседних столбцов списка участков пунктов для соответствующих переменных от соответствующих текстовый код категории и просто оставить пустые ячейки против не-текст код категории, вы можете точечную диаграмму и получить результат. Любые вопросы, дайте мне знать.