如何根据列值在xy散点图中给点着色?

63

考虑以下工作表:

     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
我使用Excel中的散点图功能创建了以下图表: enter image description here 然而,图表中的每个点都有一个额外的属性:GROUP。有四个组: red,orange,black和green。我想相应地着色每个点,以便我可以看到模式(例如,组 green 几乎始终在图表的左侧)。因为我的列表有500行,所以我无法手动完成这项操作。如何自动完成这项操作?

1
你可以尝试适应这种技巧:http://peltiertech.com/WordPress/conditional-formatting-of-excel-charts/ - momobo
1
按照组列进行排序,然后制作4个图表(每个组一个)是否不可行? - chancea
@chancea 我需要所有的点都出现在同一个图中,就像上面所示的那样,而不是分别出现在4个不同的图中。如果你的解决方案需要4倍的工作量,但是所有的点都出现在同一个图中,那就太好了。这有助于回答你的问题吗? - Pr0no
1
是的,通过4个图来说,我指的是一个图中包含4个数据集。它们将重叠在一起。按组排序列可以让您手动选择数据集,但如果您将来添加数据到电子表格中,则无法帮助您。下面的答案解释了一种更自动化的方法,当我说“plots”时,我指的是“选择数据源”->“添加”。 - chancea
1
这是一个非常有限的解决方案和糟糕的设计,因为它在数据排序和图表可能位于不同工作表之间创建了一个看不见的紧密耦合。此外,如果对数据进行其他视图的排序,则无法保持绘图的完整性,甚至可能不知道这一点。 - guthrie
如果你的数据需要根据连续的序列数据进行颜色编码,那么这个链接可能会有所帮助:https://dev59.com/upTfa4cB1Zd3GeqPQ3Ta - Dan
7个回答

94

无需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,以便在添加更多数据时自动更新图表。


4
您真的不需要对X值做任何处理。所有四组颜色系列都可以共用B列的X值。使用在G列中使用的公式方法为红色生成Y值,但需要重复这个步骤来为其他三种颜色生成Y值。 - Jon Peltier
将单元格E2中的公式更改为=IF($D2=E$1,$C2,NA()),然后您只需将相同的公式复制/粘贴到所有组(列E、F和G)中即可。 - ChaimG

23

我回答了一个非常相似的问题:

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

谢谢!不过,您能否请解释一下如何根据“GROUP”列中的值动态更改颜色?我已经在您的帖子中添加了伪代码,但不知道如何将点“p”连接到正确的“GROUP”值... - Pr0no
3
无论如何,我没有看到对我的帖子进行任何修改,请不要修改他人答案的内容,除非是为了纠正明显的错误或提高格式/可读性。永远不要在他人的帖子/答案中添加内容。我将稍后修改我的答案,以更好地适应您的特定问题。 - David Zemens
在你看到之前,肯定有人不同意我所做的编辑。无论如何,我认为编辑按钮不仅可以添加内容,而且可以避免再次发表评论。现在我知道得更清楚了 :-) 感谢你的帮助,它非常好用! - Pr0no
我看到有三个人拒绝了它(因为它只是对现有答案的评论或回复,而不是出于自身价值的建设性编辑)。不过没关系。很高兴它对你有用! - David Zemens
运行得非常顺利! - Milind R

3
我看到有VBA解决方案和非VBA解决方案,两者都非常好。我想提出我的Javascript解决方案
有一个名为Funfun的Excel插件,它允许您在Excel中使用javascript、HTML和css。它有一个在线编辑器,带有嵌入式电子表格,您可以在其中构建图表。
我为您编写了此代码,使用了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  
    });
  }

创建散点图后,我可以通过将URL粘贴到Funfun Excel插件中来在Excel中上传它。以下是我的示例:

final

一旦完成,您可以通过更改电子表格中的值,在Excel中立即更改点的颜色或位置。
如果您想在图表中添加额外的点,您只需要修改短json文件中的“data”半径。
希望这个JavaScript解决方案能够帮助您!
披露:我是Funfun的开发人员。

3
如果您对x轴文本类别进行编码,将它们列在单独的一列中,然后在相邻的列中列出各自变量的绘制点,针对相关的文本类别代码,并只留下不相关的文本类别代码的空单元格,则可以绘制散点图并得到所显示的结果。如果您有任何问题,请让我知道。 enter image description here

1

试试这个:

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

1

最近我也遇到了类似的问题,我用下面的代码解决了它。希望能帮到你!

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

1
欢迎来到StackOverflow。请发布带有您的代码的评论,以便人们了解它是如何工作的。 - yakatz

0
我发现一个更简单的解决方案是按颜色对数据进行排序,然后将不同的数据范围选择为它们自己的系列,Excel会自动以不同的颜色对它们进行着色。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接