我正在使用的频谱包含 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/散点图。
- 第一个数据系列使用 A 列和 B 列作为其 XY 坐标,用线条格式化,但没有数据标记。
- 第二个数据系列使用 A 列和 C 列作为其 XY 坐标,使用数据标记格式化,但没有线条。绘制数据标记时,Excel 会忽略所有 #N/A 值。
- 将数据标签添加到第二个系列,格式为包含 X 和 Y 值。绘制数据标记时,Excel 还会忽略所有 #N/A 值。
- 我还添加了一个附加系列,其中一个点 X=0,Y=$C$1(所需峰高),没有线或点格式。我添加了一个正水平误差线,用红色虚线格式化以显示最小所需峰高。如果您更改所需峰高值,这也会自动调整。