서클의 마우스 오버에 대한 데이터 표시


162

산포로 플로팅하는 데이터 세트가 있습니다. 원 중 하나 위로 마우스를 가져 가면 데이터 (예 : x, y 값 등)가 팝업되도록하고 싶습니다. 다음은 내가 사용해 본 것입니다.

vis.selectAll("circle")
   .data(datafiltered).enter().append("svg:circle")
   .attr("cx", function(d) { return x(d.x);})
   .attr("cy", function(d) {return y(d.y)})
   .attr("fill", "red").attr("r", 15)
   .on("mouseover", function() {
        d3.select(this).enter().append("text")
            .text(function(d) {return d.x;})
            .attr("x", function(d) {return x(d.x);})
            .attr("y", function (d) {return y(d.y);}); });

어떤 데이터를 입력해야하는지 좀 더 정보가 필요하다고 생각합니까?


1
나는 또한 시도했다 : vis.selectAll ( "circle"). each (function (d) {vis.append ( "svg : text"). attr ( "x", dx) .attr ( "y", dy) .text (함수 (d) {return dx;});}); 아무 소용이 없습니다.
ScottieB

답변:


181

나는 당신이 원하는 것이 툴팁이라고 가정합니다. 가장 쉬운 방법은 svg:title각 원에 요소 를 추가하는 것입니다. 브라우저가 툴팁을 표시하고 마우스 핸들러가 필요하지 않기 때문입니다. 코드는 다음과 같습니다

vis.selectAll("circle")
   .data(datafiltered).enter().append("svg:circle")
   ...
   .append("svg:title")
   .text(function(d) { return d.x; });

더 멋진 툴팁을 원한다면 예를 들어 기운을 줄 수 있습니다. 예를 보려면 여기 를 참조 하십시오 .


3
나는 기운이 좋아. 내 유일한 문제는 이제 데모에서와 같이 가장자리가 아닌 원의 왼쪽 위 모서리를 가리키는 것입니다. 분명한 이유를 찾지 못했습니다. jsfiddle.net/scottieb/JwaaV (맨 아래 부분의 검사)
ScottieB

그 jsfiddle에는 툴팁이없는 것 같습니까?
Lars Kotthoff

svg:g실제 원으로 오버레이 하는 툴팁을 추가해 볼 수 있지만 너비와 높이는 0입니다. 현재는 경계 상자를 잡고 툴팁을 가장자리에 놓습니다. tipsy의 옵션으로 놀아도 도움이 될 수 있습니다.
Lars Kotthoff

1
더 이상 작동하지 않는 것 같습니다. 또한 svg : title을 사용하여 실패한 예를 찾았습니다. bl.ocks.org/ilyabo/1339996
nos

1
@nos는 나를 위해 일합니다.
Lars Kotthoff

145

툴팁을 만드는 가장 좋은 방법은 다음과 같습니다. 간단한 D3 툴팁 예제

div를 추가해야합니다

var tooltip = d3.select("body")
    .append("div")
    .style("position", "absolute")
    .style("z-index", "10")
    .style("visibility", "hidden")
    .text("a simple tooltip");

그런 다음 사용하여 전환 할 수 있습니다

.on("mouseover", function(){return tooltip.style("visibility", "visible");})
.on("mousemove", function(){return tooltip.style("top",
    (d3.event.pageY-10)+"px").style("left",(d3.event.pageX+10)+"px");})
.on("mouseout", function(){return tooltip.style("visibility", "hidden");});

d3.event.pageX/ d3.event.pageY는 현재 마우스 좌표입니다.

당신이 사용할 수있는 텍스트를 변경하려는 경우 tooltip.text("my tooltip text");

작업 예


4
이 툴팁에 데이터를 바인딩 할 수 있습니까?
Jorge Leitao

2
Afaik은 모든 DOM 요소에 데이터를 바인딩 할 수 있습니다.
Pwdr

데이터를 이것에 바인딩하려면 괄호 안에 d를 다음과 같이 추가하십시오 : function (d) {... 텍스트를 원하는대로 변경하십시오. 예를 들어, 이름이 tooltip.text (d.name) 인 경우 :
thatOneGuy

39

최근에 발견 한 멋진 라이브러리가 있습니다. 사용하기 간단하고 결과는 매우 깔끔합니다 : d3-tip.

당신은 여기 에 예를 볼 수 있습니다 :

여기에 이미지 설명을 입력하십시오

기본적으로, 당신이해야 할 일은 다운로드 ( index.js )이며 스크립트를 포함시키는 것입니다.

<script src="index.js"></script>

다음 지침을 따르십시오 여기 (예와 동일한 링크)

그러나 코드의 경우 다음과 같습니다.

방법을 정의하십시오 :

var tip = d3.tip()
  .attr('class', 'd3-tip')
  .offset([-10, 0])
  .html(function(d) {
    return "<strong>Frequency:</strong> <span style='color:red'>" + d.frequency + "</span>";
  })

당신이 이미 당신처럼 svg를 만들

var svg = ...

메소드를 호출하십시오.

svg.call(tip);

객체에 팁을 추가하십시오.

vis.selectAll("circle")
   .data(datafiltered).enter().append("svg:circle")
...
   .on('mouseover', tip.show)
   .on('mouseout', tip.hide)

CSS를 추가하는 것을 잊지 마십시오 :

<style>
.d3-tip {
  line-height: 1;
  font-weight: bold;
  padding: 12px;
  background: rgba(0, 0, 0, 0.8);
  color: #fff;
  border-radius: 2px;
}

/* Creates a small triangle extender for the tooltip */
.d3-tip:after {
  box-sizing: border-box;
  display: inline;
  font-size: 10px;
  width: 100%;
  line-height: 1;
  color: rgba(0, 0, 0, 0.8);
  content: "\25BC";
  position: absolute;
  text-align: center;
}

/* Style northward tooltips differently */
.d3-tip.n:after {
  margin: -1px 0 0 0;
  top: 100%;
  left: 0;
}
</style>

2
최신 d3 팁 은 d3v4 만 지원합니다. 당신이 구글을 둘러 보면 분명하지 않지만 d3v4에서 나에게 잘 작동합니다.
moodboom

6

이와 같이 마우스 오버에 사용될 데이터를 전달할 수 있습니다. 마우스 오버 이벤트는 이전에 entered 데이터가있는 함수를 인수 (및 두 번째 인수로 색인)로 사용 enter()하므로 두 번째 로 사용할 필요가 없습니다 .

vis.selectAll("circle")
.data(datafiltered).enter().append("svg:circle")
.attr("cx", function(d) { return x(d.x);})
.attr("cy", function(d) {return y(d.y)})
.attr("fill", "red").attr("r", 15)
.on("mouseover", function(d,i) {
    d3.select(this).append("text")
        .text( d.x)
        .attr("x", x(d.x))
        .attr("y", y(d.y)); 
});

감사. 실제로 d3.select(this)모양을 수정해야하고 입력 / 업데이트에서 인스턴스를 얻는 방법을 몰랐습니다.
Turbo

코드에 정의되지 않은 일부 함수 x () 및 y ()를 사용하고 있습니다. 나는 그것을 제거 할 수 있다고 생각합니다.
Robert

그들은 OP에 주어졌다
danimal

5

이 간결한 예는 d3에서 사용자 정의 툴팁을 작성하는 일반적인 방법을 보여줍니다.

var w = 500;
var h = 150;

var dataset = [5, 10, 15, 20, 25];

// firstly we create div element that we can use as
// tooltip container, it have absolute position and
// visibility: hidden by default

var tooltip = d3.select("body")
  .append("div")
  .attr('class', 'tooltip');

var svg = d3.select("body")
  .append("svg")
  .attr("width", w)
  .attr("height", h);

// here we add some circles on the page

var circles = svg.selectAll("circle")
  .data(dataset)
  .enter()
  .append("circle");

circles.attr("cx", function(d, i) {
    return (i * 50) + 25;
  })
  .attr("cy", h / 2)
  .attr("r", function(d) {
    return d;
  })
  
  // we define "mouseover" handler, here we change tooltip
  // visibility to "visible" and add appropriate test
  
  .on("mouseover", function(d) {
    return tooltip.style("visibility", "visible").text('radius = ' + d);
  })
  
  // we move tooltip during of "mousemove"
  
  .on("mousemove", function() {
    return tooltip.style("top", (event.pageY - 30) + "px")
      .style("left", event.pageX + "px");
  })
  
  // we hide our tooltip on "mouseout"
  
  .on("mouseout", function() {
    return tooltip.style("visibility", "hidden");
  });
.tooltip {
    position: absolute;
    z-index: 10;
    visibility: hidden;
    background-color: lightblue;
    text-align: center;
    padding: 4px;
    border-radius: 4px;
    font-weight: bold;
    color: orange;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.11.0/d3.min.js"></script>


누구든지 객체의 위치를 ​​기준으로 이동하려면 툴팁이 필요합니다. 트리 그래프의 경우처럼. 속성 return tooltip.style("top", (d.x + 40) + "px") .style("left", (d.y + 80) + "px");에서 사용할 수 있습니다 'mousemove'. d.x의지 도움말 개체가 아닌 전체 페이지에 도구 팁 상대를 이동
찬드라 Kanth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.