Specifying "groups" dynamically in stacked bar chart c3js - c3

//take this code as an example
Here i have specified yvalue[0],yvalue[1] in groups..
But i need a general design ,where I dont know the number of groups that i have to create(i.e the number of segments) this varies according to the json data.
Consider this example here I have total,total1 therefore i have only 2 values.But if a third variable say total2 is specified in json, I should have a segment for it in my bar chart and so on.This has to be done without altering the groups everytime a field is added.Is there any way to achieve this??
Thanks
var datajson = [ {
country : "china",
total : 20,
total1 : 10
}, {
country : "India",
total : 40,
total1 : 20
}, {
country : "aus",
total : 10,
total1 : 30
}, {
country : "nxz",
total : 50,
total1 : 40
}
];
var xvalue;
var yvalue = [];
var i = 0;
var obj = datajson[0]
for ( var key in obj) {
if (xvalue === undefined)
xvalue = key;
else {
yvalue[i] = key;
i++;
}
}
var chart = c3.generate({
bindto : '#chart',
data : {
json : datajson,
type : 'bar',
keys : {
x : xvalue, // it's possible to specify 'x' when category axis
value : [yvalue[0],yvalue[1]],
},
groups : [ [yvalue[0],yvalue[1]] ]
},
bar : {
width : {
ratio : 0.3
// this makes bar width 50% of length between ticks
}
},
axis : {
x : {
type : 'category'
},
}
});

Your question seems to have most of the answer (you are already generating the yvalue array from the object properties).
You just don't have to specify the elements one by one, instead you can just pass in the array directly and you are done.
groups: [yvalue]

Related

dimple.js Cannot Fix these issues

I have some needs in dimple js and i cannot find anything related to my query anywhere. I made a simple bar chart but the values are arranged in ascending order and Y Axis Labels are hiding and the values are converted as 1k,2k.
Please help me to fix these 3 issues:
To Stop sorting the data in ascending order
To Shorten the labels in Y axis
To Show the exact value as in json and not convert it to 1k,2k
var data = [
{
"Service" : "Primary Services" ,
"Total Services" : "10065"
} ,
{
"Service" : "PCP" ,
"Total Services" : "851"
} ,
{
"Service" : "scientist" ,
"Total Services" : "8818"
} ,
{
"Service" : "NP/PA/CNS" ,
"Total Services" : "5854"
} ,
{
"Service" : "FQHC/RHC" ,
"Total Services" : "8574"
}
];
var svg = dimple.newSvg("#types-of-services", 500, 300);
var myChart = new dimple.chart(svg, data);
// Set bounds
myChart.setBounds(0, 0, "5%", "5%")
myChart.setMargins("75px", "0px", "20px", "50px");
var x = myChart.addMeasureAxis("x", "Total Services");
var y = myChart.addCategoryAxis("y", "Service");
myChart.addSeries(null, dimple.plot.bar);
x.fontSize = "12";
y.fontSize = "12";
x.fontFamily = "Roboto";
y.fontFamily = "Roboto";
myChart.draw(1700);
x.titleShape.remove();
$(window).on('resize', resize);
$('.sidebar-control').on('click', resize);
function resize() {
myChart.draw(0, true);
x.titleShape.remove();
}
Measure Axis will Sort, Display as 1K, 2K etc., Use category axis instead...
// var x = myChart.addMeasureAxis("x", "Total Services");
var x = myChart.addCategoryAxis("x", "Total Services");

Highlight Major Value Grid Lines

Is there a setting that I'm missing to highlight major axis grid lines? I've mocked up an example of what I'm trying to do below. The arrows point to what I want, the circle shows what I have. The axis value highlights the day of the week, but not the grid line. I have a feeling that it is considering the 12 pm's as major axis grid lines too.
Here is what I have for the categoryAxis:
"categoryAxis" :
{
"equalSpacing" : true,
"minPeriod" : "hh",
"parseDates" : true,
"fontSize" : 24,
"dateFormats" : [
{
period : 'fff',
format : 'JJ:NN:SS'
},
{
period : 'ss',
format : 'JJ:NN:SS'
},
{
period : 'mm',
format : 'JJ:NN'
},
{
period : 'hh',
format : 'L A'
},
{
period : 'DD',
format : 'MMM DD\n L A'
},
{
period : 'WW',
format : 'MMM DD\n L A'
},
{
period : 'MM',
format : 'MMM DD\n L A'
},
{
period : 'YYYY',
format : 'MMM DD\n L A'
}]
},
No, there isn't a setting that highlights those lines automatically. You can use a guide to highlight those times by drawing a darker line.
Typically, this is done manually, however you can use the init event to automatically do this by having it read the category axis' internal start and end dates and placing the guides as needed:
var chart = AmCharts.makeChart("chartdiv", {
// ...
"listeners": [{
"event": "init",
"method": function(e) {
//get the start and end date objects from the categoryAxis' internal data array
var startDate = new Date(e.chart.categoryAxis.data[0].category);
var endDate = new Date(e.chart.categoryAxis.data[e.chart.categoryAxis.data.length - 1].category);
var guides = [];
var guideDate;
//start at midnight
startDate.setHours(0, 0, 0, 0);
while (startDate.getTime() <= endDate.getTime()) {
guideDate = new Date(startDate);
guides.push({
"lineAlpha": 1,
"lineColor": "#000",
"date": guideDate
});
startDate.setDate(startDate.getDate() + 1);
}
//remove the first guide if it falls outside of the full date range of the axis
if (guides[0].date.getTime() < e.chart.categoryAxis.data[0].category.getTime()) {
guides.shift();
}
e.chart.categoryAxis.guides = guides;
e.chart.validateNow(); //draw the guides
}
}]
});
Demo

How to add colorAxis to non-plotted categoryAxis?

Updated fiddle, courtesy of echonax.
I am trying to apply color coding to segments of a line plot in dimple.js, similar to this example. Specifically, I have some categorical data (the "status" field), where I want each status to correspond to a specific color.
I've tried all variations of addColorAxis that I can think of, but the solution eludes me.
Here's what I have so far:
var svg = dimple.newSvg("#chartContainer", 1000, 1000);
chart = new dimple.chart(svg);
chart.setBounds(100, 100, 500, 300);
x = chart.addCategoryAxis("x", "project");
y = chart.addTimeAxis("y", "date", "%Y-%m-%d", "%Y-%m-%d");
y.addOrderRule("date");
var lines = chart.addSeries(["project"], dimple.plot.line, [x, y]);
lines.data = [
{ "date" : '2016-01-01', "project" : "Grape", "status" : 1 },
{ "date" : '2016-01-08', "project" : "Grape", "status" : -2 },
{ "date" : '2016-01-07', "project" : "Apple", "status" : 3 },
{ "date" : '2016-01-08', "project" : "Apple", "status" : 1 },
{ "date" : '2016-01-02', "project" : "Banana", "status" : -2 },
{ "date" : '2016-01-15', "project" : "Banana", "status" : 2 },
];
lines.lineWeight = 5;
lines.lineMarkers = true;
Related: It seems like y.addGroupOrderRule("date", false); does have no effect at all for reversing the dates. I'd like the oldest dates at top, and newest dates at the bottom. Can't figure it out.
Edit
My latest attempt was to replicate the colorAxis example for a single category, save for swapping the x and y axes.
var grape = [
{ "date" : '2016-01-01', "status" : 0, "fake_x" : 1},
{ "date" : '2016-01-08', "status" : 1, "fake_x" : 1}];
var svg = dimple.newSvg("#chartContainer", 590, 400);
var myChart = new dimple.chart(svg, grape);
myChart.setBounds(60, 30, 500, 300);
var x = myChart.addCategoryAxis("x", "fake_x");
var y = myChart.addTimeAxis("y", "date");
// Order the x axis by date
y.addOrderRule("date");
// Min price will be green, middle price yellow and max red
myChart.addColorAxis("status", ["green", "yellow", "red"]);
// Add a thick line with markers
var lines = myChart.addSeries(null, dimple.plot.line);
lines.lineWeight = 5;
lines.lineMarkers = true;
// Draw the chart
myChart.draw();
The result has the same problems though:
var chart = new dimple.chart(svg);
is the line that breaks your code
I've changed it to
var chart = new dimple.chart(svg,data);
and now it works.
Here is an updated fiddle
http://jsfiddle.net/1hotquwf/8/
Got it to work for a single axis, will post an update if/when I get it to work for the category axis as well.
var grape = [
{ "date" : '2016-01-01', "status" : 0, "fake_x" : 1},
{ "date" : '2016-01-15', "status" : 3, "fake_x" : 1},
{ "date" : '2016-01-08', "status" : 1, "fake_x" : 1}];
var svg = dimple.newSvg("#chartContainer", 590, 400);
// Create and Position a Chart
var chart = new dimple.chart(svg, grape);
chart.setBounds(60, 30, 500, 300);
var x = chart.addCategoryAxis("y", "date")
chart.addMeasureAxis("x", "fake_x");
// Order the x axis by date
x.addOrderRule("date");
// Min price will be green, middle price yellow and max red
chart.addColorAxis("status", ["green", "yellow", "red"]);
// Add a thick line with markers
var lines = chart.addSeries(null, dimple.plot.line);
lines.lineWeight = 5;
lines.lineMarkers = true;

D3 stacked area chart stack function

I am trying to create a stacked area chart and running into an issue with the stack function. The x axis is date, the y axis is count and the area is buildResult.
Here is the code:
var stack = d3.layout.stack()
.offset("zero")
.values(function(d) { return d.values; })
.x(function(d) { return d.date; })
.y(function(d) { return d.count; });
// Loop through the data and add elements
data.result.forEach(function(d) {
d.date = new Date(d._id.year, d._id.month-1, d._id.day);
});
// Nest by name aka status
var nested = d3.nest()
.key(function(d) { return d._id.buildResult; });
// Create the layers
var layers = stack(nested.entries(data.result));
The raw data looks like:
{
"result" : [
{
"_id" : {
"month" : 1,
"day" : 20,
"year" : 2014,
"buildResult" : "FAILURE"
},
"count" : 27
},
{
"_id" : {
"month" : 1,
"day" : 20,
"year" : 2014,
"buildResult" : "SUCCESS"
},
"count" : 93
}
],
"ok" : 1
}
The error I am getting is from the layers object:
Cannot read property 1 of undefined
The nested.entries(data.result) object is not null so I'm not sure what is going on. Thanks for the help!
I figured out the issue - my data was not formatted correctly, specifically the 2D array I was passing to stack() was not all the same length.

Generating Different Colours On the JVectorMap Regions Based On The Range Of Values

I'm using JVectorMap for creating World Map..
As part of my JVectorMap im displaying on the regions CountryName with Population..
My Question is:
How to show differrent colours for the regions (countries) based on population ranges.
Ex: For 1-1000 population i have to show red colour.
For 1000-5000 population i have to show blue colour.
I'm using code like this.But it is not displaying different colours based on the range of population
var mapData = {
"AF": 1000,
"AL": 5000,
"DZ": 20000,
...
};
try{
$('#id').vectorMap(
{
map : 'world_mill_en',
series : {
regions : [ {
initial : {
fill : 'white',
"fill-opacity" : 1,
stroke : 'none',
"stroke-width" : 0,
"stroke-opacity" : 1
},
hover : {
"fill-opacity" : 0.8
},
selected : {
fill : 'yellow'
},
selectedHover : {},
values : mapData,
scale : [ '#C8EEFF', '#0071A4' ],
normalizeFunction : 'polynomial'
} ]
},
onRegionLabelShow : function(e, el, code) {
el.html(el.html()+' (Population - '+mapData[code]+')');
}
});
}
catch(err){
alert(err);
}
Can any one help me in displaying differnt colours for the regions based on the range of population......?
Thanks in advance..
Create a JSON with count and color codes like this according to your regions and colors.
var colorData = {
"1" : "#C8EEFF",
"2" : "#0071A4",
"3" : "#C8EEFF",
"4" : "#0071A4",
"5" : "#C8EEFF",
"6" : "#0071A4"
}
and pass this JSON to the scale : colorData. Hope it helps you.

Resources