@domoinc/bars

Bars - Domo Widget

Stats

stars 🌟issues ⚠️updated 🛠created 🐣size 🏋️‍♀️
@domoinc/bars
Minified + gzip package size for @domoinc/bars in KB

Readme

Bars

Configuration Options

barPadding

Type: number
Default: 0.25

Padding between the bars

chartLabelColor

Type: color
Default: #888888

Color for chart labels

chartName

Type: string
Default: Bars

Name of chart for Reporting

chartPrimarySeriesColors

Type: colorArray
Default: #D9EBFD,#B7DAF5,#90c4e4,#73B0D7,#4E8CBA,#31689B,#DDF4BA,#BBE491,#A0D771,#80C25D,#559E38,#387B26,#FDECAD,#FCCF84,#FBAD56,#FB8D34,#E45621,#A43724,#F3E4FE,#DDC8EF,#C5ACDE,#B391CA,#8F6DC0,#7940A1,#FCD7E6,#FBB6DD,#F395CD,#EE76BF,#CF51AC,#A62A92,#D8F4DE,#ABE4CA,#8DD5BE,#68BEA8,#46998A,#227872,#FDDDDD,#FCBCB7,#FD9A93,#FD7F76,#e45850,#c92e25

The primary colors used to represent series data

color

Type: color
Default: ``

Color for the bars

colors

Type: array
Default: null

Specified colors to be used in color scale

domainOffsetPadding

Type: number
Default: 35

Multiple of the pixel ratio of to add suffienct padding to the bars and edge of the chart

endFillColor

Type: color
Default: #73B0D7

Color for the Vertical Waterfall end bars

exposeLabels

Type: select
Default: [object Object]

If true, each bar's value will always be visible

fillByValue

Type: boolean
Default: false

Determines if the fill bar colors by series or by value

generalSeparatorColor

Type: color
Default: #FFFFFF

Color is used to to distinguish bar segments that are filled with the washout color

generalWashoutColor

Type: color
Default: #E4E5E5

Color is used to fill bar segments that are not being highlighted on events such as mouse hover

hasSeriesData

Type: boolean
Default: false

Determines if the chart should have just one color or multiple. Used primarily with single layout

height

Type: number
Default: 250
Units: px

highlightKey

Type: string
Default: series

The key on which to highlight the bar on mouseover. Valid keys are "label", "series", or "value"

labelFormat

Type: function
Default: function (d) { return i18n.summaryNumber(d.value); }

Format for the bar labels

labelPosition

Type: string
Default: inline

When orientation is 'horizontal', this config will be used to place labels inline with the bars, or on top of the bar.Valid options are: inline and top. inline is the default.

layout

Type: string
Default: single

Determines if the chart is stacked or grouped, waterfall or single bars

minimumBarWidth

Type: number
Default: 3

The minimum width for the bars. Used to check the number of data points

negativeFillColor

Type: color
Default: #E4584F

Color for the Vertical Waterfall negative value bars

orientation

Type: string
Default: vertical

Determines if the orientation is vertical or horizontal

positiveFillColor

Type: color
Default: #80C25D

Color for the Vertical Waterfall positive value bars

shouldValidate

Type: boolean
Default: true

Flag for turning off data validation

showBarLabels

Type: boolean
Default: true

Determines whether the bar label should be displayed on hover

showClip

Type: boolean
Default: true

Hide bars that extend past chart bounds

showMeridian

Type: boolean
Default: false

Determines whether to show the center

showTooltip

Type: boolean
Default: true

textFontFamily

Type: string
Default: Open Sans

textSize

Type: number
Default: 12
Units: px

tooltipBackgroundColor

Type: color
Default: #555555

Background color of the tooltip

tooltipContent

Type: function
Default: function (d) { return { value: i18n.summaryNumber(d.value), label: d.series }; }

Format for the Tooltip content. Valid option requires an object with a value and a label.

tooltipFontFamily

Type: string
Default: Open Sans

Font family for the tooltip

tooltipTextColor

Type: color
Default: #FFFFFF

Color of the tooltip text

tooltipTextSize

Type: number
Default: 12
Units: px

Size of the tooltip text

transitionDelay

Type: function
Default: function (d, i) { return i * (_Chart.c('transitionDuration') / _labels.length); }

The delay function for the transitions

transitionDuration

Type: number
Default: 300

The duration for the transitions

updateSizeableConfigs

Type: boolean
Default: true

Flag for turning off the mimic of illustrator's scale functionality

width

Type: number
Default: 100

The plot area width

Data Definition

ExtraData

Type: string

Default validate:

function (row) { return _Chart.c('hasSeriesData') ? this.accessor(row) !== undefined : true; }

Default accessor:

function (row) {
              return !_Chart.c('hasSeriesData') ?
                row[2] && row[2] !== '' ? String(row[2]) : undefined : _Chart.a('Label')(row);
            }

Label

Type: string

Default validate:

function (row) { return this.accessor(row) !== undefined; }

Default accessor:

function (row) { return row[0] && row[0] !== '' ? String(row[0]) : undefined; }

Series

Type: string

Default validate:

function (row) { return _Chart.c('hasSeriesData') ? this.accessor(row) !== undefined : true; }

Default accessor:

function (row) {
              return _Chart.c('hasSeriesData') ?
                row[2] && row[2] !== '' ? String(row[2]) : undefined : _Chart.a('Label')(row);
            }

Value

Type: number

Default validate:

function (row) { return !isNaN(this.accessor(row)); }

Default accessor:

function (row) { return Number(row[1]); }

Events

Dispatch Events

dispatch:mouseover
dispatch:mouseout
dispatch:click

External Events

external:mouseover
external:mouseout
external:highlight
external:unhighlight

Example

//----------------------------------------------------------------------------------
// Setup some fake data
//----------------------------------------------------------------------------------

var data1 = [
  ['a', 2, 'z'],
  ['a', 3, 'y'],
  ['b', 4, 'z'],
  ['b', 5, 'y'],
  ['c', 6, 'z'],
  ['c', 7, 'y']
];
var data3 = [
  ['a', 2, 'z'],
  ['a', 3, 'y'],
  ['a', 4, 'x'],
  ['b', -2, 'z'],
  ['b', -4, 'y'],
  ['b', -6, 'x'],
  ['c', 6, 'z'],
  ['c', 7, 'y'],
  ['c', 8, 'x'],
  ['d', 8, 'z'],
  ['d', 7, 'y'],
  ['d', 6, 'x'],
];
var data2 = [
  ['a', 2],
  ['b', 4],
  ['d', 4],
  ['e', 4],
  ['f', 4],
  ['g', 4],
  ['h', 4],
  ['c', 6],
];
var data4 = [
  ['a', -2],
  ['b', 4],
  ['c', 8],
  ['d', 6]
];

var data5 = [
  ['a', 2, 'series A'],
  ['b', 4, 'series A'],
  ['d', 4, 'series A'],
  ['e', 4, 'series B'],
  ['f', 4, 'series B'],
  ['g', 4, 'series B'],
  ['h', 4, 'series C'],
  ['c', 6, 'series C'],
];
var data6 = [
  ['a', 2, 'series A'],
  ['b', 4, 'series B'],
  ['c', 8, 'series C'],
  ['d', 6, 'series D']
];

var data7 = [
  ['LY',2000, '$153,769'],
  ['TRAFFIC',400, '%'],
  ['CONVERSION',1000, 'ppt'],
  ['UPT',3000, '+'],
  ['AUR',-6000, '%'],
  ['TY',400, '$']
];
var data8 = [
  ['LY',42,'$'],
  ['TRAFFIC',-5,'%'],
  ['CONVERSION',-3,'ppt'],
  ['UPT',-1.6,'+'],
  ['AUR',1,'%'],
  ['TY',33.4,'$']
];
var data9 = [
  ['LY',22, '$'],
  ['TRAFFIC',-1, '%'],
  ['CONVERSION',8, 'ppt'],
  ['UPT',1.5, '+'],
  ['AUR',2, '%'],
  ['TY',32.5, '$']
];
var data10 = [
  ['LY',20, '$'],
  ['TRAFFIC',-25, '%'],
  ['CONVERSION',15, 'ppt'],
  ['UPT',5, '+'],
  ['AUR',5, '%'],
  ['TY',20, '$']
];
// var data10 = [
//   ['LY SALES',84445.86, '$'],
//   ['TRAFFIC',681.6293711, '%'],
//   ['CONVERSION',1550.822813, 'ppt'],
//   ['UPT',-6409.666028, '+'],
//   ['AUR',7716.013844, '%'],
//   ['TY SALES',87984.66, '$']
// ];


var varianceData = [
  ['week 1', 2],
  ['week 2', -2],
  ['week 3', 4],
  ['week 4', -4],
  ['week 5', 6],
  ['week 6', -6],
  ['week 7', 8],
  ['week 8', -8]
];

//----------------------------------------------------------------------------------
// Initialze the widget
//----------------------------------------------------------------------------------

var textSize = 18;

var horizontalStackedChart = d3.select("#vis")
  .append("svg")
  .attr({'width': 350, 'height': 350})
  .append("g")
  .attr("transform", "translate(50,50)")
  .chart("Bars")
  .c({
    'width': 250,
    'height': 250,
    'orientation': 'horizontal',
    'layout': 'stacked',
    'textSize': textSize
  });

var horizontalGroupedChart = d3.select("#vis")
  .append("svg")
  .attr({'width': '350px', 'height': '350px'})
  .append("g")
  .attr("transform", "translate(50,50)")
  .chart("Bars")
  .c({
    'width': 250,
    'height': 250,
    'orientation': 'horizontal',
    'layout': 'grouped',
    'textSize': textSize
  });

var horizontalChart = d3.select("#vis")
  .append("svg")
  .attr({'width': 350, 'height': 350})
  .append("g")
  .attr("transform", "translate(50,50)")
  .chart("Bars")
  .c({
    'width': 250,
    'height': 250,
    'orientation': 'horizontal',
    'layout': 'single',
    'textSize': textSize,
    'color': 'red'
  });
setTimeout(function() {
  horizontalChart.c('color', 'green').draw(data2);
}, 1000);

var horizontalSeriesChart = d3.select("#vis")
  .append("svg")
  .attr({'width': 350, 'height': 350})
  .append("g")
  .attr("transform", "translate(50,50)")
  .chart("Bars")
  .c({
    'width': 250,
    'height': 250,
    'orientation': 'horizontal',
    'layout': 'single',
    'hasSeriesData': true,
    'textSize': textSize
  });

var stackedChart = d3.select("#vis")
  .append("svg")
  .attr({'width': 350, 'height': 350})
  .append("g")
  .attr("transform", "translate(50,50)")
  .chart("Bars")
  .c({
    'width': 250,
    'height': 250,
    'layout': 'stacked',
    'textSize': textSize
  });

var stackedChartH = d3.select("#vis")
  .append("svg")
  .attr({'width': 350, 'height': 350})
  .append("g")
  .attr("transform", "translate(50,50)")
  .chart("Bars")
  .c({
    'width': 250,
    'height': 250,
    'layout': 'stacked',
    'textSize': textSize,
    'orientation': 'horizontal'
  });

var groupedChart = d3.select("#vis")
  .append("svg")
  .attr({'width': 350, 'height': 350})
  .append("g")
  .attr("transform", "translate(50,50)")
  .chart("Bars")
  .c({
    'width': 250,
    'height': 250,
    'layout': 'grouped',
    'textSize': textSize
  });

var waterfallChart = d3.select("#vis")
  .append("svg")
  .attr({'width': 350, 'height': 350})
  .append("g")
  .attr("transform", "translate(50,50)")
  .chart("Bars")
  .c({
    'width': 250,
    'height': 250,
    'layout': 'waterfall',
    'textSize': textSize,
    'hasSeriesData': false,
    'exposeLabels': {name: 'Show', value: true},
    // 'labelFormat': function(d){
    //   return i18n.summaryNumber(d.extraData);
    // },
    'showTooltip': {name: 'Show', value: true},
    // 'tooltipContent': function(d){
    //   return {
    //     value: d.value < 0 ? '-$' + i18n.summaryNumber(Math.abs(d.value)): '$' + i18n.summaryNumber(Math.abs(d.value)),
    //     label: d.label
    //   }
    // }
  });

var singleSeriesChart = d3.select("#vis")
  .append("svg")
  .attr({'width': 350, 'height': 350})
  .append("g")
  .attr("transform", "translate(50,50)")
  .chart("Bars")
  .c({
    'width': 250,
    'height': 250,
    'hasSeriesData': true,
    'layout': 'single',
    'textSize': textSize
  });

var singleChart = d3.select("#vis")
  .append("svg")
  .attr({'width': 350, 'height': 350})
  .append("g")
  .attr("transform", "translate(50,50)")
  .chart("Bars")
  .c({
    'width': 250,
    'height': 250,
    'layout': 'single',
    'textSize': textSize
  });

var varianceChart = d3.select("#vis")
  .append("svg")
  .attr({'width': 350, 'height': 350})
  .append("g")
  .attr("transform", "translate(50,50)")
  .chart("Bars")
  .c({
    'width': 250,
    'height': 250,
    'layout': 'single',
    'textSize': textSize,
    'fillByValue': true,
    'showBarLabels': false,
  })
  .colorScale(d3.scale.threshold().domain([0]).range(['red', 'green']));

//----------------------------------------------------------------------------------
// Render the chart with data
//----------------------------------------------------------------------------------

var c1, c2, c3, c4, c5, c6, c7, c8, c9;
c1 = c2 = c3 = c4 = c5 = c6 = c7 = c8  = c9 = 0;

varianceChart.draw(varianceData);
horizontalGroupedChart.draw(data3);
horizontalStackedChart.draw(data1);
horizontalChart.draw(data2);
horizontalSeriesChart.draw(data5);
stackedChart.draw(data3);
stackedChartH.draw(data3);
groupedChart.draw(data3);
waterfallChart.draw(data7);
singleSeriesChart.draw(data5);
singleChart.draw(data4);

var drawLoop = false;
if (drawLoop) {
  // horizontal
  setInterval(function () {
    var drawData = (c1 % 2) ? data1 : data3;
    horizontalStackedChart.draw(drawData);
    ++c1;
  }, 3000);
  setInterval(function () {
    var drawData = (c2 % 2) ? data1 : data3;
    horizontalGroupedChart.draw(drawData);
    ++c2;
  }, 2500);
  setInterval(function () {
    var drawData = (c7 % 2) ? data5 : data6;
    horizontalSeriesChart.draw(drawData);
    ++c7;
  }, 2500);

  // vertical
  setInterval(function () {
    var drawData = (c3 % 2) ? data1 : data3;
    stackedChart.draw(drawData);
    ++c3;
  }, 3000);
  setInterval(function () {
    var drawData = (c4 % 2) ? data1 : data3;
    groupedChart.draw(drawData);
    ++c4;
  }, 3500);
  setInterval(function () {
    var drawData = c9 === 0 ? data7: (c9 === 1? data8 : (c9 === 2? data9: data10));
    c9++
    if (c9 > 3) {
      c9 = 0;
    }
    waterfallChart.draw(drawData);
  }, 2000);
  setInterval(function () {
    var drawData = (c5 % 2) ? data5 : data6;
    singleSeriesChart.draw(drawData);
    ++c5;
  }, 3500);
  setInterval(function () {
    var drawData = (c8 % 2) ? data2 : data4;
    singleChart.draw(drawData);
    ++c8;
  }, 2000);
}

//----------------------------------------------------------------------------------
// Data Generation / Helper Functions
//----------------------------------------------------------------------------------

function generateSeriesData(numOfRows, numOfLabels, numOfSeries) {
  // var start = new Date().getTime();
  var data = [];
  var labelsArr = generateRandomArrayOfStringsWithPrefix('Label', numOfLabels);
  var seriesArr = generateRandomArrayOfStringsWithPrefix('Series', numOfSeries);
  var label;
  var value;
  var series;

  while (numOfRows) {
    label = chooseRandomValueFromArray(labelsArr);
    value = getRandomInt(1, 100);
    series = chooseRandomValueFromArray(seriesArr);
    data.push([label, value, series]);
    numOfRows--;
  }

  // var end = new Date().getTime();
  // var time = end - start;
  // console.log('Data Generation Execution time: ' + time);

  return data;
}

function generateRandomArrayOfStringsWithPrefix(prefix, numOfRows) {
  var data = [];
  while (numOfRows) {
    data.push(prefix + numOfRows);
    numOfRows--;
  }
  return data;
}

function chooseRandomValueFromArray(arr) {
  var randomIndex = Math.floor(Math.random() * arr.length);
  return arr[randomIndex];
}

function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min)) + min;
}

If you find any bugs or have a feature request, please open an issue on github!

The npm package download data comes from npm's download counts api and package details come from npms.io.