как начать метку оси с нуля?

1

Я пытаюсь рисовать ось x с метками с использованием d3.js, у меня есть массив данных лет с 1950 по 2015 год, я намерен строить их по оси x, начиная с года 0, но мой код выводит ось x который начинается с минимального значения массива, если отредактируйте массив с 0 как минимальное значение, тогда метки меток x меняются. Любой намек на то, где я делаю неправильно?

что мой код выводит: 1950... 1955.... 1960

выход, когда включен год 0, что не то, что я хочу: 0.... 200.... 400.......... 2015

что я намерен вывести: 0.... 1950.... 1955....

ссылка на codepen

   $.getJSON(
      "https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/GDP-data.json",
      function(x) {
        var rawData = x.data;
        var yearData = [];
        var gdpData = [];
        var width = 1020;
        var height = 100;
        for (var i = 0; i < rawData.length; i++) {
          yearData.push(rawData[0][0]);
          gdpData.push(rawData[1][1]);
        }

        //values which should be labeled on x-axis
        var years = [
          1950,
          1955,
          1960,
          1965,
          1970,
          1980,
          1985,
          1990,
          2000,
          2005,
          2010,
          2015
        ];
        var svg = d3
        .select("body")
        .append("svg")
        .attr("width", width)
        .attr("height", height)
        .append('g');


        var x_domain = d3.extent(years, function(d) {
          return d;
        });

        var xscale = d3
        .scaleLinear()
        .domain(x_domain)
        .nice()
        .range([20, 600]);

        var x_axis = d3
        .axisBottom()
        .scale(xscale)
        .ticks(11);

        svg
          .append("g")
          .call(x_axis);

      }
    );
  • 0
    Хотите масштабировать? Потому что, если у вас есть диапазон 0..2015, эти годы в вашем списке будут довольно тесными справа. Или вы хотите, чтобы он "немного пропустил" посередине?
  • 0
    ось должна начинаться с 0, а следующее значение должно быть 1950, 1955 , ... 2015 и т. д. 0 .... 1950 ... 1955 .... 1960 ............ 2015 - это Есть ли способ пометить галочки прямо из значений массива без масштабирования?
Показать ещё 2 комментария
Теги:
d3.js

1 ответ

1
Лучший ответ

Основываясь на ваших комментариях, то, что вы ищете, это шкала Point вместо Linear шкалы и включает значение 0 в вашем массиве.

Вы можете использовать массив years непосредственно, так как domain и шкала точек будут по умолчанию использовать эти значения для tickValues.

$.getJSON(
      "https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/GDP-data.json",
      function(x) {
        var rawData = x.data;
        var yearData = [];
        var gdpData = [];
        var width = 1020;
        var height = 100;
        for (var i = 0; i < rawData.length; i++) {
          yearData.push(rawData[0][0]);
          gdpData.push(rawData[1][1]);
        }

        //values which should be labeled on x-axis
        var years = [0, // including the 0
          1950,1955,1960,1965,1970,1980,1985,1990,2000,2005,2010,2015];
        var svg = d3
        .select("body")
        .append("svg")
        .attr("width", width)
        .attr("height", height)
        .append('g');

        var xscale = d3
        .scalePoint() // instead of Linear
        .domain(years) // can use the years array directly as domain
        .range([20,600]);

        var x_axis = d3
        .axisBottom()
        .scale(xscale);

        svg
          .append("g")
          .call(x_axis);

      }
    );
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.9.1/d3.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  • 0
    tickValues действительно полезен, когда вы просто хотите пометить значения из массива, но, как вы можете видеть в выводе, добавление 0 перекосит ось, если вы удалите 0, это работает нормально
  • 0
    хорошо, теперь я знаю, что вы ищете, я обновил ответ - должен делать то, что вам нужно
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню