使用有序二进制数据创建条形图

时间:2013-05-28 14:35:26

标签: excel excel-vba charts vba

我想创建下面链接的图表。我的数据是用二进制标志(0 =红色,1 =蓝色)编码的,也是有序的。例如,我用来假设创建下面左栏的数据看起来就像下面链接中的表格

表格

Data table

图表

Chart

有谁能建议我怎么做到这一点?感谢。

2 个答案:

答案 0 :(得分:1)

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

Data table

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

Select the binary flag values

它会创建如下图表:

Chart screenshot

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.我将字体颜色设置为白色,以便对蓝色和蓝色更清晰。红色填充。

答案 1 :(得分:0)

下面的结果可以通过图表(没有VBA)来实现,也许可以直观地反击堆积条形图(并从默认值中调整其他设置!):

SO16797200 first example

编辑以回复评论请求进一步的详细信息

某些(可能不是全部!)默认设置可能需要的调整:

<强>边界
对于Binary Flag和{{1,格式数据系列应设置为边框颜色实线(颜色可以默认为黑色,透明度为0%)和边框样式为约3 pt(或等效,休息可能是默认值) }}

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

格式轴
对于X轴,轴选项全部设置为固定,值最小值:0,最大值:1,主要:1,次要:1和主要刻度标记类型:,次要刻度标记类型:和轴标签:全部设置为无。垂直轴交叉:设置为约0.75。

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

<强>图例
删除。

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

<强>尺寸 将右侧图表边框向左拖动以适合。


替代

虽然使用条件格式可能更容易(如果排序排序顺序相反):

SO16797200second example