WedX - журнал о программировании и компьютерных науках

Хотите дублировать ключи в гистограмме D3

Есть ли способ, чтобы повторяющиеся ключи не конфликтовали, но могу ли я иметь больше списка пар ключ-значение, где все они отображаются на моей гистограмме? Как вы делаете это, используя графики D3? Я использую версию 4.

var data = [{
    parkingLot: "A",
    numOfCars: 5
  },
  {
    parkingLot: "B",
    numOfCars: 6
  },
  {
    parkingLot: "A",
    numOfCars: 2
  },
  {
    parkingLot: "C",
    numOfCars: 3
  },
];

var series = d3.stack()
  .keys(["numOfCars"])
  .offset(d3.stackOffsetDiverging)
  (data);

var svg = d3.select("svg"),
  margin = {
    top: 20,
    right: 30,
    bottom: 120,
    left: 60
  }, //Bottom originally 30
  width = +svg.attr("width"),
  height = +svg.attr("height");

var x = d3.scaleBand()
  .domain(data.map(function(d) {
    return d.parkingLot;
  }))
  .rangeRound([margin.left, width - margin.right])
  .padding(0.1);

var y = d3.scaleLinear()
  .domain([d3.min(series, stackMin), d3.max(series, stackMax)])
  .rangeRound([height - margin.bottom, margin.top]);

var z = d3.scaleOrdinal(d3.schemeCategory10);

svg.append("g")
  .selectAll("g")
  .data(series)
  .enter().append("g")
  .attr("fill", function(d) {
    return z(d.key);
  })
  .selectAll("rect")
  .data(function(d) {
    return d;
  })
  .enter().append("rect")
  .attr("width", x.bandwidth)
  .attr("x", function(d) {
    return x(d.data.parkingLot);
  })
  .attr("y", function(d) {
    return y(d[1]);
  })
  .attr("height", function(d) {
    return y(d[0]) - y(d[1]);
  })

//With rotated x-axis labels implemented (modified from simpler original code)
svg.append("g")
  .attr("transform", "translate(0," + y(0) + ")")
  .call(d3.axisBottom(x))
  .selectAll("text")
  .style("text-anchor", "end")
  .attr("dx", "-1em") //Left right shift before rotation
  .attr("dy", "-0.5em") //Up down shift before rotation
  .attr("transform", "rotate(-90)");

svg.append("g")
  .attr("transform", "translate(" + margin.left + ",0)")
  .call(d3.axisLeft(y));

function stackMin(serie) {
  return d3.min(serie, function(d) {
    return d[0];
  });
}

function stackMax(serie) {
  return d3.max(serie, function(d) {
    return d[1];
  });
}
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
</head>

<body>
  <script src="https://d3js.org/d3.v4.min.js"></script>
  <svg id="bar-graph" width="960" height="540"></svg>
</body>

</html>

Набор данных:

      var data = [
        {parkingLot: "A", numOfCars: 5},
        {parkingLot: "B", numOfCars: 6},
        {parkingLot: "A", numOfCars: 2},
        {parkingLot: "C", numOfCars: 3},
      ];

Есть две парковки с ключом "А". Я хочу, чтобы они оба отличались друг от друга, чтобы оба отображались на графике на 1-й и 3-й позициях соответственно. Интересно, сводится ли это к типу графика, который я использую, или это можно сделать с помощью некоторых настроек кода.


  • Значения масштаба полосы должны быть уникальными. Вот возможное решение, взгляните на мой ответ: stackoverflow.com/a/55413952/5768908. Однако я не буду отмечать это как дубликат, потому что мое решение (на самом деле, любое решение в этом конкретном случае) довольно хакерское. 10.10.2019
  • @GerardoFurtado спасибо. Взлом работает в свете отсутствия правильного решения. Добавьте бессмысленные значения к ключам, а затем удалите их при отображении на оси. 15.10.2019
  • Опять же, в этом случае нет правильного решения, кроме хака. Взлом является правильным решением. 15.10.2019
  • Я удалил бессмысленное значение, которое в моем случае было добавлено, например: d.substring(d.indexOf(separator) + 1); as split будет разделять каждое вхождение разделителя, когда в строке может быть несколько вхождений. 17.10.2019

Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]