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

Pr0*_*0no 48 excel charts vba excel-vba excel-formula

请考虑以下工作表:

     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
Run Code Online (Sandbox Code Playgroud)

我在Excel中使用了scatterplot函数来创建以下图表:

在此输入图像描述

但是,图表中的每个点都有一个附加属性:GROUP.有四组:red,orange,blackgreen.我想相应地为每个点着色,这样我就可以看到一个模式(例如,组green几乎总是位于图表的左侧).因为我的列表是500行长,我不能手动执行此操作.我该如何自动执行此操作?

cha*_*cea 79

非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())
Run Code Online (Sandbox Code Playgroud)

之后看起来应该是这样的:

     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
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用不同的数据集生成图形.这是一张显示此示例数据的图片:

在此输入图像描述

您可以更改系列(X;Y)B:B ; E:E,B:B ; F:F,B:B ; G:G 分别,使它使图形会自动更新,当您添加更多的数据.

  • 没有宏的解决方案的+1 (23认同)
  • 你真的不需要对X值做任何事情.所有四种颜色系列都可以共享X列的B值.使用上面G列中使用的公式方法生成红色的Y值,但重复其他三种颜色. (2认同)

Dav*_*ens 18

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

/sf/answers/1118755221/

您只需要遍历系列的.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
Run Code Online (Sandbox Code Playgroud)

  • 我没有看到对*my*post的任何修改,在任何情况下,除非纠正明显的错误或格式化/可读性,否则请不要修改某人的答案内容.不要****将内容添加到别人的帖子/答案中.我会立即修改我的答案,为您的具体问题量身定制. (3认同)