Excel成比例作图/画图的办法

数据为椭圆分布的点,默认情况下Excel将会把它画成近圆形,使得X轴和Y轴的长度基本接近。

Excel画图的默认处理不一定适合所有情况,例如想用Excel输出的图来作为加工参考的时候——一个长宽比例不一致的图形将让人觉得非常别扭。所以,在某些情况下,需要使Excel作的X-Y散点图形的X坐标和Y坐标成比例。

经查,Excel并没有内置这样的功能。但我们可以通过编写宏来实现。

Excel做出的图有好几个层次:最外、包含图例和数据标注的、最大的区域叫做图表区;真正由坐标轴和图形组成的核心区叫做绘图区。

我们的目标就是要是的绘图区的长和宽成比例。下面这段代码可以在Excel 2007下完成这项工作:

Sub AutoZoom()

Worksheets(1).ChartObjects(1).Activate

With ActiveChart
    AxisHeight = .Axes(xlValue).MaximumScale - .Axes(xlValue).MinimumScale
    AxisWidth = .Axes(xlCategory).MaximumScale - .Axes(xlCategory).MinimumScale
End With

With ActiveChart.PlotArea
    If AxisHeight / AxisWidth > .InsideHeight / .InsideWidth Then
        .InsideWidth = .InsideHeight * AxisWidth / AxisHeight
    Else
        .InsideHeight = .InsideWidth * AxisHeight / AxisWidth
    End If
End With

End Sub

但在Excel 2003及以下版本里,PlotArea的InsideHeight和InsideWidth属性为只读甚至隐藏,总之就是根本不能操作。所以若要想在Excel 2003及以下的版本里对图表进行成比例控制,只有PlotArea.Height和PlotArea.Width属性可以用。

与Inside****不同,Height和Width指的是包含了一部分空白的高度和宽度。好在****和Inside****两者之间的差距是固定的!在Excel 2003里,Width = InsideWidth + 30, Height = InsideHeight + 20。这样,我们可以将上述代码稍作改动来实现同样的功能。真没想到,Office 2003和Office 2007这么小的差异让人实实在在的碰上了!

Sub AutoZoom1()

Worksheets(1).ChartObjects(1).Activate

With ActiveChart
    AxisHeight = .Axes(xlValue).MaximumScale - .Axes(xlValue).MinimumScale
    AxisWidth = .Axes(xlCategory).MaximumScale - .Axes(xlCategory).MinimumScale
End With

With ActiveChart.PlotArea
    If AxisHeight / AxisWidth > (.Height - 20) / (.Width - 30) Then
        .Width = (.Height - 20) * AxisWidth / AxisHeight + 30
    Else
        .Height = (.Width - 30) * AxisHeight / AxisWidth + 20
    End If
End With

End Sub

注意,这段代码不停的运行的话,绘图区会逐渐地缩小。这是因为运算得到的新的宽度和高度总是一个非整数,而宽度和高度实际上只可能为整数个像素,所以每次运行都会有一个像素因为取整运算而被损失掉,需要注意。