невозможно нарисовать горизонтальную опорную линию пузырьковой диаграммы nvd3

Я пытаюсь нарисовать горизонтальную линию (для справки) на пузырьковой диаграмме nvd3. Я попытался добавить строку в диаграмму svg

.append('line')
    .attr({
        x1: x(0),
        y1: 10,
        x2: x(3),
        y2: 10
});

Но я не успешен. Вот скрипка. Обратите внимание, что значения y1 и y2 одинаковы (т.е. 10), потому что я пытаюсь нарисовать горизонтальную линию ( y=10 ).


person Dinesh    schedule 30.06.2014    source источник


Ответы (1)


Есть две проблемы с вашим кодом.

  1. Вам нужно установить stroke вашей линии. Попробуй это:

    d3.select('#chart svg')
      .append('line')
      .attr({ x1: x(0), y1: 10, x2: x(3), y2: 10 })
      .style("stroke", "#000");
    

    Это сделает черную линию в верхнем левом углу вашего JSFiddle. Однако вы хотите провести на графике линию, где y=10. Это подводит нас ко второму пункту.

  2. Раньше вы пытались нарисовать линию в точке y1=y2=10, которая находится всего в 10 пикселях от верха вашего SVG. Кроме того, вы использовали собственную шкалу x. Вместо этого вам нужно использовать шкалы по осям x и y диаграммы, чтобы нарисовать линии в соответствующей точке диаграммы. NVD3 имеет шкалу каждой оси, доступную с помощью chart.axis.scale() (см. -plot-in-nvd3">это ТАК вопрос), поэтому вы можете сделать следующее:

    d3.select('#chart svg')
        .append('line')
        .attr({
            x1: 75 + chart.xAxis.scale()(0),
            y1: 30 + chart.yAxis.scale()(10),
            x2: 75 + chart.xAxis.scale()(3),
            y2: 30 + chart.yAxis.scale()(10)
        })
        .style("stroke", "#000");
    

    (Обратите внимание, что на диаграмме есть левое поле 75 пикселей и верхнее поле 30 пикселей, поэтому вам необходимо соответствующим образом настроить положение линии.) Если вы внесете эти изменения, вы получите изображение ниже. См. обновленный JSFiddle здесь. введите здесь описание изображения

Вы также можете убедиться, что ваша строка обновляется с изменением размера окна следующим образом:

nv.utils.windowResize(function(){
    chart.update();
    line.attr({
        x1: 75 + chart.xAxis.scale()(0),
        y1: 30 + chart.yAxis.scale()(10),
        x2: 75 + chart.xAxis.scale()(3),
        y2: 30 + chart.yAxis.scale()(10)
    })

});
person mdml    schedule 30.06.2014
comment
Спасибо. Но почему линия не на y=10? Я не могу понять, как работает эта шкала x(). - person Dinesh; 30.06.2014
comment
@Dinesh: я не уверен, что понимаю, линия находится на y=10. А что насчет x тебе не понятно? - person mdml; 30.06.2014
comment
Линия находится над осями. Я хочу нарисовать горизонтальную линию в точке y(value) = 10 по оси y. Даже в отношении x я думаю о значениях оси на графике. Поскольку мы видим горизонтальные линии на сетке в точке y=2,4,8,16 and 32, я хочу рисовать в точке y=10. - person Dinesh; 30.06.2014
comment
@Dinesh: хорошо, я думаю, теперь я понимаю, см. мой обновленный ответ. - person mdml; 01.07.2014
comment
Спасибо. Но я пробовал то же самое для оси x - мне нужна линия сетки y = 10. но линия начинается перед осью y - person Dinesh; 01.07.2014
comment
@Dinesh: вы можете получить доступ к шкале оси X chart так же, как к шкале оси Y. Смотрите мой обновленный ответ. - person mdml; 01.07.2014
comment
Аналогичное смещение необходимо для значений по оси Y. Кроме того, кажется, есть проблема с изменением размера окна браузера. Строка должна изменить свой размер в зависимости от размера браузера/графика. - person Dinesh; 01.07.2014
comment
Вам не нужны смещения полей, если вы выберете более глубокий элемент, содержащий только область диаграммы. Например, я сделал .select('svg').select('.nv-stackedarea'). - person Joseph Sheedy; 02.04.2015