I have a Google Geochart with the following columns:
// Lat, Long, Value 1, Value 2
[-22.764042, -43.39921 , 2.86, 1],
[-22.755635, -43.460325 , 3.70, 2],
[-22.912897, -43.200295 , 0.50, 1],
[-22.805776 , -43.37292 , 6.67, 2],
[-23.532905 , -46.63952 , 33.33, 5]
// ...many rows
I've checked the other answers, but they don't work here.
I can't use those value columns to display a label because both are important on this chart.
I can't use addresses instead of lat/long because it is really, really slow to load all markers (and they are many in the real chart).
I've tried to apply formatters to solve this, but it seems they are overridden by the library which display a "beautiful"coordinate (22º76'4042"S, 43º39'921"W instead of -22.764042, -43.39921)
Is there any way I could load the chart markers with coordinates, but display a custom label on their tooltips?
You can add a "string" type column after the lat/long columns to give the data point a label for the tooltips:
var data = new google.visualization.DataTable();
data.addColumn('number', 'Latitude');
data.addColumn('number', 'Longitude');
data.addColumn('string', 'Label');
data.addColumn('number', 'Value 1');
data.addColumn('number', 'Value 2');
data.addRows([
[-22.764042, -43.39921, 'Foo', 2.86, 1],
[-22.755635, -43.460325, 'Bar', 3.70, 2],
[-22.912897, -43.200295, 'Baz', 0.50, 1],
[-22.805776, -43.37292, 'Cad', 6.67, 2],
[-23.532905, -46.63952, 'Qud', 33.33, 5]
]);
See example here: http://jsfiddle.net/asgallant/GKmm5/
Amazon did a great job with the monitoring in OpsWorks (see screenshot). You can point at any time in any of the area charts and see all values for all charts at that time.
Is it possible to achieve something similar with the Google Visualisation API?
I also have multiple (stacked) area charts and it's a pain to point at each datapoint to get the exact value. Some of them are overlapping or very close together.
You can't trigger the tooltips in all of the charts at the same time, but if you disable the built-in tooltips, you can achieve something similar by building out your tooltips in HTML and populating them manually in a "onmouseover" event handler:
function mouseOverHandler (e) {
// use e.row, e.column to find data and populate your tooltips
}
function mouseOutHandler (e) {
// clear the tooltips
}
google.visualization.events.addListener(chart1, 'onmouseover', mouseOverHandler);
google.visualization.events.addListener(chart1, 'onmouseout', mouseOutHandler);
google.visualization.events.addListener(chart2, 'onmouseover', mouseOverHandler);
google.visualization.events.addListener(chart2, 'onmouseout', mouseOutHandler);
// etc...
In your stacked area chart (assuming you do not replace the tooltips with a custom solution), you can set the focusTarget option to 'category' to make all values at a given x-axis value show up in the tooltip (works only within one chart, not across charts).
You can also cheat by putting all three charts in the same chart element with a little trickery (and some limitations). For instance, you can make the chart like this:
Here is the code for that (dummy data):
function drawVisualization() {
// Some raw data (not necessarily accurate)
var data = new google.visualization.DataTable();
data.addColumn('number', 'time');
data.addColumn('number', 'used');
data.addColumn('number', 'cached');
data.addColumn('number', 'free');
data.addColumn('number', 'user');
data.addColumn('number', 'system');
data.addColumn('number', 'io wait');
data.addColumn('number', '1 min');
data.addColumn('number', '5 min');
data.addColumn('number', '15 min');
data.addRows([
[1, {v:0.1, f:'10%'},{v:0.55, f:'45%'},{v:1, f:'45%'},{v:1.01, f:'0.15 GiB'},{v:1.83, f:'12.45 GiB'},{v:1.18, f:'2.7 GiB'},{v:2.28166561658701, f:'28.2%'},{v:2.38024858239246, f:'38.0%'},{v:2.42249842488051, f:'42.2%'}],
[2, {v:0.2, f:'20%'},{v:0.6, f:'40%'},{v:1, f:'40%'},{v:1.54, f:'8.1 GiB'},{v:1.47, f:'7.05 GiB'},{v:1.77, f:'11.55 GiB'},{v:2.53503269167234, f:'53.5%'},{v:2.74904576834128, f:'74.9%'},{v:2.4119751725877, f:'41.2%'}],
[3, {v:0.3, f:'30%'},{v:0.65, f:'35%'},{v:1, f:'35%'},{v:1.13, f:'1.95 GiB'},{v:1.15, f:'2.25 GiB'},{v:1.75, f:'11.25 GiB'},{v:2.73464579773048, f:'73.5%'},{v:2.85218912536736, f:'85.2%'},{v:2.80811037750353, f:'80.8%'}],
[4, {v:0.4, f:'40%'},{v:0.7, f:'30%'},{v:1, f:'30%'},{v:1.27, f:'4.05 GiB'},{v:1.86, f:'12.9 GiB'},{v:1.1, f:'1.5 GiB'},{v:2.86045009159487, f:'86.0%'},{v:2.92068159800651, f:'92.1%'},{v:2.54208355770477, f:'54.2%'}],
[5, {v:0.5, f:'50%'},{v:0.75, f:'25%'},{v:1, f:'25%'},{v:1.23, f:'3.45 GiB'},{v:1.12, f:'1.8 GiB'},{v:1.88, f:'13.2 GiB'},{v:2.89980619585711, f:'90.0%'},{v:2.8728120099814, f:'87.3%'},{v:2.75583720451997, f:'75.6%'}],
[6, {v:0.6, f:'60%'},{v:0.8, f:'20%'},{v:1, f:'20%'},{v:1.5, f:'7.5 GiB'},{v:1.78, f:'11.7 GiB'},{v:1.26, f:'3.9 GiB'},{v:2.84876005903125, f:'84.9%'},{v:2.66203284604438, f:'66.2%'},{v:2.63657004427344, f:'63.7%'}],
[7, {v:0.7, f:'70%'},{v:0.85, f:'15%'},{v:1, f:'15%'},{v:1.91, f:'13.65 GiB'},{v:1.26, f:'3.9 GiB'},{v:1.69, f:'10.35 GiB'},{v:2.71244021344925, f:'71.2%'},{v:2.78368423479417, f:'78.4%'},{v:2.69819140918026, f:'69.8%'}],
[8, {v:0.8, f:'80%'},{v:0.9, f:'10%'},{v:1, f:'10%'},{v:1.48, f:'7.2 GiB'},{v:1.51, f:'7.65 GiB'},{v:1.41, f:'6.15 GiB'},{v:2.50454251895529, f:'50.5%'},{v:2.59031474717769, f:'59.0%'},{v:2.33299806251049, f:'33.3%'}],
[9, {v:0.9, f:'90%'},{v:0.95, f:'5%'},{v:1, f:'5%'},{v:1.18, f:'2.7 GiB'},{v:1.53, f:'7.95 GiB'},{v:1.97, f:'14.55 GiB'},{v:2.24595415946281, f:'24.6%'},{v:2.24103507627355, f:'24.1%'},{v:2.22381828511115, f:'22.4%'}],
[10, {v:1, f:'100%'},{v:1, f:'0%'},{v:1, f:'0%'},{v:1.66, f:'9.9 GiB'},{v:1.61, f:'9.15 GiB'},{v:1.2, f:'3 GiB'},{v:2.1229770797314, f:'12.3%'},{v:2.13527478770454, f:'13.5%'},{v:2.14757249567768, f:'14.8%'}],
]);
// Create and draw the visualization.
var ac = new google.visualization.AreaChart(document.getElementById('visualization'));
ac.draw(data, {
title : 'Monthly Coffee Production by Country',
isStacked: false,
width: 600,
height: 400,
areaOpacity: 0.0,
focusTarget: 'category',
series: { 0: {areaOpacity: 0.5}, 1: {areaOpacity: 0.5}, 2: {areaOpacity: 0.5} },
vAxis: { ticks: [{v:0, f:""}, {v:0.5, f:"7.5 GiB"}, {v:1, f:"15.0 GiB"}, {v:1.5, f:"50%"}, {v:2, f:"100%"}, {v:2.5, f:"50%"}, {v:3, f:"100%"}, ] }
});
}
Basically, I put all 3 series on the same chart by putting them all as percentages of 1/3rd of the chart. So the first series is from 0-1, the second from 1-2, and the third from 2-3. I then used liberal quantities of {v:, f:} notation to make them look like different numbers (for the GiB particularly), and used the ticks option to make the axis look like it has 3 scales. Finally, I set focusTarget: 'category' so all lines get selected when you mouseover any of them.
You can format colors and even add dummy series to add thicker black lines between the series if you want to make them look more 'distinct'. You can also do some tricky stuff with dummy series and white areas and 100% opacity to potentially add background colors to higher areas. But the general concept is as outlined above, depending on what you are going for, it could work too.
I'm using google line chart to plot data by timestamp(x-axis).
my problem is that the x-axis is not being sorted automatically by the google charting.
e.g. "15:45:23 678" data point which should be the first in the chart is being shown at #2. If I put it at the first place then it is fine. That means Google chart doesn't care about the data and it plots as it sees them.
The issue is that my data set is huge and sorting it based on x-axis data takes lot of time. is there any flag in the line chart which could sort it in the browser?
below is the sample data:
['x', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6'],
['15:48:13 744', 0, 0, 0, 0, 0, 0],
['15:45:23 678', 5, 17, 36, 3957, 20, 21],
['15:48:18 749', 0, 0, 0, 0, 0, 0]
You can use the following function to sort the underlying DataTable:
data.sort([{column: 0}]);.
Column 0 indicates the x-axis.
This will sort the data in asc order, for desc use data.sort([{column: 0, desc: true}]);
You may also be interested in the getSortedRows(sortColumns) function.
More information about these functions can be read about here
https://developers.google.com/chart/interactive/docs/reference#DataTable_sort
https://developers.google.com/chart/interactive/docs/reference#DataTable_getSortedRows
https://developers.google.com/chart/interactive/docs/gallery/linechart?hl=ja#Configuration_Options
How can I specify different colors for a single line dependent on the particular range? For example, one line should be blue from 0 to 10 and red from 10 to 20.
Short answer: you can't.
Long answer: you can build a lengthy workaround, but each step will present different issues that you may find worse than a single-colored line.
Run a loop through your data so that each color is in a different column for each series. This is the quickest way.
For instance, if you have data:
var data = google.visualization.arrayToDataTable([
['Month', 'Data'],
['2004/05', 123],
['2005/06', 234],
['2006/07', 345],
['2007/08', 456],
['2008/09', 789]
And you want to split it in to 3 colors:
<300,
300-600
600
You can write a script to make your data look like this:
var data = google.visualization.arrayToDataTable([
['Month', 'Red', 'Green', 'Blue'],
['2004/05', 123, null, null],
['2005/06', 234, null, null],
['2006/07', null, 345, null],
['2007/08', null, 456, null],
['2008/09', null, null, 789]
The above will give you colored points for each different range. If you actually want the lines connecting them to change color as soon as they cross a certain threshold, you have to calculate the intercept of 300 with whatever day, and add that to the series. Same with 600. You'd also have to change the "Month" series to actually be date values so you can set the point in between correctly. Of course, those intermediate points will show up too, which is a different headache...
You can also fiddle around with domains but those won't help you with the coloring (but will help you to connect the different points to the same series).
I am trying to use the Google charts api to create line charts that have datetimes on the x axis and values on the other. Generally these will only be for a 48 hour period, so I really need to show the times of day on the x axis as well as the days.
Does anyone know how to achieve this please?
Alternatively can anyone suggest another Javascript chart api that would allow this please?
The AnnotatedTimeline charts are old and outdated; you can replicate 95% of the functionality using a LineChart with "annotation" and "annotationText" column roles and a ChartRangeFilter. The LineCharts support using datetimes.
I'm using morris.js on a temperature time series.
Would like to see other suggestions.
#asgallant is right. A sample of what it would look like can but seen in Google Code Playground and pasting this script:
function drawVisualization() {
// Create and populate the data table.
var data = new google.visualization.DataTable();
data.addColumn('datetime', 'Time');
data.addColumn('number', 'Count');
data.addColumn({type: 'string', role: 'annotation'});
data.addColumn({type: 'string', role: 'annotationText'});
data.addRows([
[new Date(2013, 0, 31, 19, 30), 1, 'A', 'Event 1'],
[new Date(2013, 1, 2, 20, 30), 2, 'B', 'No event'],
[new Date(2013, 1, 7, 18, 30), 2.5, 'C', 'No event'],
]);
// Create and draw the visualization.
new google.visualization.LineChart(document.getElementById('visualization')).
draw(data, {curveType: "function",
width: 500, height: 400,
vAxis: {maxValue: 10}}
);
}