- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试使用类似于此的 d3js 和 nvd3.js 实现“堆积面积图”example .此外,我想使用像 this one 这样的上下文画笔。选择影响堆积面积图的日期范围。实际上,这已经在起作用了,但是一旦选定的日期范围不包含第一个日期,它就会以某种方式在 Y 轴的顶部绘制一些线。看看下面的图片:
这是我的代码:
堆积面积图
var margin = {
top : 10,
right : 20,
bottom : 100,
left : 20
}, width = 960, height = 300;
var svg_stack = d3.select("#stack").append("svg").attr("width", width + margin.left + margin.right).attr("height", (height + margin.top + margin.bottom));
function initStackChart() {
nv.addGraph(function() {
var chart = nv.models.stackedAreaChart().x(function(d) {
return Date.parse(new Date(d[0]))
}).y(function(d) {
return d[1]
}).clipEdge(false);
chart.xAxis.tickFormat(function(d) {
return d3.time.format('%x')(new Date(d))
});
chart.yAxis.tickFormat(d3.format(',.2f'));
if (!!time_range) {
chart.xDomain([time_range[0], time_range[1]]);
}
d3.select('#stack svg').datum(temp_data).transition().duration(100).call(chart);
nv.utils.windowResize(chart.update);
return chart;
});
}
画笔
var margin = {top: 10, right: 20, bottom: 0, left: 20},
width = 960,
height = 50;
var contextHeight = 50;
contextWidth = width;
var parseDate = d3.time.format("%Y-%m-%d").parse;
var x = d3.time.scale().range([0, width]),
y = d3.scale.linear().range([contextHeight, 0]);
var xAxis = d3.svg.axis().scale(x).tickSize(contextHeight).tickPadding(-10).orient("bottom");
var brush = d3.svg.brush()
.x(x)
.on("brush", brushed);
var area2 = d3.svg.area()
.interpolate("monotone")
.x(function(d) { return x(d.time); })
.y0(contextHeight)
.y1(0);
var svg_brush = d3.select("#brush").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom);
svg_brush.append("defs").append("clipPath")
.attr("id", "clip")
.append("rect")
.attr("width", width)
.attr("height", height);
var context = svg_brush.append("g").attr("class","context")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
function initBrush(data)
{
x.domain(d3.extent(data.map(function(d) { return d.time; })));
context.append("g")
.attr("class", "x axis top")
.attr("transform", "translate(0,0)")
.call(xAxis);
context.append("g")
.attr("class", "x brush")
.call(brush)
.selectAll("rect")
.attr("y", 0)
.attr("height", contextHeight);
};
function brushed() {
var b = brush.empty() ? x.domain() : brush.extent();
console.log(b);
time_range=b;
initStackChart();
}
数据
var temp_data = [
{
key: "Node0",
values:
[
[ 1364795940000, 10 ],
[ 1365020480000, 30 ],
[ 1365630480000, 30 ],
[ 1366000480012, 30 ],
[ 1366012740000, 0 ]
]
},
{
key: "Node1",
values:
[
[ 1364795940000, 10 ],
[ 1365020480000, 20 ],
[ 1365630480000, 34 ],
[ 1366000480012, 82 ],
[ 1366012740000, 0 ]
]
},
{
key: "Node2",
values:
[
[ 1364795940000, 20 ],
[ 1365020480000, 10 ],
[ 1365630480000, 0 ],
[ 1366000480012, 100 ],
[ 1366012740000, 80 ]
]
},
{
key: "Node3",
values:
[
[ 1364795940000, 10 ],
[ 1365020480000, 60 ],
[ 1365630480000, 10 ],
[ 1366000480012, 10 ],
[ 1366012740000, 10 ]
]
},
{
key: "Node4",
values:
[
[ 1364795940000, 16 ],
[ 1365020480000, 32 ],
[ 1365630480000, 10 ],
[ 1366000480012, 90 ],
[ 1366012740000, 10 ]
]
},
{
key: "Node5",
values:
[
[ 1364795940000, 10 ],
[ 1365020480000, 50 ],
[ 1365630480000, 10 ],
[ 1366000480012, 20 ],
[ 1366012740000, 110 ]
]
},
{
key: "Node6",
values:
[
[ 1364795940000, 19 ],
[ 1365020480000, 55 ],
[ 1365630480000, 32 ],
[ 1366000480012, 12 ],
[ 1366012740000, 12 ]
]
},
{
key: "Node7",
values:
[
[ 1364795940000, 0 ],
[ 1365020480000, 20 ],
[ 1365630480000, 40 ],
[ 1366000480012, 30 ],
[ 1366012740000, 20 ]
]
},
{
key: "Node8",
values:
[
[ 1364795940000, 12 ],
[ 1365020480000, 31 ],
[ 1365630480000, 40 ],
[ 1366000480012, 20 ],
[ 1366012740000, 15 ]
]
},
{
key: "Node9",
values:
[
[ 1364795940000, 10 ],
[ 1365020480000, 35 ],
[ 1365630480000, 50 ],
[ 1366000480012, 30 ],
[ 1366012740000, 90 ]
]
}
]
谢谢。
最佳答案
更改 .clipEdge(false);
至 .clipEdge(true);
在您的图表设置中。
好的,我已经成功地在 NVD3 live code site 上重现了您的问题使用以下代码(数据和标记与其堆叠图示例相同):
nv.addGraph(function() {
var chart = nv.models.stackedAreaChart()
.x(function(d) { return d[0] })
.y(function(d) { return d[1] })
.clipEdge(true);
var chart2 = nv.models.stackedAreaChart()
.x(function(d) { return d[0] })
.y(function(d) { return d[1] })
.xDomain([1096516800000, 1270008000000])
.clipEdge(true);
chart.xAxis
.showMaxMin(false)
.tickFormat(function(d) { return d3.time.format('%x')(new Date(d)) });
chart.yAxis
.tickFormat(d3.format(',.2f'));
chart2.xAxis
.showMaxMin(false)
.tickFormat(function(d) { return d3.time.format('%x')(new Date(d)) });
chart2.yAxis
.tickFormat(d3.format(',.2f'));
d3.select('#chart svg')
.datum(data)
.transition().duration(500).call(chart)
.transition().delay(3000).duration(500)
.call(chart2);
nv.utils.windowResize(chart.update);
return chart2;
});
这基本上就是您正在做的事情——创建一个全新的图表函数,并在同一个容器上调用它。图表函数主要选择所有相同的对象,并更改它们的属性——从而实现平滑过渡。但是,它给 <clipPath>
的随机 ID 代码元素(以确保每个元素都有一个唯一的 id)不再与它用作“clip-path”属性的元素相匹配。您可以将此称为 NVD3 代码中的错误,但也有部分原因是您以意想不到的方式使用了该函数。
相反,如果我使用这段代码:
nv.addGraph(function() {
var chart = nv.models.stackedAreaChart()
.x(function(d) { return d[0] })
.y(function(d) { return d[1] })
.clipEdge(true);
chart.xAxis
.showMaxMin(false)
.tickFormat(function(d) { return d3.time.format('%x')(new Date(d)) });
chart.yAxis
.tickFormat(d3.format(',.2f'));
var svg = d3.select('#chart svg')
.datum(data)
.transition().duration(500).call(chart);
nv.utils.windowResize(chart.update);
var change = window.setTimeout(function(){
chart.xDomain([1096516800000, 1270008000000]);
chart.update();
}, 3000);
return chart;
});
剪切路径仍然很好用。注意到区别了吗?我没有创建和调用全新的图表函数,而是用新域更新了图表函数,并调用了函数的 update()
。方法。尝试重新安排您的刷亮功能以这种方式进行更新,您不仅应该解决剪切路径问题,而且您的代码也应该更快。
那么如何用您的原始代码实现它呢?
首先,您需要保存在 nv.addGraph()
中创建的图表函数对象进入一个可以被你的brushed()
访问的变量功能。
然后,在您的 brushed()
中函数,您修改保存的图表函数以应用新的 x 域,然后调用函数对象的更新方法。
var margin = {
top : 10,
right : 20,
bottom : 100,
left : 20
}, width = 960, height = 300;
var chart; // NEW! declare a variable that can be accessed by both
// initialization and update functions
var svg_stack = d3.select("#stack")
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", (height + margin.top + margin.bottom));
function initStackChart() {
nv.addGraph(function() {
chart = nv.models.stackedAreaChart()
// NEW! no "var" statement!
// this gets assigned to the chart variable declared above
/* rest of chart initialization code, the same as before */
});
}
/* All the initialization code for the timeline brushing goes here, until: */
function brushed() {
var b = brush.empty() ? x.domain() : brush.extent();
console.log(b);
time_range=b;
chart.xDomain(b); //modify the saved chart object
chart.update(); //update the chart using the saved function
}
关于javascript - nvd3js 中的堆积面积图 - X 轴溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21190421/
我有一个 div(蓝色框),它在父元素(红色框)内的页面上绝对定位,我需要将 overflow-y 设置为隐藏,以便它强制 Y 轴上的溢出内容切掉了,但我希望任何溢出-x 的内容都可见。 HTML:
请参阅以下帖子以获取突出显示我的问题和可能的解决方案的图片: CSS overflow-y:visible, overflow-x:scroll 但是,当您实际移动滚动条时,此策略会中断。在建议的实现
我在搜索中看到过几个类似的问题,但要么没有正确回答问题,要么没有给出答案。所以,我再问一次。 .parent { overflow-y:scroll; overflow-x:visible; wid
我读过这个CSS overflow-x hidden and overflow-y visible (以及很多其他帖子)但我无法在我的具体情况下使用它。 我正在使用 slick-slider并想添加下
我有以下 Spark 作业,试图将所有内容保留在内存中: val myOutRDD = myInRDD.flatMap { fp => val tuple2List: ListBuffer[(St
我有疑问 两个16位的值加上最大值,16位机会不会溢出? 我会详细说明 unsigned short a; unsigned short b; unsigned long c; c=(unsigne
我有这个 HTML 和 CSS,但“溢出:隐藏”标签在 Firefox 中不起作用。这让我感到难过...有人知道为什么它不起作用吗?是因为A标签不支持overflow标签吗? #page_sideba
我正在开发一个程序,用于在 C++ 中分解非常大的数字(20 位或更多),并且正在使用 GMP 来处理溢出问题。我的程序对于大约 10 位或更少的数字运行良好,但是当我向它抛出一个 15 位数字时,它
我创建了一个 Canvas ,并在其中放置了一个StackPanel。 StackPanel是水平的,它接受缩略图图像的列表。 Canvas 具有固定的大小。当我放置的缩略图多于Canvas宽度不能容
当 g_array_append_val() 时会发生什么或 GLib 中的其他附加/前置函数之一,使 GArray 的长度大于 guint (unsigned int) 所能容纳的长度? 文档对此没
overflow-x:hidden 和 overflow:hidden; 有什么区别? 我所知道的是overflow-x:hidden;禁用水平滚动,但当我使用它时,它不仅仅适用于 Firefox,所
我们正在运行 Solr 来索引大量数据,但遇到了一个非常有趣的问题,我无法在任何地方找到任何帮助。 似乎 Solr 使用带符号的 32 位整数来计算索引中当前的文档数。我们刚刚达到了这个数字,我们的
这是我的查询: 从相似性中选择 COUNT(*),其中 T1Similarity = 0 或 T2Similarity = 0 结果如下: Msg 8115, Level 16, State 2, L
int main(void) { char x1 = 0x81; char x2 = 0x1; int a, b; a = x1
我有一个 div,其中的内容通过查询的 append() 定期附加到它。随着内容越来越长,最终会溢出div。我不希望在溢出时出现滚动条,但仍然让内容向上滚动以显示下面的新内容。 这可能吗?当我使用 o
我为 UITextField 创建了一个简单的子类,它按预期工作。我遇到的唯一问题是当文本值变得太大时,它会溢出到清除按钮中。 我似乎无法找到如何仅更改文本的右侧以具有一些填充而不与清除按钮相交的方法
我想要一个包括下拉菜单的粘性导航栏。但是,当我将鼠标悬停在它上面时,下拉菜单没有显示。 如果我删除 overflow: hidden;在无序列表中,当我向下滚动时,导航栏设法保持在顶部,但是导航栏是不
我正在研究一些按钮。我想要一个翻转状态,我在一个 div 的图像中有这个,溢出:隐藏以隐藏不活动的状态。它有时有效,但有时看起来像这样: 最奇怪的是,当我尝试使用 Chrome Web Inspect
基本上,我正在尝试创建一个六边形形状,它内部有一个圆圈,圆圈的多余部分应该被隐藏。演示:https://codepen.io/AskSaikatSinha/pen/jwXNPJ?editors=110
这似乎是一个相当常见且不那么奇特的用例,但我以前没有遇到过。我设置了一支笔,但无法在那里复制它,我正在努力找出原因。 Demo Pen 左侧边栏有一个用于元素列表的自定义滚动窗口,但是虽然设置 ove
我是一名优秀的程序员,十分优秀!