实现运动诱发失明(MIB)动画模型
这个炫酷的图表仍然来自excelhero.com。正如之前提到过的,通过学习研究复杂的图表制作,无论是否能够完全明白,都会很好地提高我们的Excel绘图能力。
下面是一组旋转的蓝色十字架和3个黄点。现在,注意中心(观看闪烁的红色/绿色斑点)。注意,黄色斑点偶尔消失:单独、成对或同时全部三个,是不是?
现实中,3个黄点不断出现,这被称为“运动诱发失明”或MIB。
图1
实际的MIB Excel模型比这个动画的GIF表示更平滑。
MIB模型
这里有三种用于这种视错觉的方法。
1.使用单个系列定义所有点(49个)并在每个点上放置一个十字。
图2
2.使用2系列来定义每个十字架,有49个十字架。
图3
3.使用包括十字架并旋转的位图作为背景。
第一种方法不适合视觉的需要,因为每个标记不会随着系列的旋转而旋转,而是相对于序数轴保持固定。
第二种方法为每个十字交叉准备大量坐标,即每个十字交叉的4个X和4个Y坐标,有49个交叉,总共98个系列和196个坐标。虽耗费时间,但至少十字架会旋转。这是示例模型选择的方法。
图4
第三种方法旋转固定位图虽然非常可行,但我们是要在Excel图表中来完成这所有的工作。最后的附件中有真实模型和所有相关的准备工作,你可以下载研究。下面介绍的所有准备工作都在附件工作表“2”上。
设置
首先,我在X和Y中设置一个数字-3到+3的表格,然后在每个表格中增加/减少一个小的数来表示十字的宽度。这里使用的是0.15。
下表是每个点的X和Y值。
图5
使用X和Y值的问题是围绕点旋转它们,使用极坐标会更容易,但Excel需要笛卡尔坐标绘图。于是,处理过程如下:
1.设置49个点的4组X、Y
2.将它们转换为极坐标
3.对每个端点设置命名公式
4.对修正的极坐标添加径向增量
5.使用命名公式转换极坐标为笛卡尔坐标
6.绘图
7.从第4步重复
极坐标
上述处理过程中第2步意味着将每组坐标转换为由半径r和角度Ø组成的极坐标。
图6
通过下式解决:
图7
对每个十字的每个端点,98对XY坐标进行处理。
现在,有了端点的极坐标,可以设置旋转方程。
这是将原始极坐标转换回X和Y值的公式,Excel需要绘制这些值。
图8
现在,可以添加一个旋转角度,这里使用t。这样,旋转后的新位置就是:
图9
为所有十字交叉的十字的每个点都这样处理:
图10
Excel图表之道——如何制作专业有效的商务图表(典藏版)
作者:刘万祥
矩阵算术
要在散点图上绘制线条,Excel需要在单元格区域或数组中的2个X值,以及同样的2个Y值。可以在一个命名公式中一起添加2个命名公式来创建数组,这样最终得到一个数组,代表49个十字交叉的98段中每一段的X和Y值。
X值 = {X1,X2}
Y值 = {Y1,Y2}
所使用的其中一个命名公式为:
图11
为了简化所有这些的构建,坐标、转换到极坐标和构造旋转变换公式都是在Excel中完成的(参见示例文件中的工作表“2”)。
下面是实现这些命名公式的VBA代码:
Sub Load_Named_Ranges()
Dim c As Range
For Each c In Selection
ActiveWorkbook.Names.Add Name:=c.Text,RefersTo:=c.Offset(, 1).Text
Next
End Sub
添加图表系列
一旦构造并装载了命名公式,就只需在Excel中添加空白散点图并设置系列名称、X值和Y值的表:
图12
使用VBA代码将这些系列添加到图表中。
Sub Add_Cht_Series()
Dim sNumb As Integer
Dim c As Range
Worksheets("1").ChartObjects("Chart 1").Activate
For Each c InWorksheets("1").Range("AQ3:AQ100")
sNumb = ActiveChart.SeriesCollection.Count+ 1
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(sNumb).Name =c.Text
ActiveChart.SeriesCollection(sNumb).XValues= c.Offset(, 1).Text
ActiveChart.SeriesCollection(sNumb).Values =c.Offset(, 2).Text
Next
End Sub
3个黄点
使用下列坐标在图表中手动添加3个黄点:
X系列:={1.5,0,-1.5}
Y系列:={1.5,-1.8,1.5}
将标记设置为黄色,大小为15,线型设置为无。
中心点
中心点是图表中手动添加的系列:
X值:=0
Y值:=0
将标记设置为红色,大小为12,线型设置为无。
动画
添加简单的命名公式“t”,更改t的值并更新图表来实现图表的动画。
Sub Rotate()
Dim t As Double
t = 361 '在361度开始
Do While [AA1] '单元格AA1是True时循环
t = t - 1 '旋转角度减小1度
If t = 0 Then t = 360 '如果旋转角为0则回到360
'添加命名公式=t * 2 * Pi / 360
't以弧度表示
ActiveWorkbook.Names.Add Name:="t",RefersToR1C1:=(t * 2 * Pi / 360)
'刷新屏幕
DoEvents
'如果t在指定范围内则设置中心标记颜色为红色或绿色
If (t >= 0 And t < 90) Or (t >=180 And t < 270) Then
ActiveSheet.ChartObjects("Chart1").Chart.SeriesCollection(99).Format.Fill.ForeColor.RGB = RGB(255, 0, 0)
Else
ActiveSheet.ChartObjects("Chart1").Chart.SeriesCollection(99).Format.Fill.ForeColor.RGB = RGB(0, 255, 0)
End If
'DoEvents
Loop
End Sub