- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试向我的圆环图添加 D3 图例,我按照此处的示例进行操作:http://bl.ocks.org/ZJONSSON/3918369 。圆环图渲染得很好。
但是,我遇到了以下错误:
在 d3.legend() 函数内,我收到此错误“未捕获的 TypeError:node.getAttribute 不是函数”和“未捕获的 TypeError:this.querySelectorAll 不是函数”。
我不知道为什么......有什么想法吗?
// Alerts.js
renderBody() {
const {list, currentProgram} = this.props
const width = 260;
const height = 260;
const radius = width/2; // 130
// arc & label generator
let arc = d3.arc()
.outerRadius(radius - 10)
.innerRadius(90)
.padAngle(0.02);
let labelArc = d3.arc()
.outerRadius(radius + 60)
.innerRadius(radius - 90);
// pie generator
let pie = d3.pie()
.sort(null)
.value( d => { return d; });
// define svg
let svg = d3.select('.enrolled-statistics-svg').append('svg')
.attr('width', width)
.attr('height', height)
.append('g') // group similar elements together
.attr('transform', 'translate(' + width/2 + ', ' + height/2 + ')');
// append g elements (arc)
const g = svg.selectAll('.arc')
.data(pie(testData))
.enter().append('g')
.attr('class', 'arc');
// append the path of the arc
g.append('path')
.attr('d', arc)
.attr('data-legend', val => {
return val.data;
})
.attr('data-legend-pos', (val) => {
return val.index;
})
.style('fill', val => {
return COLOR_ARRAY[val.index];
});
// append with label
g.append('text')
.attr('transform', d => {
return 'translate(' + labelArc.centroid(d) + ')';
})
.attr('dy', '0.35em')
.text( val => {
return (val.data / testResp.data.enrolledStatistics.total) * 100 + '%';
});
// define d3.legend()
d3.legend = (g) => {
g.each(() => {
let g = d3.select(this);
console.log('------- g: ', g);
let items = {};
let svg = d3.select(g.property('nearestViewportElement'));
let legendPadding = g.attr('data-style-padding') || 5; // ERROR: Uncaught TypeError: node.getAttribute is not a function
let legendBox = g.selectAll('.legend-box').data([true]); // ERROR: Uncaught TypeError: this.querySelectorAll is not a function
let legendItems = g.selectAll('.legend-items').data([true]);
legendBox.enter().append('rect').classed('legend-box', true);
legendItems.enter().append('g').classed('legend-items', true);
svg.selectAll('[data-legend]').each(() => {
let self = d3.select(this)
items[self.attr('data-legend')] = {
pos: self.attr("data-legend-pos") || this.getBBox().y,
color: self.attr("data-legend-color") != undefined ? self.attr("data-legend-color")
: self.style("fill") != 'none' ? self.style("fill") : self.style("stroke")
}
});
items = d3.entries(items).sort(function (a, b) {
return a.value.pos - b.value.pos
});
console.log('------- items: ', items);
legendBox.selectAll('text')
.data(items, val => val.key)
.call(val => {
val.enter().append('text')
})
.call(val => {
val.exit().remove()
})
.attr('y', (val, i) => {
return `${i}em`
})
.attr('x', '1em')
.text(val => val.key);
legendItems.selectAll("circle")
.data(items, function (d) {
return d.key
})
.call(val => val.enter().append("circle"))
.call(val => val.exit().remove())
.attr('cy', (val, i) => `${i - 0.25}em`)
.attr('cx', 0)
.attr('r', '0.4em')
.style('fill', val => {
console.log(val.value.color);
return val.value.color
});
// Reposition and resize the box
let lbbox = li[0][0].getBBox();
lbbox.attr("x", (lbbox.x - legendPadding))
.attr("y", (lbbox.y - legendPadding))
.attr("height", (lbbox.height + 2 * legendPadding))
.attr("width", (lbbox.width + 2 * legendPadding));
});
return g;
}
// define legend svg
let padding = 20;
let legx = radius + padding;
let legendSVG = d3.select('.enrolled-statistics').append('svg')
.attr('width', 150)
.attr('height', 150)
.append('g')
.attr('class', 'legend')
.attr('transform', 'translate(' + legx + ', 0)')
.style('font-size', '12px')
.style('fill', 'blue')
.call(d3.legend);
return(....)
}
最佳答案
您正在使用箭头函数来定义 each
回调。这会更改 this
关键字的范围更多信息 here )。所以基本上 d3.select(this) 不会选择您期望的内容。另外,您在两种不同的方法中使用 g
作为变量,这可能会导致意外的行为(我认为;我建议使用不同的名称来创建变量以避免混淆)。
关于node.js - 使用 `d3.legend` 时出错 : Uncaught TypeError: node. getAttribute 不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48015265/
我正在为 ggpubr 中的图例位置而苦苦挣扎。我知道我可以修改图例位置 p.e.通过 ggpar(legend = "bottom")。但是,如何将图例标题放在图例键上方? 在 ggplot2 中,
SMF foo tax foo 我有一个来自网页的 html 源代码,上面给出了其中的一部分。现在我想获取 HREF仅当 tax 时的值?所
我想知道是否可以在页眉中插入图例。这样,图例也可以具有与整个文档相关的层次结构。 我在下面有更多相关的文字,但需要为读者突出显示。在这种情况下,个人信息将同时为 legend 和 h2。 h1 是站点
它们似乎都有效,并且都用于 https://matplotlib.org/users/legend_guide.html 中的示例中,尽管 plt.legend 在那里更常见。什么时候应该使用它们?
我无法更改图中分割图例的颜色。我需要两种不同的颜色作为图例和视觉图中的文本。 er<- ggmap(sq_map2) + geom_point(data = sisquoc, size
不幸的是,这件事有多长,我没有办法解决它,因为我没有 build 它,但基本上我要做的就是确保这些值设置为两个小数点,无论它。如果是 100,我希望它读取 100.00,这似乎是我遇到的问题。本节的代
目前,互联网上还没有使用 dc.js 和 dc.legend() 函数实现具有图例的气泡图的示例。 that.sessions_scatterplot .width(830)
我需要 PieChart 中的垂直图例。现在库仅提供 2 个选项:顶部/右侧。如果使用正确 - 图例在几列中。我需要一列中的图例。 我发现了一个 hack - 正确的变换值并将图例放在一列中。 v
将多个黄砖图表放入子图排列时遇到问题。标题和图例仅显示最后一个图表。我尝试了多种编写代码的方法,但无法让所有方法都显示图例和标题。我敢肯定,上类很简单。 这是一段代码: f, ((ax1, ax2),
下面的树状图有两个级别。我想显示顶级节点(节点 A 和节点 B)的图例。对于我使用过的其他类型的图表,图例可以自动生成,也可以明确定义。使用树状图,看起来一个不是自动生成的,如果我明确定义一个,它永远
我们已经使用 jqPlot 实现了 donut chart 。 我们如何将图例添加到 donut chart 的中心? 在此先感谢您的帮助。 最佳答案 根据 jqPlot 文档的建议:jqplot d
我想去掉图例中名称和百分比之间的空格。在图片中,我用黄色突出显示了空间。 例如,我希望第一个图例项是“立陶宛 (30.5%)”。 “立陶宛”和“30.5%”之间的额外空格破坏了我的用户界面。 我的图例
我正在尝试将 AmChart 图表图例合并为一行,但运气不佳。图例是分开的(一个代表一行)。 文档 http://docs.amcharts.com/3/javascriptcharts/AmLege
有人知道是否可以在 Grafana 中定义自定义图例值吗? 来自documentation ,有一些可能的功能: Legend Values Additional values can be show
我需要一个从字典生成数据的代码的图例。我不知道字典中有多少键有没有办法对此进行“动态”图例? import matplotlib.pyplot as plt for host in d.keys():
我有一个 fieldset 工作 - 这是代码: Signed In Users (2
当我将以下样式应用于图例标签时 display: inline; width: 300px; 我看到图例标签的宽度为 300px 它仍然接受宽度。 Here是一个演示。这个元素有什么特别之处吗,因为我
这个问题在这里已经有了答案: Matplotlib: figlegend only printing first letter (2 个回答) pyplot legend label being tr
我有这个代码: List legends = new ArrayList<>(lineChart.lookupAll("Label.chart-legend-item")); Legend legen
我的数据是这样的: service,rating_1,rating_2,rating_3,rating_4,rating_5 renew_patent,0,0,1,2,11 apply_benefit
我是一名优秀的程序员,十分优秀!