0

我想创建下面链接的图表。我有用二进制标志(0 = 红色,1 = 蓝色)编码的数据,该标志也是有序的。例如,我将用于假设创建下方左侧列的数据类似于以下链接中的表格

桌子

数据表

图表

图表

谁能建议我如何做到这一点?谢谢。

4

2 回答 2

1

假设您的数据表排列如下:

数据表

这应该容纳任意数量的等级和任意数量的列。运行宏,并选择包含所有二进制标志的单元格范围,例如:

选择二进制标志值

它将创建如下图表:

图表截图

Option Explicit
Sub BuildRankedBinaryChart()
    Dim ws As Worksheet
    Dim cht As Chart
    Dim ax As Axis
    Dim rngFlag As Range
    Dim xVal As Double
    Dim r As Long
    Dim c As Long
    Dim s As Long
    Dim p As Long
    Dim pt As Point

    Set ws = ActiveSheet

    On Error Resume Next
    Set rngFlag = Application.InputBox( _
                "Select the binary flags.", _
                "Binary Flag", Type:=8)
    If Err <> 0 Then
        On Error GoTo 0
        Exit Sub
    End If

    '## Determine what VALUES to use for each point:'
    xVal = 1 / rngFlag.Rows.Count
    ReDim xVals(1 To rngFlag.Columns.Count)
    For c = 1 To rngFlag.Columns.Count
        xVals(c) = xVal
    Next

    '## Add a new chart to the sheet.'
    Set cht = ws.ChartObjects.Add(50, 50, 300, 200).Chart
    '## Format the chart:'
    With cht
        .ChartType = xlColumnStacked100
        .HasLegend = False
        .Axes(xlPrimary).Delete
        Set ax = .Axes(xlSecondary)
        With ax
            .HasMajorGridlines = False
            .HasMinorGridlines = False
            .Delete
            .ReversePlotOrder = True
        End With
    End With

    '## Each ROW in the table is a new series.'
    For r = 1 To rngFlag.Rows.Count
        '## Add a new series to the chart'
        With cht.SeriesCollection.NewSeries
            '## Assign the values calculated above'
                .Values = xVals
            '## Apply labels'
                .ApplyDataLabels
            '## Finally, fake out the labels and apply the color to each point.'
            For p = 1 To .Points.Count
                With .Points(p)
                    If rngFlag.Rows(r).Cells(1, p).Value = 1 Then
                        .Format.Fill.ForeColor.RGB = vbRed
                        .DataLabel.Text = 1
                    Else:
                        .Format.Fill.ForeColor.RGB = vbBlue
                        .DataLabel.Text = 0
                    End If
                    '## Use a white font which is more legible on the dark fill colors '
                    .DataLabel.Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = vbWhite
                End With
            Next
        End With
    Next

End Sub

图表中的每个数据点都将具有相同的大小(我认为这就是您想要的屏幕截图)。这个大小是通过将 1 除以表中的行数来计算的,例如,对于 6 行,它将是0.166666667,因此堆叠的列全部相加为 100%。

值标签被覆盖,并分配为标志值 1 或 0。

颜色是红色或蓝色,基于 1 或 0 的值。我将字体颜色设置为白色,这样它在蓝色和红色填充时会更清晰。

于 2013-05-28T15:57:53.773 回答
0

下面的结果可以通过图表(无 VBA)使用堆叠条形图(并从默认值调整无数其他设置!)来实现:

SO16797200 第一个例子

编辑以回应要求更多细节的评论

一些(也许不是全部!)可能需要对默认设置进行调整:

边框
格式数据系列应设置为边框颜色实线(颜色可能默认为黑色,透明度为 0%)和边框样式为大约 3 pt(或等效,默认为其余Binary FlagSeries1

数据点的颜色
格式数据系列Series1应为填充、实心填充、颜色:红色和透明度 0%(Binary Flag可能默认为蓝色且不需要调整)。

Format Axis
For X Axis, Axis Options all set to Fixed, 值最小值:0,最大值:1,主要:1,次要:1 和主要刻度线类型:,次要刻度线类型:和轴标签:全部设置为无. 垂直轴交叉:设置为大约 0.75。

对于 Y 轴,线条颜色设置为无线条。

图例
删除。

系列选项
设置为系列重叠分离 100%,间隙宽度无间隙 (0%),绘图系列默认为主轴。

大小 将右侧图表边框向左拖动以适应。


选择

虽然使用条件格式可能更容易(假设排名排序顺序颠倒):

SO16797200第二个例子

于 2013-05-28T16:38:24.327 回答