D3.js:范围而非点时间轴标签

D3.js:范围而非点时间轴标签,d3.js,axis-labels,D3.js,Axis Labels,我有一个每天都有数据点的图表,但我不满意x轴的默认设置 默认x轴选择要标记的点,例如使用xAxis.ticks(d3.time.month)它将在每个月的第一天标记该月的名称: |-------|-------|-------|-------|-------|-------| nov dec jan feb mar apr may 这适用于条形图,其中上述每个月只有一个条形图,但对于面积图来说,这是误导性的,例如,11月28日、29日和30

我有一个每天都有数据点的图表,但我不满意x轴的默认设置

默认x轴选择要标记的点,例如使用
xAxis.ticks(d3.time.month)它将在每个月的第一天标记该月的名称:

  |-------|-------|-------|-------|-------|-------|
 nov     dec     jan     feb     mar     apr     may
这适用于条形图,其中上述每个月只有一个条形图,但对于面积图来说,这是误导性的,例如,11月28日、29日和30日的数据点下会出现'dec'中的'd'

我希望它标记月份覆盖的范围(刻度之间的间隔):


在高级别中指定这个简单的方法?

使它们出现在范围的中间,您需要向代码< >文本< /C>元素中添加偏移量(dx)。这个偏移量将等于一个区间大小的一半,您可以动态计算


这是一个非常类似的事情。

为了使它们出现在范围的中间,你需要在代码< >文本< /C>元素中添加一个偏移量(DX)。这个偏移量将等于一个区间大小的一半,您可以动态计算


这是一个类似的例子。

我也遇到了同样的问题,通过使用另一个X轴刻度解决了这个问题,这个刻度移动了15天

// scale is your usual x scale. change dates on the domain by 15 days
var d0 = scale.domain()[0];
d0.setDate(d0.getDate() - 15);
var d1 = scale.domain()[1];
d1.setDate(d1.getDate() - 15);

// use this new x scale for the axis only
new_scale = d3.time.scale().domain([d0, d1]).range(scale.range());
d3.svg.axis().scale(new_scale);

这样你就没有了笨拙的文字转换,仍然把所有繁重的工作留给d3。为了显示刻度,您可以使用第二个x轴和正常刻度。

我也遇到了同样的问题,并通过使用另一个x轴刻度解决了这个问题,该刻度移动了15天

// scale is your usual x scale. change dates on the domain by 15 days
var d0 = scale.domain()[0];
d0.setDate(d0.getDate() - 15);
var d1 = scale.domain()[1];
d1.setDate(d1.getDate() - 15);

// use this new x scale for the axis only
new_scale = d3.time.scale().domain([d0, d1]).range(scale.range());
d3.svg.axis().scale(new_scale);
这样你就没有了笨拙的文字转换,仍然把所有繁重的工作留给d3。为了显示刻度,您可以使用第二个x轴和正常刻度。

(2019)使用最新的d3v5、其他stackoverflow响应和

首先给出
x_比例
ticks数量
,可以计算所有ticks的渲染像素距离,包括非线性比例。下面的函数返回一个带有刻度距离/空格的数组

// ticksDistance is constant for a specific x_scale
// apply scale to ticks and calcule distance
const getTicksDistance = (scale) => {
      const ticks = scale.ticks(); // return array with ticks
      const spaces = []
      for(let i=0; i < ticks.length - 1; i++){
        spaces.push(scale(ticks[i+1]) - scale(ticks[i]))
      }
      return spaces;
};
const ticksSpacingTime = getTicksDistance(x_scale_time);
const x_scale_time=d3.scaleTime()
.domain([新日期(2017年12月1日),新日期()
.范围([0960]);
常数x_axis_time=d3.axisBottom()
.scale(x_scale_time)
.滴答声(d3.时间月。每(1)次)
常数x_scale_pow=d3.scalePow()指数(2)
.domain([020000])
.范围([0960]);
常数x_axis_pow=d3.axisBottom()
.scale(x_scale_pow)
.滴答声(10)
//对于特定的x_刻度,滴答距离是恒定的
const getTicksDistance=(比例)=>{
const ticks=scale.ticks();
常量空间=[]
for(设i=0;i滴答声静置时间[i]/2)
//正常的
svg.append(“g”)
.attr(“类”、“x轴”)
.attr(“转换”、“翻译(0110)”)
.呼叫(x轴功率)
//将标签移动到刻度距离的一半
svg.append(“g”)
.attr(“类”,“x轴移动”)
.attr(“转换”、“翻译(0150)”)
.呼叫(x轴功率)
.selectAll(“文本”)
.attr(“x”,(d,i)=>tickspacingpow[i]/2)
(2019)使用最新的d3v5、其他堆栈溢出响应,以及

首先给出
x_比例
ticks数量
,可以计算所有ticks的渲染像素距离,包括非线性比例。下面的函数返回一个带有刻度距离/空格的数组

// ticksDistance is constant for a specific x_scale
// apply scale to ticks and calcule distance
const getTicksDistance = (scale) => {
      const ticks = scale.ticks(); // return array with ticks
      const spaces = []
      for(let i=0; i < ticks.length - 1; i++){
        spaces.push(scale(ticks[i+1]) - scale(ticks[i]))
      }
      return spaces;
};
const ticksSpacingTime = getTicksDistance(x_scale_time);
const x_scale_time=d3.scaleTime()
.domain([新日期(2017年12月1日),新日期()
.范围([0960]);
常数x_axis_time=d3.axisBottom()
.scale(x_scale_time)
.滴答声(d3.时间月。每(1)次)
常数x_scale_pow=d3.scalePow()指数(2)
.domain([020000])
.范围([0960]);
常数x_axis_pow=d3.axisBottom()
.scale(x_scale_pow)
.滴答声(10)
//对于特定的x_刻度,滴答距离是恒定的
const getTicksDistance=(比例)=>{
const ticks=scale.ticks();
常量空间=[]
for(设i=0;i滴答声静置时间[i]/2)
//正常的
svg.append(“g”)
.attr(“类”、“x轴”)
.attr(“转换”、“翻译(0110)”)
.呼叫(x轴功率)
//将标签移动到刻度距离的一半
svg.append(“g”)
.attr(“类”,“x轴移动”)
.attr(“转换”、“翻译(0150)”)
.呼叫(x轴功率)
.selectAll(“文本”)
.attr(“x”,(d,i)=>tickspacingpow[i]/2)
类似于什么?如果要移动,也可以调整
dx