将累积百分比线拟合到排序的直方图输出,使用 d3 获得帕累托图直方图
Fit the cumulative percentage line to the sorted histogram output with d3 for a pareto chart histogram
这是我到目前为止所拥有的:https://gist.github.com/daluu/fc1cbcab68852ed3c5fa 和 http://bl.ocks.org/daluu/fc1cbcab68852ed3c5fa。我正在尝试复制 Excel 功能。
该线与基本/原始直方图 http://bl.ocks.org/daluu/f58884c24ff893186416 一样适合默认直方图。我能够按降序频率对直方图进行排序,尽管这样做时,我切换了 x 刻度(从线性到有序(。此时,我似乎无法将线正确映射到排序的直方图。就视觉表示而言,它应类似于以下示例:
- 上面引用的我的要点注释中的 Excel 屏幕截图
- 帕累托图在此SO帖子中排序的直方图
- 此处使用 D3 制作的帕累托图(类似于但不完全是排序直方图(
让剩余部分工作的最佳设计方法是什么?我应该从单个 x 刻度开始,而不需要从线性切换到有序吗?如果是这样,我不确定如何使用序数刻度正确应用直方图布局,或者如何不使用线性 x 刻度作为直方图布局的输入源,但仍能获得所需的输出。
与我到目前为止的代码使用相同的序数比例,这条线看起来不错,但这不是我期望看到的曲线。
任何帮助表示赞赏。
该线的主要问题是,在对条形进行排序后,需要重新计算累积分布,或者如果您要使用静态帕累托图,则需要按目标排序顺序计算累积分布。为此,我创建了一个小函数来执行此计算:
function calcCDF(data){
data.forEach(function(d,i){
if(i === 0){
d.cum = d.y/dataset.length
}else{
d.cum = (d.y/dataset.length) + data[i-1].cum
}
})
return data
}
就我而言,我每次都打开/关闭帕累托排序并重新计算 d.cum 属性。理论上可以创建两个累积 dist 属性;即 d.cum 用于常规有序分布,并说 d.ParetoCum 用于排序的累积,但我在工具提示上使用 d.cum 并决定反对。
根据轴,我使用的是单个序数刻度,我认为它更干净,但需要一些工作才能使标签对数字范围有意义,因为刻度线和标签不再像线性刻度那样描绘箱。我在这里的解决方案是仅使用数字范围作为刻度线,例如"1 - 1.99"并向备用刻度线添加一个函数(不久前从 d3.js 中的交替刻度填充中得到了该解决方案(。
对于条形排序,我使用此 d3 示例作为参考,以防您需要在更简单/更小的示例上下文中理解。
请参阅包含上述所有内容的小提琴。如果你想使用它,我建议添加一个检查以避免用户能够切换条形和行(在代码中留下注释......应该是微不足道的(
而不是对y进行排序。
data.sort(function(a,b){ return b.y - a.y;});
你应该对 x 进行排序
data.sort(function(a,b){ return a.x - b.x;});
此处的工作代码
- d3 可重复使用的直方图
- 根据已经给定的频率创建一个d3.js直方图
- d3.js-是否可以在没有.map的情况下绘制和直方图
- 将累积百分比线拟合到排序的直方图输出,使用 d3 获得帕累托图直方图
- 带有时间刻度的 D3 直方图
- 访问 D3 直方图箱中对象的属性
- 使用d3域调用更改dc直方图的bucket
- 缩放d3's直方图x域导致“;<的负值无效;rect>属性“;错误
- d3.js直方图不显示列
- D3.js水平直方图
- 在D3直方图中没有显示网格线
- 用D3动画直方图
- D3.js直方图bin大小增量
- d3.js:直方图不呈现,如果域不是以0开始(表示[0,*])
- D3.js直方图不能与每个箱子的总频率数组一起工作
- D3时间和日期直方图
- 来自 Elasticsearch 输出的 D3 日期直方图
- 在直方图上画一条线 - D3
- 向直方图添加数据标签所需的帮助 - d3
- D3将直方图粘在轴上