- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题:
我正在尝试将带有数据集第一个索引的 data-data
属性添加到我的每个工具提示中,因为它们是由代码生成的,但我终生做不到我想出了如何根据数据集动态设置它。
例如,我想实现等价于此:
const tip = d3.tip()
.attr('data-date', d => d[0])
//...
这是一个代码片段:
//need to fix tooltip data-date attr.. don't know how I'll do that yet though
const endpoint =
"https://raw.githubusercontent.com/freeCodeCamp/ProjectReferenceData/master/GDP-data.json";
d3.json(endpoint).then(data => {
const gc = d3.select(document.getElementById("graph-container")),
dataset = data.data,
canvasWidth = 900,
canvasHeight = 477,
padding = 50,
years = dataset.map(s => s[0].slice(0, 4)),
xScale = d3
.scaleLinear()
.domain([0, dataset.length])
.range([padding, canvasWidth - padding]),
yScale = d3
.scaleLinear()
.domain([0, d3.max(dataset, d => d[1])])
.range([padding, canvasHeight - padding]),
tip = d3 //making a tooltip
.tip()
.attr("id", "tooltip")
.direction("e")
.offset([0, 25])
.html(
d =>
`${d[0].slice(0, 4)} Q${
d[0].slice(5, 7) === "01"
? "1"
: d[0].slice(5, 7) === "04"
? "2"
: d[0].slice(5, 7) === "07"
? "3"
: d[0].slice(5, 7) === "10" ? "4" : null
}<br />$${d[1]} Billion`
),
xAxis = d3
.axisBottom(
d3
.scaleLinear()
.domain([d3.min(years), d3.max(years)])
.range([padding, canvasWidth - padding])
)
.tickFormat(d3.format("d")),
yAxis = d3.axisLeft(
d3
.scaleLinear()
.domain([0, d3.max(dataset, d => d[1])])
.range([canvasHeight - padding, padding])
); //not sure how to make this work without redefining the range. point is, however, it works... so... take that
gc //making the title element
.append("div")
.attr("id", "title")
.text("National Income and Product Accounts of the United States (NIPA)");
gc //making the graph
.append("svg")
.attr("id", "canvas")
.attr("width", canvasWidth)
.attr("height", canvasHeight)
.call(tip)
.selectAll("rect")
.data(dataset)
.enter()
.append("rect")
.attr("class", "bar")
.style('fill', (d, i) => d[1] <= dataset[i === 0 ? 0 : i - 1][1] ? '#f92727' : '#00cc58')
.attr("x", (d, i) => xScale(i))
.attr("y", d => canvasHeight - yScale(d[1]))
.attr("width", canvasWidth / dataset.length)
.attr("height", d => yScale(d[1]) - padding)
.attr("data-date", d => d[0])
.attr("data-gdp", d => d[1])
.on("mouseover", tip.show)
.on("mouseout", tip.hide);
d3 //add x-axis
.select(document.getElementById("canvas"))
.append("g")
.attr("id", "x-axis")
.attr("transform", `translate(0, ${canvasHeight - padding})`)
.call(xAxis);
d3 //add y-axis
.select(document.getElementById("canvas"))
.append("g")
.attr("id", "y-axis")
.attr("transform", `translate(${padding}, 0)`)
.call(yAxis);
});
@import url('https://fonts.googleapis.com/css?family=Lato');
* {
overflow: hidden;
font-family: 'Lato';
}
html, body {
padding: 0;
margin: 0;
}
#container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
background-image: linear-gradient(to bottom right, white, #ffffe6);
}
#graph-container {
box-shadow: 2px 2px 10px 1px gray;
height: 550px;
width: 950px;
border-radius: 5px;
background-color: white;
display: flex;
flex-direction: column;
align-items: center;
}
#title {
text-align: center;
padding-top: 15px;
font-size: 20px;
width: 100%;
padding-bottom: 15px;
box-shadow: 0 0 5px 0 gray;
}
#canvas {
background-color: transparent;
margin-top: 15px;
}
.bar:hover {
fill: yellow;
}
#tooltip {
background-color: orange;
padding: 15px;
border-radius: 5px;
min-width: 100px;
text-align: center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3-tip/0.9.1/d3-tip.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<div id="container">
<div id="graph-container"></div>
</div>
我已经尝试将数据集附加到 tip
变量并在 .attr
上传递它,但不幸的是数据集只能通过 .html 传递
没有中断。
我已经尝试移动 .call
以获取提示以传递数据,但这也不起作用。
我必须使用 .attr
并且不能通过将属性附加到生成的 div/span/etc 来在 html 中伪造它。
有人有什么想法吗?
最佳答案
d3-tip
是一个非常独立的实体,所以如果你想这样做,你基本上必须破解它;没有通过官方 API 完成此操作的好方法。在 html
函数期间,您可以操作 tip
DOM 元素并使用当前数据项向其添加属性:
.html(
d => {
// slightly horrible hack
d3.select('#tooltip').attr('data-date', d[0]);
return `${d[0].slice(0, 4)} Q${
d[0].slice(5, 7) === "01"
? "1"
: d[0].slice(5, 7) === "04"
? "2"
: d[0].slice(5, 7) === "07"
? "3"
: d[0].slice(5, 7) === "10" ? "4" : null
}<br />$${d[1]} Billion`
}),
集成到整个代码中:
//need to fix tooltip data-date attr.. don't know how I'll do that yet though
const endpoint =
"https://raw.githubusercontent.com/freeCodeCamp/ProjectReferenceData/master/GDP-data.json";
d3.json(endpoint).then(data => {
const gc = d3.select(document.getElementById("graph-container")),
dataset = data.data,
canvasWidth = 900,
canvasHeight = 477,
padding = 50,
years = dataset.map(s => s[0].slice(0, 4)),
xScale = d3
.scaleLinear()
.domain([0, dataset.length])
.range([padding, canvasWidth - padding]),
yScale = d3
.scaleLinear()
.domain([0, d3.max(dataset, d => d[1])])
.range([padding, canvasHeight - padding]),
tip = d3 //making a tooltip
.tip()
.attr("id", "tooltip")
.direction("e")
.offset([0, 25])
.html(
d => {
d3.select('#tooltip').attr('data-date', d[0]);
return `${d[0].slice(0, 4)} Q${
d[0].slice(5, 7) === "01"
? "1"
: d[0].slice(5, 7) === "04"
? "2"
: d[0].slice(5, 7) === "07"
? "3"
: d[0].slice(5, 7) === "10" ? "4" : null
}<br />$${d[1]} Billion`
}),
xAxis = d3
.axisBottom(
d3
.scaleLinear()
.domain([d3.min(years), d3.max(years)])
.range([padding, canvasWidth - padding])
)
.tickFormat(d3.format("d")),
yAxis = d3.axisLeft(
d3
.scaleLinear()
.domain([0, d3.max(dataset, d => d[1])])
.range([canvasHeight - padding, padding])
); //not sure how to make this work without redefining the range. point is, however, it works... so... take that
gc //making the title element
.append("div")
.attr("id", "title")
.text("National Income and Product Accounts of the United States (NIPA)");
gc //making the graph
.append("svg")
.attr("id", "canvas")
.attr("width", canvasWidth)
.attr("height", canvasHeight)
.call(tip)
.selectAll("rect")
.data(dataset)
.enter()
.append("rect")
.attr("class", "bar")
.style('fill', (d, i) => d[1] <= dataset[i === 0 ? 0 : i - 1][1] ? '#f92727' : '#00cc58')
.attr("x", (d, i) => xScale(i))
.attr("y", d => canvasHeight - yScale(d[1]))
.attr("width", canvasWidth / dataset.length)
.attr("height", d => yScale(d[1]) - padding)
.attr("data-date", d => d[0])
.attr("data-gdp", d => d[1])
.on("mouseover", tip.show)
.on("mouseout", tip.hide);
d3 //add x-axis
.select(document.getElementById("canvas"))
.append("g")
.attr("id", "x-axis")
.attr("transform", `translate(0, ${canvasHeight - padding})`)
.call(xAxis);
d3 //add y-axis
.select(document.getElementById("canvas"))
.append("g")
.attr("id", "y-axis")
.attr("transform", `translate(${padding}, 0)`)
.call(yAxis);
});
@import url('https://fonts.googleapis.com/css?family=Lato');
* {
overflow: hidden;
font-family: 'Lato';
}
html, body {
padding: 0;
margin: 0;
}
#container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
background-image: linear-gradient(to bottom right, white, #ffffe6);
}
#graph-container {
box-shadow: 2px 2px 10px 1px gray;
height: 550px;
width: 950px;
border-radius: 5px;
background-color: white;
display: flex;
flex-direction: column;
align-items: center;
}
#title {
text-align: center;
padding-top: 15px;
font-size: 20px;
width: 100%;
padding-bottom: 15px;
box-shadow: 0 0 5px 0 gray;
}
#canvas {
background-color: transparent;
margin-top: 15px;
}
.bar:hover {
fill: yellow;
}
#tooltip {
background-color: orange;
padding: 15px;
border-radius: 5px;
min-width: 100px;
text-align: center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3-tip/0.9.1/d3-tip.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<div id="container">
<div id="graph-container"></div>
</div>
关于javascript - 将 Dynamic Attr() 添加到 d3.tip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52416779/
我正在围绕 D3 编写 React 包装器,但在尝试使用 D3-tip 时出现错误:TypeError: m.tip is not a function。 我看过类似的帖子( here 和 here
我试图通过传递 Controller 、 Action 和参数来重定向 Rails 以显示 Action 。但是,rails 完全忽略了 Action 的名称! 我得到的是 http://mysite
1. 前言 大家好,我是安果! 工作中,我们经常需要编写 SQL 脚本,对数据库进行增、删、改、查,很少会考虑到 Sql 性能优化 实际上,从性能角度考虑,有很多 Sql
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 8 年前。
首先;我知道有类似的问题here或there但他们都没有解决我的问题。 我的 D3-Tip 未显示在我的折线图上。 (它适用于 map ) JS var tip = d3.tip() .att
我希望我在正确的地方发帖。 我对 Java 还很陌生(这意味着这只是我除了“hello world”之外的第三个程序)。 我正在为一项作业开发一个小费计算器。我没有收到这样的“错误”,但分摊账单的方法
我有这个折线图,我在图表中的每个值上都放置了一个点。将鼠标悬停在点上时,我想使用 d3-tip 工具提示显示该值。 这是我到目前为止得到的: var svg = chart.append("svg")
结构 struct school { char*name; int student; int teacher; int worker; }; 其实我有两个问题.. A)是x.y和x->y语法之间的区别
我正在尝试将 d3.tip 添加到我的 d3 信息图中。根据 d3.tip 文档,我使用 Bower 安装了 d3.tip。安装完成后,我的终端屏幕显示: The terminal screen 估计
这个问题在这里已经有了答案: How to append something to an array? (30 个答案) 关闭 9 年前。 我正在使用 JavaScript 和 HTML 开发网页。
1. 使用list来实现一次获取explode后的特定段值: list( , $mid) = explode(';', $string); 2. 使用NULL === 来代替
Git HEAD 和 tip 有什么区别? 很抱歉,如果有人在其他地方问过这个问题......还没有看到任何其他问题。 最佳答案 来自 gitglossary (可能在安装了 git 的计算机上通过
如何在 codeigniter 框架中检查数据是否从数组 $this->data['tips'] 中的数据库中成功检索。我想检查这是 Controller 。 最佳答案 $result = $this
我想使用 Ruby on Rails 3 创建一个小型社交网络。由于它是一个复杂的系统,对于信息架构有什么建议? 我想用分层架构创建多个 RoR 应用程序,每个应用程序都用于完成特定目的。因此,我创建
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 2年前关闭。 Improve t
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
有没有办法用 d3.tip 添加鼠标悬停效果 假设我有这个 var tip = d3.tip() .attr("class", "d3-tip") .html(function(d)
我已经配置了一个带有组合框的丰富工具提示。当我通过单击打开组合框时,工具提示失去焦点并关闭。当我在工具提示之外而不是在工具提示内单击时,需要此行为。 当工具提示本身失去焦点时,如何防止关闭工具提示?
我的问题是我的项目编译时间越来越长。 我的当务之急是如何加快编译速度?我现在用的是SSD硬盘和四核CPU。您认为购买 I7 核心会加快编译速度吗? 我担心它不会,因为 Flash CS5 不会利用多核
你好, 编辑:虽然这个问题涵盖了编程中经常出现的情况,但我一直注意到在使用正则表达式时,尤其是。在 Perl 和 shell 编程中, try catch 最后几个边缘情况: 需要更多、更多的时间来扩
我是一名优秀的程序员,十分优秀!