2015-02-24 6 views
0

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

Когда есть новое значение, оно нарисовано на графике, тогда путь (фактически контейнер) переводится влево при переходе.

Это, как я создать повернутые метки осей:

svg.select(".x.axis") 
     .call(this.xAxis) 
     .selectAll("text") 
      .style("text-anchor", "end") 
      .attr("dx", "-.8em") 
      .attr("dy", ".15em") 
      .attr("transform", this.axislabelrotation); 

this.axislabelrotation является:

function(d) { 
    return "rotate(-35)" 
} 

И это, как я переведет ось X:

svg = svg.transition().duration(750); 
    svg.select(".x.axis") // change the x axis 
     .call(this.xAxis) 
     .selectAll("text") 
      .style("text-anchor", "end") 
      .attr("dx", "-.8em") 
      .attr("dy", ".15em") 
      .attr("transform", this.axislabelrotation); 

Хотя сейчас У меня есть два вопроса:

  1. В начале перехода метки X-оси сбрасываются на несколько пикселей, во время перехода они возвращаются вверх.
  2. Вновь введенные метки («2015» в примере) не вращаются в начале перехода, но вращаются в нужное состояние во время перехода.

Пример: http://jsfiddle.net/esy6wk8n/2/

+1

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

+0

... или, возможно, скопировать + вставить и изменить исходный код 'd3.svg.axis() для создания собственной пользовательской оси. – meetamit

ответ

0

Я хотел бы предложить, что вы удалите переход на атрибут dy и transform.

Эта обновленная скрипка может помочь вам в этом: http://jsfiddle.net/esy6wk8n/4/

изменения все в вашей update функции.

var no_trans = svg; 
    svg = svg.transition().duration(750); 

    lp.transition() 
     .duration(750) 
     .attr("transform", "translate(" + this.x(data[0].jdate) + ")"); 

    lu.transition() 
     .duration(750) 
     .attr("transform", "translate(" + this.x(data[0].jdate) + ")"); 

    svg.select(".x.axis") // change the x axis 
     .call(this.xAxis) 
     .selectAll("text") 
      .style("text-anchor", "end") 
      .attr("dx", "-.8em"); 
      //.attr("dy", ".15em") 
      //.attr("transform", this.axislabelrotation); 

    no_trans.select(".x.axis") 
     .selectAll("text") 
      .attr("dy", ".15em") 
      .attr("transform", this.axislabelrotation); 

В принципе, я переместил обновление атрибутов dy и transform из перехода, поэтому, следовательно, эти значения будут установлены сразу и не могут быть изменены в рамках переходного периода, сохраняя dy и transform стабильной на протяжении всего переходного периода.

+0

ничего себе. Я не знал, что вы можете изменить ось за пределами перехода после того, как вы скажете d3, чтобы нарисовать ее внутри перехода. * И *, что d3 затем учитывает эти изменения для перехода ... – tkSimon

+0

Все это в основном заключается в установке атрибута 'dy' и' transform' немедленно, вместо того, чтобы позволить переходу интерполировать его со временем. Здесь ничего особенного не происходит. Было бы ничем не отличаться от добавления элементов, установки 'dy' и' transform', а затем перехода других атрибутов, порядок не очень важен, это был самый простой способ сделать это с минимальным воздействием кода. –

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