I have a page that displays data in a form of a Pie Chart. I use Google Charts to do this. Here's the code:
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Goal Name', 'No. of times Requested'],
['Frank.net Life Cover', 226],
['Frank.net Hospital Cash Back', 147],
['Frank.net Salary Protection', 228],
['King Price Car Insurance', 328],
['Momentum Medical Aid', 493],
['Oplan Health Cover', 185],
['Youi Quote', 33],
]);
var options = {
title: 'Most Requested Sponsors'
};
var chart = new google.visualization.PieChart(document.getElementById('piechart2'));
chart.draw(data, options);
}
</script>
<div id="piechart2" style="width: 700px; height: 400px; position: relative;"></div>
And here's a working JS FIDDLE:
http://jsfiddle.net/yRdW3/
Now, I need help on displaying the percentage and total next to each sponsor name on the legend. I have no idea how to achieve this. I want it to look similar to this:
Then, click on the Chart Elements icon and select the Data Labels option. Then, we are going to show the percentage in legend. To do this, you have to click on the Chart Elements icon, select the Legend option, and finally select the Right option.
Simply set the format of cells to percent and Google Sheets will do the rest. Copy it down your table. Go to Format > Number > Percent in Google Sheets menu to apply the percentage view.
There is a way to do this utilizing the built-in legend. Essentially you can utilize the fact that the chart is rendered in SVG, and you can select and modify elements in the SVG the same way you select regular HTML elements. The basic idea is you:
See my Codepen for a working example: http://codepen.io/breich/pen/mVPJwo
/**
* Selector for chart element.
*/
var chartSelector = '#chart';
/**
* Selector used to get label elements inside the rendered chart.
* Your mileage may vary if you configure your chart different than
* me. Use Firebug or Developer Tools to step through the SVG and
* determine your label selector.
*/
var labelSelector = '> g:eq(1) g text';
/**
* This is our data. For simplicity sake, doing inline and not AJAX.
*/
var data = [
[ 'Apples', 10],
[ 'Oranges', 20 ],
[ 'Peaches', 30 ],
[ 'Pears', 40 ],
[ 'Bananas', 50 ]
];
// Load Google Charts
google.load('visualization', '1.1', { packages: ['corechart', 'line'] });
// Callback when API is ready
google.setOnLoadCallback(function() {
/*
* Setup the data table with your data.
*/
var table = new google.visualization.DataTable({
cols : [
{ id : 'name', label : 'Name', type : 'string' },
{ id : 'value', label : 'Value', type : 'number' }
]
});
// Add data to the table
table.addRows( data );
// Google Charts needs a raw element. I'm using jQuery to get the chart
// Container, then indexing into it to get the raw element.
var chartContainer = $(chartSelector)[0];
// Create the Google Pie Chart
var chart = new google.visualization.PieChart(chartContainer);
// Draw the chart.
chart.draw(table, { title : 'Classifications' });
/*
* This is the meat and potatoes of the operation. We really require
* two things: #1) A selector that will get us a list of labels in the
* legend, and #2) The DataTable powering the chart. We'll cycle
* through the labels, and use their index to lookup their value.
* If you have some higher-level math you need to do to display a
* different value, you can just replace my logic to get the count
* with your's.
*/
// The <svg/> element rendered by Google Charts
var svg = $('svg', chartContainer );
/*
* Step through all the labels in the legend.
*/
$(labelSelector, svg).each(function (i, v) {
/*
* I'm retrieving the value of the second column in my data table,
* which contains the number that I want to display. If your logic
* is more complicated, change this line to calculate a new total.
*/
var total = table.getValue(i, 1);
// The new label text.
var newLabel = $(this).text() + '(' + total + ')';
// Update the label text.
$(this).text( newLabel );
});
});
Check this fiddle example. It is your code with attached legend (idea from first comment, total calculation and some minor errors corrected).
Basic idea is to set legend
option of chart to none
and than you have to build your own legend.
If you load that code into browser the legend will be positioned to the right but you have to set proper CSS rules to get everything right (I'm not so familiar with CSS). But you have the basic idea how to do that.
And for different sets of legend colors you can check color brewer
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With