2013-03-07 2 views
1

Я новичок в D3, и я столкнулся с проблемой, которую я не могу решить.Маркировка анимированных графиков линий с использованием D3

Я построил анимированный линейный график, используя this tutorial, и теперь я пытаюсь добавить к нему. То, что я думал, было бы крутой идеей, было бы обозначить каждую строку в линейном графике, но пометить ее в конце строки.

Here's what I've come up with so far:

enter image description here

Как вы можете видеть его субоптимальный в лучшем случае. Я неправильно размещаю текст, но не очевидно, как правильно позиционировать его. Вот код, о котором идет речь.

name.transition() 
    .duration(duration) 
    .ease("linear") 
    .attr("transform", function(d) { 
     return "translate(" + (width - margin.left - margin.right) +", " + y(d[n-2]) + ")"; 
    }); 

Кажется, «линейный» ослабление выключен, и это также, кажется, использует другой масштаб в разы.

Есть ли эксперт D3 (или новичок), готовый научить меня правильному способу этого?

ответ

1

Там, кажется, две проблемы:

  1. .interpolate("basis") - вы с использованием линейной интерполяции для заголовка, но B-сплайн интерполяция пути. Комментируя эту строку, вы держите заголовок довольно жестким с вашей линией передачи данных (хотя он также разглаживает линию - возможно, это хорошо для большинства графиков данных).

  2. «Скачки» при изменении масштаба оси. Это связано с тем, что заголовок переходит к новой позиции на новом шкале, но его исходное положение по-прежнему задано относительно старого масштаба, поэтому оно может начинаться выше или ниже линии, которую он отслеживает. Я думаю, что вы можете это исправить, добавив прямую .attr установки, прежде чем начать переход, чтобы зафиксировать исходное положение заглавия:

    name 
        .attr("transform", function(d) { 
         return "translate(" + 
          (width - margin.left - margin.right) +", " + y(d[n-2]) + ")" 
        }) 
        .transition() 
        // etc 
    

См http://jsbin.com/uvayof/2

+0

Это действительно здорово. Слишком плохо, что он избавляется от B-Spline. Как вы думаете, есть ли способ сохранить это, а затем использовать другой тип интерполяции для названия? –

+0

Не уверен, но я предполагаю, что это будет сложно. Варианты облегчения показаны здесь: http://easings.net/ - вы можете сделать лучше с дефолтом по-кубику, но я сомневаюсь, что он будет точно отслеживать линию. – nrabinowitz

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