需要帮助了解规模
Need help in understanding Scale
我正在使用 dc.js 库创建复合图表。这是我的图表设置:
chartCountMonths
.height(350)
.x(d3.scaleTime())
.xUnits(d3.timeMonths)
.legend(dc.legend().x(80).y(20).itemHeight(13).gap(5))
.elasticX(true)
.elasticY(true)
.brushOn(false)
.compose([chartCurrentYear,chartPreviousYear]);
chartCurrentYear
.dimension(monthDim)
.colors('orange')
.dashStyle([10, 2])
.title(function (d) { var t = yearCurrent + ": " + numFormat(d.value.current) + '\n' + yearPrev + ": " + numFormat(d.value.previous); return t })
.group(monthGroupByYear, "Year " + yearCurrent)
.valueAccessor(function (d) { return d.value.current })
chartPreviousYear
.dimension(monthDim)
.colors('green')
.title(function (d) { var t = yearCurrent + ": " + numFormat(d.value.current) + '\n' + yearPrev + ": " + numFormat(d.value.previous); return t })
.group(monthGroupByYear, "Year " + yearPrev)
.valueAccessor(function (d) { return d.value.previous });
令我抓狂的是我不完全理解 d3 / dc.js 的缩放比例。上面的代码呈现的是这样的:
我使用 reduceAdd、reduceRemove、reduceInitial 创建的对象是这样的:
[
{"key":"07","value":{"current":900,"previous":963}},
{"key":"08","value":{"current":779,"previous":577}},
{"key":"09","value":{"current":457,"previous":651}},
{"key":"10","value":{"current":0,"previous":646}},
{"key":"11","value":{"current":0,"previous":621}},
{"key":"12","value":{"current":0,"previous":1}},
{"key":"06","value":{"current":1016,"previous":827}}
]
所以我想我不知道如何让这个秤发挥作用。我只是尝试使用比例方法,直到有效果为止。
任何人都可以指出我的解决方案,并给我链接以了解一般的规模吗?我发誓我花在计算缩放比例(xUnits() 和 .x)上的时间比这个库的任何其他部分都多 :)
仅供参考:密钥来自 d.Month,其中我使用 d3.timeFormat("%m") 将日期格式化为两位数的月份。
我试图让 tickFormat()
工作,但 d3.time.format("%B")
产生了错误
Uncaught TypeError: n.getMonth is not a function
这是代码笔:https://codepen.io/jlbmagic/pen/QWEEpOB
谢谢
正如我们在评论中讨论的那样,处理日期并知道何时应该使用数字或字符串来代替确实令人困惑。
您 运行 遇到的具体问题是
overviewComposite.xAxis().tickFormat(d3.time.format("%B"));
这会崩溃,因为 X 值是字符串(序数)'01'
、'02'
...
如果您使用时间刻度,那么您的所有数据和访问器都将使用日期,但我认为这里最好手动将数字映射回月份:
const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Nov', 'Dec'];
overviewComposite.xAxis().tickFormat(m => monthNames[+m - 1]);
(+m
将字符串转换为数字。-1 是因为月份从 1 开始编号。)
我正在使用 dc.js 库创建复合图表。这是我的图表设置:
chartCountMonths
.height(350)
.x(d3.scaleTime())
.xUnits(d3.timeMonths)
.legend(dc.legend().x(80).y(20).itemHeight(13).gap(5))
.elasticX(true)
.elasticY(true)
.brushOn(false)
.compose([chartCurrentYear,chartPreviousYear]);
chartCurrentYear
.dimension(monthDim)
.colors('orange')
.dashStyle([10, 2])
.title(function (d) { var t = yearCurrent + ": " + numFormat(d.value.current) + '\n' + yearPrev + ": " + numFormat(d.value.previous); return t })
.group(monthGroupByYear, "Year " + yearCurrent)
.valueAccessor(function (d) { return d.value.current })
chartPreviousYear
.dimension(monthDim)
.colors('green')
.title(function (d) { var t = yearCurrent + ": " + numFormat(d.value.current) + '\n' + yearPrev + ": " + numFormat(d.value.previous); return t })
.group(monthGroupByYear, "Year " + yearPrev)
.valueAccessor(function (d) { return d.value.previous });
令我抓狂的是我不完全理解 d3 / dc.js 的缩放比例。上面的代码呈现的是这样的:
我使用 reduceAdd、reduceRemove、reduceInitial 创建的对象是这样的:
[
{"key":"07","value":{"current":900,"previous":963}},
{"key":"08","value":{"current":779,"previous":577}},
{"key":"09","value":{"current":457,"previous":651}},
{"key":"10","value":{"current":0,"previous":646}},
{"key":"11","value":{"current":0,"previous":621}},
{"key":"12","value":{"current":0,"previous":1}},
{"key":"06","value":{"current":1016,"previous":827}}
]
所以我想我不知道如何让这个秤发挥作用。我只是尝试使用比例方法,直到有效果为止。 任何人都可以指出我的解决方案,并给我链接以了解一般的规模吗?我发誓我花在计算缩放比例(xUnits() 和 .x)上的时间比这个库的任何其他部分都多 :)
仅供参考:密钥来自 d.Month,其中我使用 d3.timeFormat("%m") 将日期格式化为两位数的月份。
我试图让 tickFormat()
工作,但 d3.time.format("%B")
产生了错误
Uncaught TypeError: n.getMonth is not a function
这是代码笔:https://codepen.io/jlbmagic/pen/QWEEpOB
谢谢
正如我们在评论中讨论的那样,处理日期并知道何时应该使用数字或字符串来代替确实令人困惑。
您 运行 遇到的具体问题是
overviewComposite.xAxis().tickFormat(d3.time.format("%B"));
这会崩溃,因为 X 值是字符串(序数)'01'
、'02'
...
如果您使用时间刻度,那么您的所有数据和访问器都将使用日期,但我认为这里最好手动将数字映射回月份:
const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Nov', 'Dec'];
overviewComposite.xAxis().tickFormat(m => monthNames[+m - 1]);
(+m
将字符串转换为数字。-1 是因为月份从 1 开始编号。)