【发布时间】:2018-05-30 09:38:46
【问题描述】:
使用 D3(v4,升级到 v5 也是一种选择),我正在为时间间隔绘制时间序列。数据的持续时间未知,通常为几秒,并且我们有一个开始日期戳和一个结束日期戳。
我目前生成 x 轴的方法是这样的,其中 startTime 和 endTime 是数字时间戳,width 和 height 是数字,xAxisGroupSelection 是 D3 选择:
const xScale = d3.scaleTime()
.domain([0, startTime - endTime)
.range([0, width])
const xAxis = d3.axisBottom()
.scale(this.xScale)
xAxisGroupSelection
.attr('transform', `translate(0, ${height})`)
.call(xAxis)
它做得很好,它为数字提供了合理的格式。例如,它设置像:01 这样的秒数和像.500 这样的毫秒数,如果我得到一个持续几分钟或几小时的相当长的间隔,它会处理它。
问题在于,由于它读取的是 0 时间戳,因此它会在配置文件的开头添加一个 1970 年份标签。这当然是0 时间戳的正确年份,但我不希望它在时间序列的秒内显示任何 年。有什么方法可以使用 D3 配置我可以保持默认时间格式,但不能为年(或月、日等)添加刻度?
<g class="axis-group x-axis" transform="translate(0, -12)" fill="none" font-size="10" font-family="sans-serif" text-anchor="middle">
<path class="domain" stroke="#000" d="M0.5,2V0.5H0.5V2"></path>
<g class="tick" opacity="1" transform="translate(0.5,0)">
<line stroke="#000" y2="2"></line>
<text fill="#000" y="5" dy="0.71em">1970</text> <!-- <=== -->
</g>
<g class="tick" opacity="1" transform="translate(0.5,0)">
<line stroke="#000" y2="2"></line>
<text fill="#000" y="5" dy="0.71em">.500</text>
</g>
<g class="tick" opacity="1" transform="translate(0.5,0)">
<line stroke="#000" y2="2"></line>
<text fill="#000" y="5" dy="0.71em">:01</text>
</g>
<g class="tick" opacity="1" transform="translate(0.5,0)">
<line stroke="#000" y2="2"></line>
<text fill="#000" y="5" dy="0.71em">.500</text>
</g>
显然,我可以通过多种迂回方式删除或修改它,从使用 CSS 第一子规则隐藏它到在 D3 中手动选择它并修改它的值,但我想知道是否可以这样做在 使用 D3 比例/轴/格式/时间 API 的简洁方式。
我可以告诉 D3 的轴刻度生成器忽略大于分钟的时间单位吗?我已经通过the docs for D3 time scales 但找不到任何东西。我认为使用Time.range(), but the docs aren't giving me many clues on how 可能是可能的。
更新:看来我需要创建一个自定义函数来传递给.tickFormat(),类似于this example,但复制了默认时间格式化程序,并在条件中添加了一个截止点逻辑。那么下一个问题:我在哪里可以找到默认的 D3 时间格式逻辑...
【问题讨论】:
标签: d3.js