【发布时间】:2020-04-23 05:52:19
【问题描述】:
我有两个需要渲染的元素和一个我想要实现的大图的上下文(一个完整的仪表板)。
一个是渲染良好的图表。
$scope.riskChart = new dc.pieChart('#risk-chart');
$scope.riskChart
.width(width)
.height(height)
.radius(Math.round(height/2.0))
.innerRadius(Math.round(height/4.0))
.dimension($scope.quarter)
.group($scope.quarterGroup)
.transitionDuration(250);
另一个是三角形,用于更复杂的形状
$scope.openChart = d3.select("#risk-chart svg g")
.enter()
.attr("width", 55)
.attr("height", 55)
.append('path')
.attr("d", d3.symbol('triangle-up'))
.attr("transform", function(d) { return "translate(" + 100 + "," + 100 + ")"; })
.style("fill", fill);
在调用渲染函数时,会识别 dc.js 渲染函数并看到图表,但无法识别 d3.js 渲染()函数。
如何将此形状添加到我的 dc.js 画布(一个 svg 元素)。
$scope.riskChart.render(); <--------------Works!
$scope.openChart.render(); <--------------Doesn't work (d3.js)!
我该如何进行这项工作?
编辑:
我修改了 dc.js 以包含我的自定义图表,这是一项正在进行的工作。
dc.starChart = function(parent, fill) {
var _chart = {};
var _count = null, _category = null;
var _width, _height;
var _root = null, _svg = null, _g = null;
var _region;
var _minHeight = 20;
var _dispatch = d3.dispatch('jump');
_chart.count = function(count) {
if(!arguments.length)
return _count;
_count = count;
return _chart;
};
_chart.category = function(category) {
if(!arguments.length)
return _category
_category = category;
return _chart;
};
function count() {
return _count;
}
function category() {
return _category;
}
function y(height) {
return isNaN(height) ? 3 : _y(0) - _y(height);
}
_chart.redraw = function(fill) {
var color = fill;
var triangle = d3.symbol('triangle-up');
this._g.attr("width", 55)
.attr("height", 55)
.append('path')
.attr("d", triangle)
.attr("transform", function(d) { return "translate(" + 25 + "," + 25 + ")"; })
.style("fill", fill);
return _chart;
};
_chart.render = function() {
_g = _svg
.append('g');
_svg.on('click', function() {
if(_x)
_dispatch.jump(_x.invert(d3.mouse(this)[0]));
});
if (_root.select('svg'))
_chart.redraw();
else{
resetSvg();
generateSvg();
}
return _chart;
};
_chart.on = function(event, callback) {
_dispatch.on(event, callback);
return _chart;
};
_chart.width = function(w) {
if(!arguments.length)
return this._width;
this._width = w;
return _chart;
};
_chart.height = function(h) {
if(!arguments.length)
return this._height;
this._height = h;
return _chart;
};
_chart.select = function(s) {
return this._root.select(s);
};
_chart.selectAll = function(s) {
return this._root.selectAll(s);
};
function resetSvg() {
if (_root.select('svg'))
_chart.select('svg').remove();
generateSvg();
}
function generateSvg() {
this._svg = _root.append('svg')
.attr({width: _chart.width(),
height: _chart.height()});
}
_root = d3.select(parent);
return _chart;
}
【问题讨论】:
-
.render()是 dc.js 图表上的一种方法。 D3 的层次要低得多——更像是一个没有任何图表或渲染/重绘概念的图形库。虽然这不是一个完全相同的重复,但我将投票结束另一个问题,我希望它能解释你所缺少的。 -
这能回答你的问题吗? dc.js - Listening for chart group render
-
我经常看到 d3.js 和 dc.js 之间的这种混淆 - 如果有什么我可以添加到 dc.js 文档中以使库之间的关系更加清晰,请 lmk。
-
是的,那已经过时了 - 感谢您的提醒!我已经更新了它。如果您遇到其他问题,请对该答案发表评论。
-
这个选项卡在我的屏幕上仍然打开,我意识到您可能根本不想添加另一个图表,而只是想用一些其他内容注释饼图。为此,您需要查看.on('pretransition',...) or .on('renderlet', ...)。如果您四处搜索,您会在网络上找到许多示例。
标签: javascript d3.js dashboard dc.js