D3에서 타이머로 전환을 사용하는 방법은 무엇입니까?

미샤 모로 쉬코

실시간 차트에 들어가는 항목을 (전환과 함께) 애니메이션화하려고합니다.

보시다시피 '원 추가'버튼을 클릭하면 원이 차트 하단에 유지되고 위쪽으로 움직이지 않습니다.

흥미롭게도 .ease(d3.easeLinear)전환에 추가 하면 문제가 해결됩니다.

왜?

d3에서 타이머와 함께 전환을 사용하는 것이 개념적으로 잘못 되었습니까?

const width = 300;
const height = 100;
const margin = { top: 0, right: 30, bottom: 30, left: 50 };

const main = d3.select('.chart')
  .append('svg')
    .attr('width', width + margin.left + margin.right)
    .attr('height', height + margin.top + margin.bottom)
  .append('g')
    .attr('transform', `translate(${margin.left}, ${margin.top})`);

const now = Date.now();
const xScale = d3.scaleTime().domain([now - 10000, now]).range([0, width]);
const xAxis = d3.axisBottom(xScale).ticks(5);

const xAxisG = main.append('g')
  .attr('transform', `translate(0, ${height})`)
  .call(xAxis);

let data = [];

function drawCircles() {
  const t = d3.transition().duration(1000); //.ease(d3.easeLinear);
  const update = main.selectAll('circle').data(data);
  
  update.enter()
      .append('circle')
      .attr('r', d => d.value)
    .merge(update)
      .attr('cx', d => xScale(d.timestamp))
      .attr('cy', height)
      .transition(t)
      .attr('cy', height / 2);
}

d3.timer(() => {
  const now = Date.now();

  xScale.domain([now - 10000, now]);
  xAxisG.call(xAxis);
  
  drawCircles();
});

d3.select('.add-circle').on('click', () => {
  data.push({
    timestamp: Date.now() - 3000,
    value: 10
  });
});
svg {
  margin: 30px;
}
.add-circle {
  margin-left: 200px;
}
<script src="https://unpkg.com/[email protected]/build/d3.js"></script>
<button class="add-circle">Add circle</button>
<div class="chart"></div>

Gerardo Furtado

여기서 문제는 완화 의 부족이 아닙니다 . 문제는 대부분의 아마의 혼합이다 d3.timerselection.transition.

단계별로 살펴 보겠습니다. 당신은 이렇게 말했습니다 :

const t = d3.transition().duration(1000);

작동하지 않는 동안 :

const t = d3.transition().duration(1000).ease(d3.easeLinear);

공장. 글쎄, 그것은 사실이 아닙니다. 작동하지 않습니다. 사용하는 사람은 easeLinear이것이 선형 전환이 아니라는 것을 쉽게 알 수 있습니다! 여기서 재미있는 일이 일어나고 있습니다 ...

이제 여유를 변경해 보겠습니다. 기본 이징 (즉, 설정하지 않은 경우)은 easeCubic입니다. 따라서 이렇게하면 :

const t = d3.transition().duration(1000).ease(d3.easeCubic);

.NET Framework없이 첫 번째 코드와 동일한 효과를 갖습니다 ease. 따라서 ease전환을 일으킨 것은 우리가 설정 한 사실이 아닙니다 .

나는 당신의 코드로 모든 이징을 테스트했고 그들 중 일부는 easeLinear또는 같은 "작동"했습니다 easeCircle. 일을 여기 전환이 때문에 따옴표 사이에 되지 정상적인 하나, 예상 하나. 그들 중 일부 easeCubic는 전혀 효과가 없었습니다.

d3.timer전환과 혼합 할 수 없기 때문 입니다. 나는 소스 코드를 볼 기회가 없었지만 대부분은 아마도 같은 방법을 사용하고 requestAnimationFrame()충돌합니다.

해결 방법 : d3.timer.

제안 된 솔루션을 구현하는 데는 여러 가지 방법이 있지만 (다른 코더는 다른 대안을 만들 것입니다) 이것은 내 것입니다. 먼저 전환 기능을 정의합니다.

function transitioning(elem) {
    const t = d3.transition().duration(1000).ease(d3.easeCubic);
    d3.select(elem)
        .transition(t)
        .attr('cy', height / 2);
}

그런 다음 함수 내부 에서 각 원을 drawCircles호출 transitioning합니다. 그러나 플래그를 설정해야하므로 transitioning동일한 요소에 대해 함수를 반복해서 호출하지 않습니다 .

function drawCircles() {

    const update = main.selectAll('circle').data(data);

    update.enter()
        .append('circle')
        .attr('r', d => d.value)
        .attr('cy', height)
        .attr("flag", 0)
        .merge(update)
        .attr('cx', d => xScale(d.timestamp))
        .each(function() {
            if (!(+d3.select(this).attr("flag"))) {
                transitioning(this)
            }
            d3.select(this).attr("flag", 1);
        });
}

그리고 이것은 업데이트 된 CodePen입니다 : http://codepen.io/anon/pen/ZLyXma?editors=0010

위의 CodePen에서는 easeCubic. 그러나이 다른 Pen에서는 여유를 설정하지 않고 작동 함을 알 수 있습니다. http://codepen.io/anon/pen/apwLxR?editors=0010

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

d3에서이 전환 효과를 얻는 방법은 무엇입니까?

분류에서Dev

d3에서 값을 업데이트 할 때 원형 차트에서 부드럽게 전환하는 방법은 무엇입니까?

분류에서Dev

사용자 입력 시간을 분에서 1 시간으로 전환하는 방법은 무엇입니까?

분류에서Dev

타이머를 사용하여 이전보기로 리디렉션하는 방법은 무엇입니까?

분류에서Dev

타사 라이브러리에서 Ember 경로를 전환 / 전환하는 방법은 무엇입니까?

분류에서Dev

타이머를 사용하여 PictureBox 이미지에 페이드 전환 효과를 적용하는 방법은 무엇입니까?

분류에서Dev

d3 버블 다이어그램에서 원을 조작하는 방법은 무엇입니까?

분류에서Dev

D3 차트에서 xaxis 레이블을 변경하는 방법은 무엇입니까?

분류에서Dev

이 공장에서 프로토 타입과 정적 방법을 사용하는 목적은 무엇입니까?

분류에서Dev

목록을 사전 객체로 변환하고 함수에서 반환하는 방법은 무엇입니까?

분류에서Dev

목록을 사전 객체로 변환하고 함수에서 반환하는 방법은 무엇입니까?

분류에서Dev

d3 전환을 연결하는 방법은 무엇입니까?

분류에서Dev

열 이름이 사용될 때 dplyr에서 funs에서 list로 전환하는 방법은 무엇입니까?

분류에서Dev

d3에서 객체로 json 파일을 여는 방법은 무엇입니까?

분류에서Dev

런타임에 창에서 사용자 컨트롤로 값을 전달하는 방법은 무엇입니까?

분류에서Dev

PySpark에서 사전을 데이터 프레임으로 변환하는 방법은 무엇입니까?

분류에서Dev

스택 데이터 프레임을 Pandas에서 사전으로 변환하는 방법은 무엇입니까?

분류에서Dev

파이썬에서 사전을 numpy 배열로 변환하는 방법은 무엇입니까?

분류에서Dev

파이썬에서 2- 튜플 목록을 사전 키로 변환하는 방법은 무엇입니까?

분류에서Dev

d3에서 NaN 값을 확인하는 방법은 무엇입니까?

분류에서Dev

NVD3에서 전 세계적으로 전환 기간을 변경하는 방법은 무엇입니까?

분류에서Dev

ReactJS 반응에서 인라인 스타일링에 전환을 적용하는 방법은 무엇입니까?

분류에서Dev

값을 float로 변환하고 Python에서 사전에 할당하는 방법은 무엇입니까?

분류에서Dev

wpf c #에서 변환기를 사용하여 스타일을 적용하는 방법은 무엇입니까?

분류에서Dev

Microsoft Access에서 로그인 후 환영 "사용자 이름"을 입력하는 방법은 무엇입니까?

분류에서Dev

Flutter에서 TextField 위젯의 입력을 사용하여 타이머의 지속 시간을 설정하는 방법은 무엇입니까?

분류에서Dev

사전을 사용하지 않고 파이썬에서 문자열을 변수로 변환하는 방법은 무엇입니까?

분류에서Dev

KVM을 로컬 머신에서 Docker 컨테이너로 전달하는 방법은 무엇입니까?

분류에서Dev

Python을 사용하여 Ubuntu에서 HTML 페이지를 PDF로 변환하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    d3에서이 전환 효과를 얻는 방법은 무엇입니까?

  2. 2

    d3에서 값을 업데이트 할 때 원형 차트에서 부드럽게 전환하는 방법은 무엇입니까?

  3. 3

    사용자 입력 시간을 분에서 1 시간으로 전환하는 방법은 무엇입니까?

  4. 4

    타이머를 사용하여 이전보기로 리디렉션하는 방법은 무엇입니까?

  5. 5

    타사 라이브러리에서 Ember 경로를 전환 / 전환하는 방법은 무엇입니까?

  6. 6

    타이머를 사용하여 PictureBox 이미지에 페이드 전환 효과를 적용하는 방법은 무엇입니까?

  7. 7

    d3 버블 다이어그램에서 원을 조작하는 방법은 무엇입니까?

  8. 8

    D3 차트에서 xaxis 레이블을 변경하는 방법은 무엇입니까?

  9. 9

    이 공장에서 프로토 타입과 정적 방법을 사용하는 목적은 무엇입니까?

  10. 10

    목록을 사전 객체로 변환하고 함수에서 반환하는 방법은 무엇입니까?

  11. 11

    목록을 사전 객체로 변환하고 함수에서 반환하는 방법은 무엇입니까?

  12. 12

    d3 전환을 연결하는 방법은 무엇입니까?

  13. 13

    열 이름이 사용될 때 dplyr에서 funs에서 list로 전환하는 방법은 무엇입니까?

  14. 14

    d3에서 객체로 json 파일을 여는 방법은 무엇입니까?

  15. 15

    런타임에 창에서 사용자 컨트롤로 값을 전달하는 방법은 무엇입니까?

  16. 16

    PySpark에서 사전을 데이터 프레임으로 변환하는 방법은 무엇입니까?

  17. 17

    스택 데이터 프레임을 Pandas에서 사전으로 변환하는 방법은 무엇입니까?

  18. 18

    파이썬에서 사전을 numpy 배열로 변환하는 방법은 무엇입니까?

  19. 19

    파이썬에서 2- 튜플 목록을 사전 키로 변환하는 방법은 무엇입니까?

  20. 20

    d3에서 NaN 값을 확인하는 방법은 무엇입니까?

  21. 21

    NVD3에서 전 세계적으로 전환 기간을 변경하는 방법은 무엇입니까?

  22. 22

    ReactJS 반응에서 인라인 스타일링에 전환을 적용하는 방법은 무엇입니까?

  23. 23

    값을 float로 변환하고 Python에서 사전에 할당하는 방법은 무엇입니까?

  24. 24

    wpf c #에서 변환기를 사용하여 스타일을 적용하는 방법은 무엇입니까?

  25. 25

    Microsoft Access에서 로그인 후 환영 "사용자 이름"을 입력하는 방법은 무엇입니까?

  26. 26

    Flutter에서 TextField 위젯의 입력을 사용하여 타이머의 지속 시간을 설정하는 방법은 무엇입니까?

  27. 27

    사전을 사용하지 않고 파이썬에서 문자열을 변수로 변환하는 방법은 무엇입니까?

  28. 28

    KVM을 로컬 머신에서 Docker 컨테이너로 전달하는 방법은 무엇입니까?

  29. 29

    Python을 사용하여 Ubuntu에서 HTML 페이지를 PDF로 변환하는 방법은 무엇입니까?

뜨겁다태그

보관