feat(chart): add series styling and visibility controls

This commit is contained in:
李启源
2026-07-20 17:57:52 +08:00
parent c9e4dae25f
commit efb685646a
31 changed files with 2356 additions and 209 deletions

View File

@@ -1,7 +1,13 @@
import { shallowRef, watch } from 'vue'
import { normalizeWaveformSeries } from '../../core'
import type { WaveformData, WaveformPoint } from '../../types'
import { normalizeWaveformSeries, resolveWaveformPointErrors } from '../../core'
import type {
ResolvedWaveformErrorBarOptions,
WaveformData,
WaveformLineType,
WaveformPoint,
WaveformPointType,
} from '../../types'
import { paddedDomain } from '../../utils'
export interface PreparedWaveformSeries {
@@ -10,18 +16,30 @@ export interface PreparedWaveformSeries {
name: string
unit?: string
color?: string
lineType: WaveformLineType
pointType: WaveformPointType
errorBar: ResolvedWaveformErrorBarOptions
points: WaveformPoint[]
xDomain: [number, number]
yDomain: [number, number]
}
function pointDomain(points: WaveformPoint[], key: 'x' | 'y'): [number, number] {
function pointDomain(
points: WaveformPoint[],
key: 'x' | 'y',
includeErrors = false,
): [number, number] {
let minimum = Number.POSITIVE_INFINITY
let maximum = Number.NEGATIVE_INFINITY
points.forEach((point) => {
const value = point[key]
if (value < minimum) minimum = value
if (value > maximum) maximum = value
if (key === 'y' && includeErrors) {
const errors = resolveWaveformPointErrors(point)
minimum = Math.min(minimum, point.y - errors.lower)
maximum = Math.max(maximum, point.y + errors.upper)
}
})
return paddedDomain(Number.isFinite(minimum) ? [minimum, maximum] : [])
}
@@ -30,7 +48,7 @@ export function prepareWaveformSeries(data: WaveformData): PreparedWaveformSerie
return normalizeWaveformSeries(data).map((series) => ({
...series,
xDomain: pointDomain(series.points, 'x'),
yDomain: pointDomain(series.points, 'y'),
yDomain: pointDomain(series.points, 'y', series.errorBar.visible),
}))
}