我有一张包含 1000 行的 Excel 工作表,每行包含 100 列,列中的数字按从小到大从左到右的顺序排列(这些都是发生某事的日期或年份)。我想为这些日期创建一个序数索引,按 1-100 绘制每列。
下图显示了我感兴趣的图表示例。在这里,我只绘制了 1000 行中的 2 行,但这实际上是我想对整个数据集执行的操作。散点图示例
这里还有一个 Excel 电子表格的屏幕截图链接。因此,本质上,我正在寻找一种更快的方法来绘制 1-1000 行与 1001 行的对应关系。电子表格示例
有没有比创建 1000 个系列并选择 1000 次数据更快的方法在 Excel 中执行此操作?或者是否有其他程序可以执行此操作?我觉得 r 很有用,但我对那个程序没有任何经验。
答案1
是的,有更快的方法。您可以使用宏以编程方式创建绘图。
如果您了解 VB,请跳至步骤 3。
- 打开 Visual Basic 窗口 - 通过“开发人员”选项卡或 Alt-F11。
- 左上角是工作簿工作表和模块的列表。找到工作簿的名称,右键单击其名称,然后选择“插入 > 模块”。在文件树中现在应该有一个名为 Modules 的文件夹,其中有一个名为“Module1”的元素。双击它。
您现在位于 Excel VB 模块中。添加以下代码:
Sub chart() ActiveSheet.Shapes.AddChart.Select ActiveChart.ChartType = xlXYScatter ActiveChart.Legend.Delete i = 1 numSeries = 1000 Do While i < numSeries + 1 ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(i).XValues = "=Sheet1!$A$" & i & ":$CV$" & i ActiveChart.SeriesCollection(i).Values = "=Sheet1!$A$" & numSeries + 1 & ":$CV$" & numSeries + 1 i = i + 1 Loop End Sub
运行代码,可以使用 Visual Basic 窗口中的运行按钮或菜单,也可以通过 Excel 中的“开发人员”选项卡。
- 您可以在代码中看到列名 $A 和 $CV。如果结果由于某种原因与您的数据不匹配,请更改这些。如果您以后想要不同的行数,可以更改变量 numSeries。此代码假设您没有标题行,并且 X 轴数据位于最后一行,这是一种不常见的存储图表数据的方式,但与您的示例相匹配。
编辑:X 和 Y 切换:
Sub chart()
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlXYScatter
ActiveChart.Legend.Delete
i = 1
numSeries = 1000
Do While i < numSeries + 1
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(i).Values = "=Sheet1!$A$" & i & ":$CV$" & i
ActiveChart.SeriesCollection(i).XValues = "=Sheet1!$A$" & numSeries + 1 & ":$CV$" & numSeries + 1
i = i + 1
Loop
End Sub
现在尝试通过让每个系列显示 4 个数据集来获取 255 个限制以下的 1000 个项目:
Sub chart()
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlXYScatter
ActiveChart.Legend.Delete
i = 1
numSeries = 1000
s0 = "Sheet1!$A$" & numSeries + 1 & ":$CV$" & numSeries + 1
Do While i < (numSeries / 4 + 1)
s1 = "=Sheet1!$A$" & i & ":$CV$" & i
s2 = ", Sheet1!$A$" & i + numSeries / 4 & ":$CV$" & i + numSeries / 4
s3 = ", Sheet1!$A$" & i + 2 * numSeries / 4 & ":$CV$" & i + 2 * numSeries / 4
s4 = ", Sheet1!$A$" & i + 3 * numSeries / 4 & ":$CV$" & i + 3 * numSeries / 4
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(i).Values = s1 & s2 & s3 & s4
ActiveChart.SeriesCollection(i).XValues = "=" & s0 & ", " & s0 & ", " & s0 & ", " & s0
i = i + 1
Loop
End Sub