2017-09-14 10 views
2

私はx軸で作業していますが、他の場所で設定された間隔変数に従って軸の目盛りを整形します。これは文字列( 'decade'、 'lustrum'、 'years'、daysなど)です。私はそれが一般的に仕事をして働いている。以下は、17/8/19198〜24/08/1717の間の日付範囲の例であり、光沢(5年)の間隔があります。間隔に応じて変化するティックラベルのないセカンダリ(マイナー)軸があります。私はハウススタイルにいくつかのフォーマットを追加しました。 例d3時間軸の先頭の余分な目盛りを追加

enter image description here

私がいる問題は、私は、我々は常に最初の日付をマークとして、それは家のスタイルを一致するように、長軸の先頭に余分な目盛りを追加したいということです。私は.nice()を使用しましたが、最後に目盛りを追加しました。また、軸の次の丸められた増分がデフォルトになります。したがって、2009年にチャートが開始され、10年の間隔がある場合、.niceは私は)それは軸の目盛りの配列をaccesingと(ドメインをunshiftingと同じくらい簡単だろうと思った

:チャートは前に私が達成したいと思うパートナーはどのようなダメ

されていない2000年にこの enter image description here彼です[0]値はゼロの位置になります。しかし、それは動作していないようです。私は実際にテスト変数にそれらを配置するとき、ティックにアクセスするように見えません。私が戻ってくるのは、2年ごとの日付スケールです。

任意のポインタをいただければ幸いです、ありがとう

は、これは私が持っているコードです:

function xaxisDate() { 
    let mindate = new Date(1970, 1, 1); 
    let maxdate = new Date(2017, 6, 1); 
    let scale = d3.scaleTime() 
     .domain([mindate, maxdate]) 
     .range([0, 220]); 
    let frameName; 
    let interval = 'lustrum'; 
    let minorAxis = true; 
    let tickSize = 10; 
    let minorTickSize = 5; 
    let fullYear = false; 
    let align = 'bottom'; 
    let xLabel; 
    let xLabelMinor; 

    function axis(parent) { 
     //scale.nice(getTicks(interval)) 
     function getAxis(alignment) { 
      return { 
       top: d3.axisTop(), 
       bottom: d3.axisBottom(), 
      }[alignment]; 
     } 

     const xAxis = getAxis(align) 
      .tickSize(tickSize) 
      .ticks(getTicks(interval)) 
      .tickFormat(tickFormat(interval)) 
      .scale(scale) 

     test = scale.ticks() 
     console.log('before',test); 

     // console.log('domain',scale.domain()[0]) 
     // scale.ticks().unshift(scale.domain()[0]); 
     // console.log('after',scale.ticks()) 
     // xAxis.tickValues() 

     const xMinor = d3.axisBottom() 
      .tickSize(minorTickSize) 
      .ticks(getTicksMinor(interval)) 
      .tickFormat('') 
      .scale(scale); 

     xLabel = parent.append('g') 
      .attr('class', 'axis xAxis axis baseline') 
      .call(xAxis); 

     if (minorAxis) { 
      xLabelMinor = parent.append('g') 
       .attr('class', (d) => { 
        const plotHeight = d3.select('.chart-plot').node().getBBox().height; 
        if (plotHeight === tickSize) { 
         return 'axis xAxis'; 
        } 
        return 'axis xAxis axis baseline'; 
       }) 
       .call(xMinor); 
     } 

     if (frameName) { 
      xLabel.selectAll('.axis.xAxis text') 
      .attr('id', frameName + 'xLabel'); 
      xLabel.selectAll('.axis.xAxis line') 
      .attr('id', frameName + 'xTick'); 
      if (minorAxis) { 
       xLabelMinor.selectAll('.axis.xAxis line') 
       .attr('id', frameName + 'xTick'); 
      } 
     } 

     xLabel.selectAll('.domain').remove(); 
    } 

    function getTicks(interval) { 
     console.log('interval',interval) 
     return { 
      'century' : d3.timeYear.every(100), 
      'jubilee': d3.timeYear.every(50), 
      'decade': d3.timeYear.every(10), 
      'lustrum': d3.timeYear.every(5), 
      'years': d3.timeYear.every(1), 
      'quarters': d3.timeMonth.every(3), 
      'months': d3.timeMonth.every(1), 
      'weeks': d3.timeWeek.every(1), 
      'days': d3.timeDay.every(1), 
      'hours': d3.timeHour.every(1) 
     }[interval]; 
    } 
    function getTicksMinor(interval) { 
     const test = d3.timeYear.every(1); 
     console.log('test', test) 
     return { 
      'century': d3.timeYear.every(10), 
      'jubilee': d3.timeYear.every(10), 
      'decade': d3.timeYear.every(1), 
      'lustrum': d3.timeYear.every(1), 
      'years': d3.timeMonth.every(1), 
      'quarters': d3.timeMonth.every(1), 
      'months': d3.timeDay.every(1), 
      'weeks': d3.timeDay.every(1), 
      'days': d3.timeHour.every(1), 
      'hours': d3.timeMinute.every(1) 
     }[interval]; 
    } 

    function tickFormat(interval) { 
     let formatFullYear = d3.timeFormat('%Y'), 
     formatYear = d3.timeFormat('%y'), 
     formatMonth = d3.timeFormat('%b'), 
     formatWeek = d3.timeFormat('%W'), 
     formatDay = d3.timeFormat('%d'), 
     formatHour = d3.timeFormat('%H:%M'); 
     return { 
      'century': d3.timeFormat('%Y'), 
      'jubilee': function(d, i) { 
       const format = checkCentury(d, i); 
       return format; 
      }, 
      'decade': function(d, i) { 
       const format = checkCentury(d, i); 
       return format; 
      }, 
      'lustrum':function(d, i) { 
       const format = checkCentury(d, i); 
       return format; 
      }, 
      'years': function(d, i) { 
       const format = checkCentury(d, i); 
       return format; 
      }, 
      'quarters':function(d, i) { 
       const format = getQuarters(d, i); 
       return format; 
      }, 
      'months': function(d, i) { 
       const format = checkMonth(d, i); 
       return format; 
      }, 
      'weeks':function(d, i) { 
       const format = getWeek(d, i); 
       return format; 
      }, 
      'days':function(d, i) { 
       const format = getDays(d, i); 
       return format; 
      }, 
      'hours': function(d, i) { 
       const format = getHours(d, i); 
       return format; 
      }, 
     }[interval]; 

     function getHours(d, i) { 
      if (d.getHours() === 1 || i === 0) { 
       return formatHour(d) + ' ' + formatDay(d); 
      } 
      return formatHour(d); 
     } 

     function getDays(d, i) { 
      if (d.getDate() === 1 || i === 0) { 
       return formatDay(d) + ' ' + formatMonth(d); 
      } 
      return formatDay(d); 
     } 

     function getWeek(d, i) { 
      if (d.getDate() < 9) { 
       return formatWeek(d) + ' ' + formatMonth(d); 
      } 
      return formatWeek(d); 
     } 

     function getQuarters(d, i) { 
      if (d.getMonth() < 3 && i < 4) { 
       return 'Q1 ' + formatFullYear(d); 
      } 
      if (d.getMonth() < 3) { 
       return 'Q1'; 
      } 
      if (d.getMonth() >= 3 && d.getMonth() < 6) { 
       return 'Q2'; 
      } 
      if (d.getMonth() >= 6 && d.getMonth() < 9) { 
       return 'Q3'; 
      } 
      if (d.getMonth() >= 9 && d.getMonth() < 12) { 
       return 'Q4'; 
      } 
     } 

     function checkMonth(d, i) { 
      if (d.getMonth() === 0 || i === 0) { 
       const newYear = d3.timeFormat('%b %Y'); 
       return newYear(d); 
      } 
      return formatMonth(d); 
     } 

     function checkCentury(d, i) { 
      if (fullYear || (+formatFullYear(d) % 100 === 0) || (i === 0)) { 
       return formatFullYear(d); 
      } 
      return formatYear(d); 
     } 
    } 
    axis.align = (d) => { 
     align = d; 
     return axis; 
    }; 
    axis.frameName = (d) => { 
     if (d === undefined) return frameName; 
     frameName = d; 
     return axis; 
    }; 
    axis.scale = (d) => { 
     scale = d; 
     return axis; 
    }; 
    axis.domain = (d) => { 
     scale.domain(d); 
     return axis; 
    }; 
    axis.range = (d) => { 
     scale.range(d); 
     return axis; 
    }; 

    axis.fullYear = (d) => { 
     if (d === undefined) return fullYear; 
     fullYear = d; 
     return axis; 
    }; 
    axis.interval = (d) => { 
     interval = d; 
     return axis; 
    }; 
    axis.tickSize = (d) => { 
     if (!d) return tickSize; 
     tickSize = d; 
     return axis; 
    }; 
    axis.minorTickSize = (d) => { 
     if (!d) return minorTickSize; 
     minorTickSize = d; 
     return axis; 
    }; 
    axis.minorAxis = (d) => { 
     if (d === undefined) return minorAxis; 
     minorAxis = d; 
     return axis; 
    }; 
    axis.xLabel = (d) => { 
     if (d === undefined) return xLabel; 
     xLabel = d; 
     return axis; 
    }; 
    axis.xLabelMinor = (d) => { 
     if (d === undefined) return xLabelMinor; 
     xLabelMinor = d; 
     return axis; 
    }; 
    return axis; 

答えて

0

答えはtickValuesです。その後、ティック配列の値を返す必要があり、私はドメイン[0]値をunshifetと考えていました。 xAxisを設定したら、次のものを挿入する必要があります。

let newTicks = scale.ticks(getTicks(interval)) 
     newTicks.unshift(scale.domain()[0]); 
     xAxis.tickValues(newTicks) 
関連する問題