找到多个局部最大值并将数据标签放在相应的图表上

找到多个局部最大值并将数据标签放在相应的图表上

我正在使用的频谱包含 10,000 个数据点

在此处输入图片描述

我是一名化学专业的学生,​​经常遇到需要找到多个峰高的情况(如附图所示)。似乎有一种方法可以找到给定 x 处每个峰的 y 值,并将这些值打印为图表和各个单元格上的数据标签,但我不知道该怎么做。我认为使用:

=IF(AND(C4>C3,C4>C5),"Local maxima","")

随着:

Sub CustomLabels()

   Dim i, myCount, pt
   ActiveSheet.ChartObjects("myChart").Activate
   myCount = ActiveChart.SeriesCollection(1).Points.Count

   For i = 1 To myCount
       ActiveChart.SeriesCollection(1).Points(i).ApplyDataLabels
       ActiveChart.SeriesCollection(1).Points(i).DataLabel.Text = Range("D" & i + 1).Value
   Next i

End Sub

将产生如下结果:

在此处输入图片描述

我想要做的事情:

  • 让那些标有“最大值”的标签表示实际值,最好是 x 和 y 值,但仅 y 也可以。

  • 让最大值出现在新列中真的很棒。澄清一下,我有 10000 个点,最终应该有 40 个峰值。我想得到一个假设的 D 列,用这 40 个最大值填充。

  • 最后,由于有 10000 个值,我需要找到一种方法来过滤掉低于我想要的峰值高度的值(在第一张图片中)。

我怎样才能实现上述目标?

答案1

要使标签显示实际值,只需更改公式以显示值而不是文本“最大”。

你的公式目前似乎是

=if(and(c4>0,C5<0),"max","")

将其更改为

=if(and(c4>0,C5<0),A4&","&B4,"")

您的问题中的其他两点不清楚。请编辑您的问题以进行更详细的解释。

答案2

您还可以不使用 VBA 并且仅使用 3 列来解决问题,如下所示:

假设您原来的 A 列和 B 列,请在 C 列中使用此公式

=IFERROR(IF(AND(SLOPE(B1:B2,A1:A2)>0,B2>$C$1),B2,NA()),NA())其中 $C$1 = 您想要的峰值高度。

IFERROR 包装器允许您填充整个列,Excel 会将前几行(示例中为空白)中的任何错误转换为 #N/A,这些错误将在图表中被忽略。或者,您可以关闭包装器,并从几行下方开始您的列 - 就像您原来的示例一样。

然后,创建一个包含两个数据系列的 XY/散点图。

  1. 第一个数据系列使用 A 列和 B 列作为其 XY 坐标,用线条格式化,但没有数据标记。
  2. 第二个数据系列使用 A 列和 C 列作为其 XY 坐标,使用数据标记格式化,但没有线条。绘制数据标记时,Excel 会忽略所有 #N/A 值。
  3. 将数据标签添加到第二个系列,格式为包含 X 和 Y 值。绘制数据标记时,Excel 还会忽略所有 #N/A 值。

突出显示局部最大值

  1. 我还添加了一个附加系列,其中一个点 X=0,Y=$C$1(所需峰高),没有线或点格式。我添加了一个正水平误差线,用红色虚线格式化以显示最小所需峰高。如果您更改所需峰高值,这也会自动调整。

相关内容