2015-11-05 2 views
3

Я пытаюсь создать линейную диаграмму D3 с двумя вертикальными осями y, один слева и один с правой стороны. Область левой оси может иметь отрицательные значения, что означает, что нулевая точка будет сдвинута вверх. Я хочу выровнять нулевую точку правой оси с одной из левой оси. Подобно, как вы можете видеть здесь, но без оси х движущихся вверх тоже:Диаграмма D3: Как выровнять нулевые точки двух осей y

enter image description here

До сих пор я пытался искать HTML г элемент, который представляет клеща нулевой точки:

<g id="tmp" class="y axis" transform="translate(30,0)" fill="red"> 
    <g class="tick" style="opacity: 1;" transform="translate(0,330)"> 
    <g class="tick" style="opacity: 1;" transform="translate(0,257.5)"> 
    <g class="tick" style="opacity: 1;" transform="translate(0,185)"> 
     <line x2="-5" y2="0"> 
     <text dy=".32em" style="text-anchor: end;" x="-8" y="0">0</text> 
    </g> 

Что мне нужно, так это извлечь значение высоты 185 в атрибуте преобразования, чтобы я мог использовать его для диапазона на второй оси.

Это была моя основная идея, как это могло быть сделано. Кто-нибудь знает, как это сделать с помощью D3/Javascript? Или, может быть, даже имеет более элегантное решение?

+0

AFAIK это не может быть сделано легко (см. Https://stackoverflow.com/questions/20641547/using-d3-js-is-there-a-way-to-zero-align-two-y-axes -с-положительный и отрицательный-v). –

+0

Спасибо за вашу ссылку! Пользователь jglover опубликовал решение, которое сработало для меня! – flixe

ответ

0

В вашем случае расстояние от -4 (минимальное значение) до 0 в левой шкале должно соответствовать расстоянию от -40 (минимальное значение) до 0 в правой шкале и расстоянию от 0 до 10 (максимальное значение) на левая шкала должна совпадать с расстоянием от 0 до 120 (максимальное значение) в правой шкале.

Чтобы построить правую ось, вы можете использовать две оси (от -40 до 0, а другую - от 0 до 120). Вы можете получить базовую линию левой оси, выполнив: var base = leftAxis(0); Диапазон первой шкалы, которую вы будете использовать для построения первой оси, будет [leftAxis(minVal), base], диапазон второй шкалы будет [base, leftAxis(maxVal)].

Надеюсь, что это поможет! Удачи!

+0

Спасибо, но создание двух вместо одной оси приносит еще одну проблему: как я могу нарисовать линию, соответствующую их обоим? Единственный способ, с помощью которого я могу думать, - разбить массив данных i'm на положительные и отрицательные значения и создать также две строки вместо одного, но даже тогда может быть сложно убедиться, что обе линии соответствуют их конечным точкам. ... – flixe

+0

Точно, вам нужно будет разделить ось на две части. Диапазоны, которые я предоставил в ответе, будут соответствовать их конечным точкам. Единственное, что вам нужно позаботиться, это удалить ось, соответствующую нулю на одной из осей, так что только одна ось показывает нулевой тик. – sergeyz

Смежные вопросы