2013-12-16 2 views
16

Я использую Rickshaw (основанный на d3.js) для построения диаграмм сгруппированных гистограмм. Проблема в том, что первый бар обычно намного выше, чем другие, что приводит к нарушению визуальной обратной связи. bar chart with bad proportionsКак применить горизонтальный разрыв к гистограмме d3.js

Использование логарифмической шкалы (я думаю) не вариант здесь, потому что тогда пропорции между стеками в баре будут сломаны. Я хотел ввести горизонтальный перерыв, как на следующем изображении: Bar chart with horizontal break

Однако я не могу найти какую-либо особенность Rickshaw или d3.js, чтобы сделать что-то вроде этого. Любые предложения о том, как их создать?

ответ

6

Для этого потребуется немало дополнительной работы. Вот схема того, что вам нужно будет сделать.

  • Создайте две шкалы, одну для нижней и одну для верхней. Установите соответствующие домены и диапазоны.
  • Передайте значения в нижнюю шкалу, укорачивая их при максимальном значении домена, чтобы полосы, которые больше, достигли максимума.
  • Передайте значения в верхнюю шкалу, фильтруя те, которые ниже минимального.

Вам необходимо создать два графика, которые выровнены друг с другом, чтобы создать впечатление, что есть только один. Если вы это помните, делать это не должно быть слишком сложно.

Вот быстрый и грязный proof of concept, который использует линейную шкалу .clamp(true), чтобы предотвратить заторможенность баров для значений вне домена.

+0

Это, кажется, правильный способ сделать это. – cuckovic

+1

Имеет смысл. [Вот альтернатива] (http://jsfiddle.net/9xbgT/2/), используя единый масштаб - вместо 'upper' и' lower'. В одиночном масштабе я имею в виду «var fullScale = d3.scale.linear(). Domain ([0,5,15,30]). Range ([280,180,160,0]). Это позволяет рисовать диаграмму с одним прямоугольником на каждый стержень и одной осью Y. Затем накладывают символы разрыва, чтобы штрихи и ось выглядели сегментированными. – meetamit

+0

Спасибо, я пробовал этот подход, и он работает, но требует довольно некоторой сантехники. В конце концов я принял другой подход, который отлично работает в моем случае и его легче развить. Тем не менее, ваш ответ решает вопрос. – kciesielski

1

d3fc-discontinuous-scale component адаптирует любую другую шкалу (например, линейную шкалу d3) и добавляет понятие разрывов. Эти разрывы определяются с помощью «поставщика прерываний», который может быть использован для создания одного или нескольких «зазоров» в масштабе.

Например, чтобы удалить диапазон, можно построить шкалу следующим образом:

var scale = scaleDiscontinuous(scaleLinear()) 
    .discontinuityProvider(discontinuityRange([50, 75])) 

Вот полный пример, который показывает, как использовать это, чтобы создать «перерыв» в масштабе, с тем чтобы выведите значения, имеющие большие пробелы в их общем диапазоне.

https://bl.ocks.org/ColinEberhardt/b60919a17c0b14d745c881f48effe681