Skip to content

Commit 0a54e05

Browse files
committed
checkpoint
1 parent b872b6b commit 0a54e05

File tree

4 files changed

+42
-11
lines changed

4 files changed

+42
-11
lines changed

tensorboard/webapp/metrics/views/card_renderer/scalar_card_component.ng.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@
112112
[tooltipTemplate]="tooltip"
113113
[useDarkMode]="useDarkMode"
114114
(onViewBoxOverridden)="isViewBoxOverridden = $event"
115+
(onViewBoxChanged)="onLineChartZoom.emit($event)"
115116
[customVisTemplate]="lineChartCustomVis"
116117
[customChartOverlayTemplate]="lineChartCustomXAxisVis"
117118
></line-chart>

tensorboard/webapp/metrics/views/card_renderer/scalar_card_component.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import {
3737
relativeTimeFormatter,
3838
siNumberFormatter,
3939
} from '../../../widgets/line_chart_v2/lib/formatter';
40+
import {Extent} from '../../../widgets/line_chart_v2/lib/public_types';
4041
import {LineChartComponent} from '../../../widgets/line_chart_v2/line_chart_component';
4142
import {
4243
RendererType,
@@ -106,6 +107,8 @@ export class ScalarCardComponent<Downloader> {
106107
@Output() onStepSelectorToggled =
107108
new EventEmitter<TimeSelectionToggleAffordance>();
108109

110+
@Output() onLineChartZoom = new EventEmitter<Extent>();
111+
109112
// Line chart may not exist when was never visible (*ngIf).
110113
@ViewChild(LineChartComponent)
111114
lineChart?: LineChartComponent;

tensorboard/webapp/metrics/views/card_renderer/scalar_card_container.ts

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,15 @@ import {
2323
Output,
2424
} from '@angular/core';
2525
import {Store} from '@ngrx/store';
26-
import {combineLatest, from, Observable, of, Subject} from 'rxjs';
26+
import {
27+
combineLatest,
28+
from,
29+
Observable,
30+
of,
31+
Subject,
32+
Subscriber,
33+
zip,
34+
} from 'rxjs';
2735
import {
2836
combineLatestWith,
2937
debounceTime,
@@ -57,6 +65,7 @@ import {
5765
TimeSelectionWithAffordance,
5866
} from '../../../widgets/card_fob/card_fob_types';
5967
import {classicSmoothing} from '../../../widgets/line_chart_v2/data_transformer';
68+
import {Extent} from '../../../widgets/line_chart_v2/lib/public_types';
6069
import {ScaleType} from '../../../widgets/line_chart_v2/types';
6170
import {
6271
linkedTimeToggled,
@@ -153,6 +162,7 @@ function areSeriesEqual(
153162
(onTimeSelectionChanged)="onTimeSelectionChanged($event)"
154163
(onLinkedTimeToggled)="onLinkedTimeToggled($event)"
155164
(onStepSelectorToggled)="onStepSelectorToggled($event)"
165+
(onLineChartZoom)="onLineChartZoom($event)"
156166
></scalar-card-component>
157167
`,
158168
styles: [
@@ -191,6 +201,11 @@ export class ScalarCardContainer implements CardRenderer, OnInit, OnDestroy {
191201
minMaxSteps$?: Observable<MinMaxStep>;
192202
columnHeaders$?: Observable<ColumnHeaders[]>;
193203

204+
private lineChartZoomObservers: Subscriber<Extent>[] = [];
205+
lineChartZoom$: Observable<Extent> = new Observable((observer) => {
206+
this.lineChartZoomObservers.push(observer);
207+
});
208+
194209
onVisibilityChange({visible}: {visible: boolean}) {
195210
this.isVisible = visible;
196211
}
@@ -338,16 +353,18 @@ export class ScalarCardContainer implements CardRenderer, OnInit, OnDestroy {
338353
shareReplay(1)
339354
);
340355

341-
this.minMaxSteps$ = partitionedSeries$.pipe(
342-
map((series) => {
343-
let minStep = Infinity;
344-
let maxStep = -Infinity;
345-
for (const {points} of series) {
346-
for (const point of points) {
347-
minStep = minStep > point.x ? point.x : minStep;
348-
maxStep = maxStep < point.x ? point.x : maxStep;
349-
}
350-
}
356+
this.minMaxSteps$ = zip(partitionedSeries$, this.lineChartZoom$).pipe(
357+
map(([series, lineChartViewBox]) => {
358+
const minMax = lineChartViewBox.x;
359+
const minInViewPort = Math.ceil(Math.min(...minMax));
360+
const maxInViewPort = Math.floor(Math.max(...minMax));
361+
const allPoints = series
362+
.map(({points}) => points.map(({x}) => x))
363+
.flat();
364+
const min = Math.min(...allPoints);
365+
const max = Math.max(...allPoints);
366+
const minStep = Math.max(min, minInViewPort);
367+
const maxStep = Math.min(max, maxInViewPort);
351368
return {minStep, maxStep};
352369
})
353370
);
@@ -608,4 +625,8 @@ export class ScalarCardContainer implements CardRenderer, OnInit, OnDestroy {
608625
onStepSelectorToggled(affordance: TimeSelectionToggleAffordance) {
609626
this.store.dispatch(stepSelectorToggled({affordance}));
610627
}
628+
629+
onLineChartZoom(extent: Extent) {
630+
this.lineChartZoomObservers.forEach((observer) => observer.next(extent));
631+
}
611632
}

tensorboard/webapp/widgets/line_chart_v2/line_chart_component.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ import {
1818
ChangeDetectorRef,
1919
Component,
2020
ElementRef,
21+
EventEmitter,
2122
Input,
2223
OnChanges,
2324
OnDestroy,
2425
OnInit,
26+
Output,
2527
SimpleChanges,
2628
TemplateRef,
2729
ViewChild,
@@ -137,6 +139,9 @@ export class LineChartComponent
137139
@Input()
138140
lineOnly?: boolean = false;
139141

142+
@Output()
143+
viewBoxChanged = new EventEmitter<Extent>();
144+
140145
private onViewBoxOverridden = new ReplaySubject<boolean>(1);
141146

142147
/**
@@ -482,6 +487,7 @@ export class LineChartComponent
482487
this.isViewBoxChanged = true;
483488
this.viewBox = dataExtent;
484489
this.updateLineChart();
490+
this.viewBoxChanged.emit(dataExtent);
485491
}
486492

487493
viewBoxReset() {

0 commit comments

Comments
 (0)