- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
情况:
问题:
我正在尝试使用我管理的 D3.js 创建热图。我现在无法显示图例。
为什么图例没有出现?
图例应如下所示:https://codepen.io/freeCodeCamp/full/aNLYPp
代码:
<script type="text/javascript">
// Excellent example from Tom May helped me when I got stuck: http://bl.ocks.org/tjdecke/5558084
d3.json("https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/global-temperature.json", function(error, json) {
if (error) {
return console.warn(error);
}
visualizeThe(json);
});
function visualizeThe(data) {
const baseTemperature = data.baseTemperature;
const tempData = data.monthlyVariance;
const margin = {
top: 10,
right: 85,
bottom: 65,
left: 70
}
const w = 1250 - margin.left - margin.right;
const h = 500 - margin.top - margin.bottom;
const barWidth = Math.ceil(w / tempData.length);
const legendElementWidth = w/12;
const colors = ["#5e4fa2", "#3288bd", "#66c2a5", "#abdda4", "#e6f598", "#ffffbf", "#fee08b", "#fdae61", "#f46d43", "#d53e4f", "#9e0142"];
const buckets = colors.length;
const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
const minTime = d3.min(tempData, (d) => new Date(d.year,1,1,0,0));
const maxTime = d3.max(tempData, (d) => new Date(d.year,1,1,0,0));
const xScale = d3.scaleTime()
.domain([minTime, maxTime])
.range([margin.left, w]);
const xAxis = d3.axisBottom(xScale).ticks(20);
const svg = d3.select("#results")
.append("svg")
.attr("width", w + margin.left + margin.right)
.attr("height", h + margin.top + margin.bottom);
const div = d3.select("body")
.append("div")
.attr("class", "tooltip")
.style("opacity", 0);
svg.append("g")
.attr("transform", "translate(0," + (h+margin.top) + ")")
.call(xAxis);
const monthsLabels = svg.selectAll("monthLabel")
.data(months)
.enter()
.append("text")
.text((d) => d)
.attr("x", 100)
.attr("y", (d,i) => i * h/12 + 21)
.style("text-anchor", "end")
.attr("transform", "translate(-40," +0+ ")")
.style("font-size", 10);
const colorScale = d3.scaleQuantile()
.domain([d3.min(tempData, (d) => d.variance + baseTemperature ), d3.max(tempData, (d) => d.variance + baseTemperature )])
.range(colors);
const heatMap = svg.selectAll("month")
.data(tempData, (d) => d);
const rects = heatMap.enter()
.append("rect")
.attr("x", (d) => xScale(new Date(d.year,1,1,0,0)))
.attr("y", (d) => d.month * h/12 - margin.bottom + margin.top -1)
.attr("width", barWidth + 3)
.attr("height", h/12 )
.style("fill", colors[0])
.on("mouseover", function(d) {
div.transition()
.duration(200)
.style("opacity", .9);
div .html( d.year +" "+ months[d.month-1]+"<br>"+(d.variance + baseTemperature).toFixed(3)+" °C <br>"+d.variance+" Variance")
.style("left", (d3.event.pageX) + "px")
.style("top", (d3.event.pageY - 50) + "px");
})
.on("mouseout", function(d) {
div.transition()
.duration(500)
.style("opacity", 0);
});
rects.transition().duration(1000)
.style("fill", (d) => colorScale(d.variance + baseTemperature));
svg.append("text")
.attr("transform",
"translate(" + (w/2) + " ," +
(h+ margin.top + 45) + ")")
.style("text-anchor", "middle")
.text("Years");
svg.append("text")
.attr("transform", "rotate(-90)")
.attr("y", -5)
.attr("x",0 - (h / 2))
.attr("dy", "1em")
.style("text-anchor", "middle")
.text("Months");
const legend = svg.selectAll("legend")
.data([0].concat(colorScale.quantiles()), (d) => d);
const legendEntries = legend.enter().append("g")
.attr("class", "legend");
legendEntries.append("rect")
.attr("x", (d, i) => (w*0.7)+ legendElementWidth/4 * i )
.attr("y", h + 40)
.attr("width", legendElementWidth)
.attr("height", 20)
.style("fill", (d, i) => colors[i]);
legendEntries.append("text")
.data(tempData)
.text((d) => "≥ " + Math.round(d.variance+baseTemperature))
.attr("x", (d, i) =>(w*0.7)+ legendElementWidth/4 * i)
.attr("y", h + 75);
}
</script>
最佳答案
这段代码给你带来了问题:
const legend = svg.selectAll("legend")
.data(tempData.concat(colorScale.quantiles()), (d) => d["month"] );
legend.enter().append("g")
.attr("class", "legend");
legend.append("rect")
.attr("x", (d,i) => legendElementWidth * i)
.attr("y", h)
.attr("width", legendElementWidth)
.attr("height", 5)
.style("fill", (d, i) => colors[i]);
legend.append("text")
.attr("class", "mono")
.text((d) => "≥ " + Math.round(d.variance+baseTemperature))
.attr("x", (d, i) =>legendElementWidth * i)
.attr("y", h + 4);
请注意,您的输入选择仅用于附加“g”元素。您还需要使用输入选择附加矩形和文本。将您的代码与:
const legend = svg.selectAll("legend")
.data(tempData.concat(colorScale.quantiles()), (d) => d["month"] );
const legendEntries = legend.enter().append("g")
.attr("class", "legend");
legendEntries.append("rect")
.attr("x", (d,i) => legendElementWidth * i)
.attr("y", h)
.attr("width", legendElementWidth)
.attr("height", 5)
.style("fill", (d, i) => colors[i]);
legendEntries.append("text")
.attr("class", "mono")
.text((d) => "≥ " + Math.round(d.variance+baseTemperature))
.attr("x", (d, i) =>legendElementWidth * i)
.attr("y", h + 4);
输入选择返回需要添加到 DOM 的元素。在这里,我们为每个需要添加的元素附加一个“g”及其数据。然后我们将项目附加到我们刚刚输入的 'g'。
这不是您问题的一部分,但您可能想检查传递给图例的数据。
关于javascript - D3 : Why doesn't the heatmap color legend appear?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43658790/
我的 CSS 中有以下代码: header input{ width:100%; height:50px; float:left; color:fff; background: rgba(255,25
我一直在尝试使用外观代理 API 将一些默认颜色应用于某些控件,但我遇到了问题。 当我使用诸如...之类的东西将色调颜色应用到 UISegmentedControl 时 UISegmentedCont
我正在将其他人制作的一个现有的小型 Angular JS 应用程序集成到一个不是使用 Angular 构建的现有网站中。 所有 Angular JS 应用程序文件都保存在一个完全独立的目录中,然后用户
我的应用程序在调用 $(document).ready 后向 DOM 添加一些元素。我正在使用 jQuery 1.9.0 以下示例有效。 $(document).on("click", "#box-d
我是 jquery 方面的大菜鸟,我需要弄清楚如何更改此代码: $('.social li').appear(); $(document.body).on('appear', '.social li'
这个问题在这里已经有了答案: Z-index with before pseudo-element (2 个答案) Is it possible to set the stacking order
尽管MSDN和 MDN声明 IE11 似乎根本不支持 webkit-appearance。尝试将 -webkit-appearance 设置为任何声称支持的值时(none、button、textfie
当我尝试克隆 git 用户 HOME 之外的远程 git 时出现错误。 Cloning into test... fatal: '/media/raid/repo/test.git' does not
谁能明白为什么这个 html 代码不起作用。 当图像变得可见时,它应该显示警报,当图像对用户不可见时,它应该再次显示警报。 它也不适用于本地库。
我正在尝试访问 super 英雄 api,但对于某些数据,它一直显示数据未定义。 var html = ""; $.each(data.results,function(i,results){ ht
我需要编写一个小的正则表达式匹配器,它将匹配任何出现的字符串形式 [a-zA-Z]+(_[a-zA-Z0-9]+)? 如果我使用上面的正则表达式,它会匹配所需的部分,但也会匹配到 4_abc 的 ab
在我的网站上,我有多个组件充当每个单独页面的模板,例如“主页”、“关于我”等……我的目标是在每个页面之间实现滑动过渡,我已经使用过渡标签以及添加的“出现”属性和一些 CSS 实现了这一点。我的问题是,
我正在尝试将两个微调器放入工具栏(我正在使用协调器布局) 代码如下
我想让导航栏在使用关闭按钮关闭时消失,或者在关闭屏幕时让导航栏隐藏。 代码如下: - (void)viewDidLoad { [self.navigationController setNav
这个问题不太可能帮助任何 future 的访客;它只与一个小地理区域、一个特定时刻或一个非常狭窄的情况相关,而这些情况通常不适用于互联网的全局受众。如需帮助使这个问题更广泛地适用,visit the
感谢您阅读这个问题,我是 React 新手,我尝试做一个任务应用程序,所以我这样做。 App.js import React, { Component }from 'react' import Rea
我一直在尝试通过 jQuery 删除-webkit-appearance:none; 但没有任何效果。我尝试了以下方法: jQuery(document).ready(function(){ jQ
我为我的选择框设置了样式,它在 chrome 和 safari 上运行良好。 现在我的问题出在 FF 中,我仍然可以看到带有选择框的下拉箭头。 我试过引用this solutions和 this so
我刚刚自学 HTML 和 CSS,但遇到了我的第一个烦人的错误。 这是我的代码: http://pastebin.com/Rk6TjqKZ 到目前为止,这是我唯一的图像,它曾经出现过,但自从将一个类添
如果我能在任何地方找到这方面的任何信息,我就不会问这个问题。我检查了 w3schools、这个网站和谷歌。什么都没有。 那么,是否有一个 css -ms 等同于 -webkit-appearance?
我是一名优秀的程序员,十分优秀!