Графики Победы с несколькими строками и подсказками
Я делаю график, который должен масштабировать и отображать подсказки для каждой точки данных. В документации Victory есть многострочный график с всплывающими подсказками, однако, если вы настраиваете набор данных, всплывающие подсказки перекрываются. Я обнаружил, что VictoryPortal - это механизм для преодоления этого, но, похоже, что даже в связанном примере он использует VictoryPortal. (Реквизит подсказки имеет renderInPortal: true,
)
Чтобы преодолеть это, я создал вторую группу VictoryGroup после Lines/Scatters, которая представляла собой просто Scatter всех наборов данных и объединила их. opacity: 0
так что выглядело, как будто вы наводили исходную точку рассеяния. Этот подход работает, но я чувствую, что должен быть лучший, более чистый способ, которого я здесь скучаю. Я не мог понять, как заставить фрагмент работать с Victory, вот код, о котором идет речь:
Метод визуализации линий / разбросов для отдельных наборов данных в группе:
renderLine = (m, i) => (
this.state.s[i]
? <VictoryGroup
key={i}
color={m.color}
data={m.data}
labels={(d) => `y: ${d.y}\nx: ${d.x}`}
labelComponent={
<VictoryTooltip
cornerRadius={0}
style={{ fontSize: 10 }}
/>}
>
<VictoryLine />
<VictoryScatter size={(d, a) => a ? 8 : 3} />
</VictoryGroup>
: null
)
И мой метод рендеринга:
render() {
const { renderLine } = this
return (
<div style={{ width: '50vw', margin: '0 auto' }}>
<VictoryChart
height={400}
width={400}
padding={30}
containerComponent={<VictoryZoomContainer />}>
<VictoryAxis
domain={{ x: [-180, 180] }}
standalone
label={'Angle (°)'}
style={axisStyle}
crossAxis={false}
orientation={'bottom'}
axisLabelComponent={
<VictoryLabel orientation={'top'} y={'97%'} verticalAnchor={'end'} />
}
gridComponent={
<Line
style={{
...axisStyle.grid,
transform: 'translate3d(0,100%,0)'
}}
/>
}
tickCount={12}
tickLabelComponent={<VictoryLabel dy={-5} />}
/>
<VictoryAxis
dependentAxis
orientation={'left'}
label={'Discriminiation (dB)'}
axisLabelComponent={
<VictoryLabel orientation={'left'} x={15} />
}
standalone
offsetX={30}
style={axisStyle}
/>
{masterData.map((d, i) => renderLine(d, i))}
<VictoryGroup
color={'rgba(0,0,0,0)'}
data={[...dataSet, ...dataSet2, ...dataSet3, ...dataSet4]}
labels={(d) => `y: ${d.y}\nx: ${d.x}`}
labelComponent={
<VictoryTooltip
cornerRadius={0}
style={{ fontSize: 10 }}
/>}
>
<VictoryScatter size={(d, a) => a ? 8 : 3} />
</VictoryGroup>
</VictoryChart>
</div>
);
}
Любой вклад или совет будет принята с благодарностью. Заранее спасибо!
1 ответ
Я начал с аналогичного решения, но в итоге получил некоторые успешные результаты с компонентом VoronoiContainer и с помощью всплывающей подсказки.
https://formidable.com/open-source/victory/docs/victory-voronoi-container/
Вы должны поместить контейнер Voronoi в качестве компонента контейнера в VictoryChart.
С этим методом VictoryScatter не требуется.