Reorder unzoom operation with log of operation, which properly sets the valueRange...
[dygraphs.git] / docs / index.html
CommitLineData
15c966e0 1<!DOCTYPE html>
078d1d29
DV
2<html>
3 <head>
fe57a69b 4 <title>dygraphs JavaScript Visualization Library</title>
078d1d29 5 <!--[if IE]>
15c966e0 6 <script type="text/javascript" src="excanvas.js"></script>
078d1d29 7 <![endif]-->
9f006dbf 8 <script type="text/javascript" src="dygraph-combined.js"></script>
15c966e0 9 <link rel="stylesheet" href="style.css">
078d1d29 10 </head>
15c966e0
AK
11 <body>
12 <div id="nav">
13 <h2>Documentation</h2>
14 <ul>
68f9bed3
AK
15 <li><a href="#demo">Demo</a></li>
16 <li><a href="#usage">Usage</a></li>
17 <li><a href="#ie">IE Compatibility</a></li>
18 <li><a href="#gviz">GViz Data</a></li>
19 <li><a href="#baseball">Baseball chart</a></li>
20 <li><a href="#stock">Stock chart</a></li>
21 <li><a href="#options">Options Reference</a></li>
71ac4733 22 <li><a href="#gwt">GWT Compatibility</a></li>
68f9bed3 23 <li><a href="#policy">Data Policy</a></li>
15c966e0 24 </ul>
68f9bed3 25
15c966e0
AK
26 <h2>Project</h2>
27 <ul>
68f9bed3
AK
28 <li><a href="http://github.com/danvk/dygraphs">Source</a></li>
29 <li><a href="http://code.google.com/p/dygraphs/issues/">Issues</a></li>
30 <li><a href="http://code.google.com/p/dygraphs/issues/entry">Report Bug</a></li>
a843ade7 31 <li><a href="mailto:dygraphs-users [at] googlegroups.com">Contact</a></li>
15c966e0 32 </ul>
68f9bed3 33
15c966e0
AK
34 <h2>Gallery</h2>
35 <ul>
68f9bed3
AK
36 <li><a href="tests/demo.html">Basic Demo</a></li>
37 <li><a href="tests/gviz.html">GViz Demo</a></li>
38 <li><a href="tests/plotter.html">Equation Plotter</a></li>
39 <li><a href="tests/perf.html">Performance Test</a></li>
116bd142 40 <li><a href="tests/fillGraph.html">Filled Chart</a></li>
68f9bed3 41 <li><a href="tests/perf.html">Fractions</a></li>
bf5b5f4d 42 <li><a href="tests/visibility.html">Visibility</a></li>
68f9bed3
AK
43 <li><a href="tests/label-div.html">Labels in a DIV</a></li>
44 <li><a href="tests/numeric-axis.html">Numeric Axis</a></li>
45 <li><a href="tests/draw-points.html">Dotted Points</a></li>
46 <li><a href="tests/native-format.html">Native Format</a></li>
47 <li><a href="tests/grid_dot.html">Crazy Styles</a></li>
48 <li><a href="tests/spacing.html">Tick spacing</a></li>
49 <li><a href="tests/callback.html">Callbacks</a></li>
50 <li><a href="tests/crosshair.html">Crosshairs</a></li>
51 <li><a href="tests/hourly.html">Hourly/Minutely data</a></li>
52 <li><a href="tests/isolated-points.html">Isolated Points</a></li>
53 <li><a href="tests/missing-data.html">Missing Data</a></li>
54 <li><a href="tests/border.html">Bordered chart</a></li>
55 <li><a href="tests/custom-bars.html">Custom Bars</a></li>
56 <li><a href="tests/customLabel.html">Custom Label Styles</a></li>
57 <li><a href="tests/dygraph.html">Minimal Example</a></li>
58 <li><a href="tests/negative.html">Negative Numbers</a></li>
59 <li><a href="tests/noise.html">Noisy Data</a></li>
60 <li><a href="tests/two-series.html">Multiple Series</a></li>
a7ef12f5 61 <li><a href="tests/highlighted-region.html">Custom Underlay / background</a></li>
15c966e0
AK
62 </ul>
63 </div>
fe57a69b 64
15c966e0
AK
65 <div id="content">
66 <h1>dygraphs JavaScript Visualization Library</h1>
68f9bed3 67
15c966e0 68 <p><a href="http://github.com/danvk/dygraphs">http://github.com/danvk/dygraphs</a></p>
a843ade7 69 <p>See <a href="http://groups.google.com/group/dygraphs-users">mailing list</a>, <a href="http://github.com/danvk/dygraphs/downloads/">downloads</a>, <a href="tests/">gallery</a> and <a href="http://code.google.com/p/dygraphs/issues/">open issues</a></p>
68f9bed3 70
15c966e0 71 <p>dygraphs is an open source JavaScript library that produces produces interactive, zoomable charts of time series. It is designed to display dense data sets and enable users to explore and interpret them.</p>
68f9bed3 72
15c966e0 73 <h3 id="demo">A demo is worth a thousand words:</h3>
68f9bed3 74
15c966e0 75 <p style="font-size:0.8em">(Mouse over to highlight individual values. Click and drag to zoom. Double-click to zoom back out. Change the number and hit enter to adjust the averaging period.)</p>
68f9bed3 76
15c966e0 77 <div id="title" style="width:800px; margin: 1em;text-align:center; font-weight: bold; font-size: 125%;">Temperatures in New York vs. San Francisco</div>
68f9bed3 78
15c966e0
AK
79 <div id="demodiv" style="width:800px; height:320px;"></div>
80 <script type="text/javascript">
68f9bed3 81 g = new Dygraph(
15c966e0
AK
82 document.getElementById("demodiv"),
83 "ny-vs-sf.txt",
84 {
85 rollPeriod: 14,
86 showRoller: true,
87 customBars: true,
88 yAxisLabelWidth: 30
89 }
68f9bed3 90 );
15c966e0 91 </script>
68f9bed3 92
15c966e0
AK
93 <h4>Some things to notice:</h4>
94 <ul>
68f9bed3
AK
95 <li>There's less seasonal temperature variation in SF than in NY.</li>
96 <li>The difference is about 15&deg; F for SF vs. 50&deg; F for NY.</li>
97 <li>The daily data (set rolling period to 1) is quite noisy and hides this conclusion.</li>
98 <li>Using a 14-day moving average makes it clearer. A 100-day rolling period averages out nearly all the specifics from the data.</li>
99 <li>There's a gap in the data for SF, when the weather station was down (zoom into October 2007 to see it).</li>
100 <li>The bands around each point indicate average highs and lows.</li>
101 <li>There is a <em>lot</em> of data in this chart: low, average and high for each city on each day of a three year period &asymp; 6000 data points in all.</li>
15c966e0 102 </ul>
68f9bed3 103
15c966e0 104 <p>dygraphs allows the user to explore the data and discover these facts.</p>
68f9bed3 105
15c966e0 106 <p>For more demos, browse the dygraph <a href="tests/">tests</a> directory.</p>
68f9bed3 107
15c966e0
AK
108 <h3>Features</h3>
109 <p>Some of the features of dygraphs:</p>
110 <ul>
68f9bed3
AK
111 <li>Plots time series without using an external server or Flash</li>
112 <li>Works in Internet Explorer (using excanvas)</li>
113 <li>Lightweight (45kb) and responsive</li>
114 <li>Displays values on mouseover (this makes it easily discoverable)</li>
115 <li>Supports error bands around data series</li>
116 <li>Interactive zoom</li>
117 <li>Adjustable averaging period</li>
118 <li>Can intelligently chart fractions</li>
119 <li>Customizable click-through actions</li>
120 <li>Compatible with the Google Visualization API</li>
121 <li>Intelligent defaults make it easy to use</li>
15c966e0 122 </ul>
68f9bed3 123
15c966e0 124 <h2 id="usage">Usage</h2>
68f9bed3 125
15c966e0 126 <p>To use dygraphs, include the <code><a href="http://github.com/danvk/dygraphs/downloads/">dygraph-combined.js</a></code> JavaScript file and instantiate a <code>Dygraph</code> object.</p>
68f9bed3 127
15c966e0 128 <p>Here's a basic example to get things started:</p>
68f9bed3 129
15c966e0 130 <div class="example" style="clear:both;">
68f9bed3 131 <div class="codeblock" style="float:left;width:400px;">
15c966e0
AK
132 <h3 style="text-align:center">HTML</h3>
133 <code>
134 <pre>
078d1d29
DV
135&lt;html&gt;
136&lt;head&gt;
68f9bed3 137&lt;script type=&quot;text/javascript&quot;
15c966e0 138 src=&quot;dygraph-combined.js&quot;&gt;&lt;/script&gt;
078d1d29
DV
139&lt;/head&gt;
140&lt;body&gt;
68f9bed3
AK
141&lt;div id=&quot;graphdiv&quot;&gt;&lt;/div&gt;
142&lt;script type=&quot;text/javascript&quot;&gt;
15c966e0
AK
143 g = new Dygraph(
144
145 // containing div
146 document.getElementById(&quot;graphdiv&quot;),
147
148 // CSV or path to a CSV file.
149 &quot;Date,Temperature\n&quot; +
150 &quot;2008-05-07,75\n&quot; +
151 &quot;2008-05-08,70\n&quot; +
152 &quot;2008-05-09,80\n&quot;
153
154 );
078d1d29
DV
155&lt;/script&gt;
156&lt;/body&gt;
157&lt;/html&gt;
15c966e0
AK
158</pre>
159 </code>
68f9bed3
AK
160 </div>
161 <div class="codeoutput" style="float:left;">
15c966e0
AK
162 <h3 style="text-align:center">OUTPUT</h3>
163 <div id="graphdiv"></div>
164 <script type="text/javascript">
165 g = new Dygraph(
166
167 // containing div
168 document.getElementById("graphdiv"),
169
170 // CSV or path to a CSV file.
171 "Date,Temperature\n" +
172 "2008-05-07,75\n" +
173 "2008-05-08,70\n" +
174 "2008-05-09,80\n"
175 );
176 </script>
68f9bed3 177 </div>
15c966e0 178 </div>
68f9bed3 179
ff00d3e2 180 <p style="clear:both">In order to keep this example self-contained, the second parameter is raw CSV data. The dygraphs library parses this data (including column headers), resizes its container to a reasonable default, calculates appropriate axis ranges and tick marks and draws the graph.</p>
68f9bed3 181
15c966e0 182 <p>In most applications, it makes more sense to include a CSV file instead. If the second parameter to the constructor doesn't contain a newline, it will be interpreted as the path to a CSV file. The Dygraph will perform an XMLHttpRequest to retrieve this file and display the data when it becomes available. Make sure your CSV file is readable and serving from a place that understands XMLHttpRequest's! In particular, you cannot specify a CSV file using <code>"file:///"</code>. Here's an example: (data from <a href="http://www.wunderground.com/history/airport/KNUQ/2007/1/1/CustomHistory.html?dayend=31&amp;monthend=12&amp;yearend=2007&amp;req_city=NA&amp;req_state=NA&amp;req_statename=NA">Weather Underground</a>)</p>
68f9bed3 183
15c966e0 184 <div class="example" style="clear:both;">
68f9bed3 185 <div class="codeblock" style="float:left;width:400px;">
15c966e0
AK
186 <h3 style="text-align:center">HTML</h3>
187 <code>
68f9bed3 188<pre>
078d1d29
DV
189&lt;html&gt;
190&lt;head&gt;
68f9bed3 191&lt;script type=&quot;text/javascript&quot;
15c966e0 192 src=&quot;dygraph-combined.js&quot;&gt;&lt;/script&gt;
078d1d29
DV
193&lt;/head&gt;
194&lt;body&gt;
68f9bed3
AK
195&lt;div id=&quot;graphdiv2&quot;
196 style=&quot;width:500px; height:300px;&quot;&gt;&lt;/div&gt;
197&lt;script type=&quot;text/javascript&quot;&gt;
15c966e0
AK
198 g2 = new Dygraph(
199 document.getElementById(&quot;graphdiv2&quot;),
200 &quot;temperatures.csv&quot;, // path to CSV file
201 {} // options
202 );
078d1d29
DV
203&lt;/script&gt;
204&lt;/body&gt;
205&lt;/html&gt;
206</pre>
15c966e0 207 </code>
68f9bed3
AK
208 </div>
209 <div class="codeoutput" style="float:left;">
15c966e0
AK
210 <h3 style="text-align:center">OUTPUT</h3>
211 <div id="graphdiv2" style="width:500px; height:300px;"></div>
212 <script type="text/javascript">
213 g2 = new Dygraph(
214 document.getElementById("graphdiv2"),
215 "temperatures.csv",
216 {}
217 );
218 </script>
68f9bed3 219 </div>
15c966e0 220 </div>
68f9bed3 221
15c966e0 222 <p style="clear:both;">The file used is <code><a href="temperatures.csv">temperatures.csv</a></code>.</p>
68f9bed3 223
15c966e0 224 <p>There are a few things to note here:</p>
68f9bed3 225
15c966e0 226 <ul>
68f9bed3
AK
227 <li>The Dygraph sent off an XHR to get the temperatures.csv file.</li>
228 <li>The labels were taken from the first line of <code>temperatures.csv</code>, which is <code>Date,High,Low</code>.</li>
229 <li>The Dygraph automatically chose two different, easily-distinguishable colors for the two data series.</li>
230 <li>The labels on the x-axis have switched from days to months. If you zoom in, they'll switch to weeks and then days.</li>
231 <li>Some heuristics are used to determine a good vertical range for the data. The idea is to make all the data visible and have human-friendly values on the axis (i.e. 200 instead of 193.4). Generally this works well.</li>
232 <li>The data is very spiky. A moving average would be easier to interpret.</li>
15c966e0 233 </ul>
68f9bed3 234
15c966e0 235 <p>This problem can be fixed by specifying the appropriate options in the "additional options" parameter to the Dygraph constructor. To set the number of days for a moving average, use the <code>rollPeriod</code> option. Here's how it's done:</p>
68f9bed3 236
15c966e0 237 <div class="example" style="clear:both;">
68f9bed3 238 <div class="codeblock" style="float:left;width:400px;">
15c966e0
AK
239 <h3 style="text-align:center">HTML</h3>
240 <code>
68f9bed3 241<pre>
078d1d29
DV
242&lt;html&gt;
243&lt;head&gt;
68f9bed3 244&lt;script type=&quot;text/javascript&quot;
15c966e0 245 src=&quot;dygraph-combined.js&quot;&gt;&lt;/script&gt;
078d1d29
DV
246&lt;/head&gt;
247&lt;body&gt;
68f9bed3 248&lt;div id=&quot;graphdiv3&quot;
15c966e0 249 style=&quot;width:500px; height:300px;&quot;&gt;&lt;/div&gt;
68f9bed3 250&lt;script type=&quot;text/javascript&quot;&gt;
15c966e0
AK
251 g3 = new Dygraph(
252 document.getElementById(&quot;graphdiv3&quot;),
253 &quot;temperatures.csv&quot;,
254 {
255 rollPeriod: 7,
256 showRoller: true
257 }
258 );
078d1d29
DV
259&lt;/script&gt;
260&lt;/body&gt;
261&lt;/html&gt;
262</pre>
15c966e0 263 </code>
68f9bed3
AK
264 </div>
265 <div class="codeoutput" style="float:left;">
15c966e0
AK
266 <h3 style="text-align:center">OUTPUT</h3>
267 <div id="graphdiv3" style="width:500px; height:300px;"></div>
268 <script type="text/javascript">
269 g3 = new Dygraph(
270 document.getElementById("graphdiv3"),
271 "temperatures.csv",
272 {
273 rollPeriod: 7,
274 showRoller: true
275 }
276 );
277 </script>
68f9bed3 278 </div>
15c966e0
AK
279 </div>
280
281 <p style="clear:both;">A rolling average can be set using the text box in the lower left-hand corner of the graph (the showRoller attribute is what makes this appear). Also note that we've explicitly set the size of the chart div.</p>
68f9bed3 282
15c966e0 283 <h2>Error Bars</h2>
68f9bed3 284
15c966e0 285 <p>Another significant feature of the dygraphs library is the ability to display error bars around data series. One standard deviation must be specified for each data point. A <em>&plusmn;n</em> sigma band will be drawn around the data series at that point. If a moving average is being displayed, dygraphs will compute the standard deviation of the average at each point. I.E. <em>&sigma; = sqrt( (&sigma;<sub>1<sup>2</sup></sub> + &sigma;<sub>2<sup>2</sup></sub> + ... + &sigma;<sub>n<sup>2</sup></sub>) / n )</em></p>
68f9bed3 286
15c966e0 287 <p>Here's a demonstration. There are two data series. One is <code>N(100,10)</code> with a standard deviation of 10 specified at each point. The other is <code>N(80,20)</code> with a standard deviation of 20 specified at each point. The CSV file was generated using Octave and can be viewed at <a href="twonormals.csv">twonormals.csv</a>.</p>
68f9bed3 288
15c966e0 289 <div class="example" style="clear:both;">
68f9bed3 290 <div class="codeblock" style="float:left;width:400px;">
15c966e0
AK
291 <h3 style="text-align:center">HTML</h3>
292 <code>
68f9bed3 293<pre>
078d1d29
DV
294&lt;html&gt;
295&lt;head&gt;
68f9bed3 296&lt;script type=&quot;text/javascript&quot;
15c966e0 297 src=&quot;combined.js&quot;&gt;&lt;/script&gt;
078d1d29
DV
298&lt;/head&gt;
299&lt;body&gt;
68f9bed3 300&lt;div id=&quot;graphdiv4&quot;
15c966e0 301 style=&quot;width:600px; height:300px;&quot;&gt;&lt;/div&gt;
68f9bed3 302&lt;script type=&quot;text/javascript&quot;&gt;
15c966e0
AK
303 g4 = new Dygraph(
304 document.getElementById(&quot;graphdiv4&quot;),
305 &quot;twonormals.csv&quot;,
306 {
307 rollPeriod: 7,
308 showRoller: true,
309 errorBars: true,
310 valueRange: [50,125]
311 }
312 );
078d1d29
DV
313&lt;/script&gt;
314&lt;/body&gt;
315&lt;/html&gt;
316</pre>
15c966e0 317 </code>
68f9bed3
AK
318 </div>
319 <div class="codeoutput" style="float:left;">
15c966e0
AK
320 <h3 style="text-align:center">OUTPUT</h3>
321 <div id="graphdiv4" style="width:600px; height:300px;"></div>
322 <script type="text/javascript">
323 g4 = new Dygraph(
324 document.getElementById("graphdiv4"),
325 "twonormals.csv",
326 {
327 rollPeriod: 7,
328 showRoller: true,
329 errorBars: true,
330 valueRange: [50,125]
331 }
332 );
333 </script>
68f9bed3 334 </div>
15c966e0 335 </div>
68f9bed3 336
15c966e0
AK
337 <p style="clear:both;">Things to note here:</p>
338
339 <ul>
68f9bed3
AK
340 <li>The <strong>errorBars</strong> option affects both the interpretation of the CSV file and the display of the graph. When <strong>errorBars</strong> is set to true, each line is interpreted as <em>YYYYMMDD</em>, <em>A</em>, <em>sigma_A</em>, <em>B</em>, <em>sigma_B</em>, &hellip;</li>
341 <li>The first line of the CSV file doesn't mention the error columns. In this case, it's just "Date,Series1,Series2".</li>
342 <li>The averaging visibly affects the error bars. This is most clear if you crank up the rolling period to something like 100 days. For the earliest dates, there won't be 100 data points to average so the signal will be noisier. The error bars get smaller like sqrt(N) going forward in time until there's a full 100 points to average.</li>
343 <li>The error bars are partially transparent. This can be seen when they overlap one another.</li>
15c966e0 344 </ul>
68f9bed3 345
15c966e0 346 <h2 id="ie">Internet Explorer Compatibility</h2>
68f9bed3 347
15c966e0 348 <p>The dygraphs library relies heavily on HTML's <code>&lt;canvas&gt;</code> tag, which Microsoft Internet Explorer does not support. Fortunately, some clever engineers created the <a href="http://code.google.com/p/explorercanvas/">excanvas</a> library, which implements the <code>&lt;canvas&gt;</code> tag in IE using VML.</p>
435c59c9 349
15c966e0 350 <p>You can add IE support to any page using dygraphs by including the following in your page:</p>
435c59c9
DV
351
352<pre>
353&lt;head&gt;
15c966e0 354 &lt;!--[if IE]&gt;&lt;script src="excanvas.js"&gt;&lt;/script&gt;&lt;![endif]--&gt;
435c59c9
DV
355&lt;/head&gt;
356</pre>
357
15c966e0 358 <p>This works quite well in practice. Charts are responsive, even under VML emulation.</p>
435c59c9 359
15c966e0 360 <p>One common gotcha to look out for: make sure you don't have any trailing commas in parameter lists, e.g.</p>
435c59c9 361
68f9bed3
AK
362<pre>
363new Dygraph(el, data, {
15c966e0 364 showRoller: true, // note trailing comma
435c59c9
DV
365})</pre>
366
68f9bed3 367 <p>Most browsers will ignore the trailing comma, but it will break under IE.</p>
aaa21dc9 368
68f9bed3 369 <h2 id="gviz">GViz Data</h2>
435c59c9 370
15c966e0 371 <p>The <a href="http://code.google.com/apis/visualization/documentation/index.html">Google Visualization API</a> provides a standard interface for describing data. Once you've specified your data using this API, you can plug in any GViz-compatible visualization. dygraphs is such a visualization.</p>
36676109 372
68f9bed3 373 <p>For a simple demonstration of how to use dygraphs a GViz visualization, see <a href="http://danvk.org/dygraphs/tests/gviz.html">http://danvk.org/dygraphs/tests/gviz.html</a>. dygraphs can also be used as a GViz gadget. This allows it to be embedded inside of a Google Spreadsheet. For a demonstration of this, see <a href="http://spreadsheets.google.com/ccc?key=0Anx1yCqeL8YUdDR1c3pPREhraGhkWmdhaURjOXRncXc&amp;hl=en">this spreadsheet</a>. The URL for the gadget is <code><a href="http://danvk.org/dygraphs/gadget.xml">http://danvk.org/dygraphs/gadget.xml</a></code>.</p>
36676109 374
68f9bed3 375 <p>Here's an example of a published gviz gadget using dygraphs:</p>
a87e8e01 376
15c966e0 377 <script src="http://spreadsheets.google.com/gpub?url=http%3A%2F%2Fkb8jbn8l90ocl9n4b14jrcvp61ceqis5.spreadsheets.gmodules.com%2Fgadgets%2Fifr%3Fup__table_query_url%3Dhttp%253A%252F%252Fspreadsheets.google.com%252Ftq%253Frange%253DA1%25253AC31%2526headers%253D-1%2526key%253D0Anx1yCqeL8YUdDR1c3pPREhraGhkWmdhaURjOXRncXc%2526gid%253D0%2526pub%253D1%26up__table_query_refresh_interval%3D300%26url%3Dhttp%253A%252F%252Fdanvk.org%252Fdygraphs%252Fgadget.xml%253Fnocache&height=215&width=530"></script>
a87e8e01 378
68f9bed3 379 <h2 id="baseball">Charting Fractions</h2>
15c966e0 380
68f9bed3
AK
381 <p>Situations often arise where you want to plot fractions, e.g. the fraction of respondents in a poll who said they'd vote for candidate X or the number of hits divided by at bats (baseball's batting average). Fractions require special treatment for two main reasons:</p>
382
383 <ul>
15c966e0
AK
384 <li>The average of <code>a1/b1</code> and <code>a2/b2</code> is <code>(a1+a2)/(b1+b2)</code>, not <code>(a1/b1 + a2/b2)/2</code>.</li>
385 <li>The normal approximation is not always applicable and more sophisticated confidence intervals (e.g. the <a href="http://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval">Wilson confidence interval</a>) must be employed to avoid ratios that exceed 100% or go below 0%.</li>
68f9bed3
AK
386 </ul>
387
388 <p>Fortunately, dygraphs handles both of these for you! Here's a chart and the command that generated it:</p>
389
390 <div style="width:750px; text-align:center; font-weight: bold; font-size: 125%;">Batting Average for Ichiro Suzuki vs. Mariners (2004)</div>
391 <div id="baseballdiv" style="width:750px; height:300px;"></div>
392 <script type="text/javascript">
15c966e0
AK
393 new Dygraph(
394 document.getElementById("baseballdiv"),
395 "suzuki-mariners.txt",
396 {
397 fractions: true,
398 errorBars: true,
399 showRoller: true,
400 rollPeriod: 15
401 }
402 );
68f9bed3
AK
403 </script>
404
405 <p>Command:</p>
a87e8e01 406<pre>
15c966e0 407 new Dygraph(
68f9bed3
AK
408 document.getElementById(&quot;baseballdiv&quot;),
409 &quot;suzuki-mariners.txt&quot;,
410 {
15c966e0
AK
411 fractions: true,
412 errorBars: true,
413 showRoller: true,
414 rollPeriod: 15
68f9bed3 415 }
15c966e0 416 );
a87e8e01
DV
417</pre>
418
68f9bed3
AK
419 <p>The <code>fractions</code> option indicates that the values in each column should be parsed as fractions (e.g. "1/2" instead of "0.5"). The <code>errorBars</code> option indicates that we'd like to see a confidence interval around each data point. By default, when <code>fractions</code> is set, you get a Wilson confidence interval. If you look carefully at the chart, you can see that the error bars are asymmetric.</p>
420
421 <p>A couple things to notice about this chart:</p>
15c966e0 422
68f9bed3 423 <ul>
15c966e0
AK
424 <li>The error bars for Ichiro's batting average are larger than for the Mariners', since he has far fewer at bats than his team.</li>
425 <li>dygraphs makes it easy to see "batting average over the last 30 games". This is ordinarily quite difficult to compute. It makes it clear where the "hot" and "cold" part of Suzuki's season were.</li>
426 <li>If you set the averaging period to something large, like 200, you'll see the team's and player's batting average through that game. The final number is the overall batting average for the season.</li>
427 <li>Where the error bars do not overlap, we can say with 95% confidence that the series differ. There is a better than 95% chance that Ichiro was a better hitter than his team as a whole in 2004, the year he won the batting title.</li>
68f9bed3
AK
428 </ul>
429
430 <h2 id="stock">One last demo</h2>
431
432 <p>This chart shows monthly closes of the Dow Jones Industrial Average, both in nominal and real (i.e. adjusted for inflation) dollars. The shaded areas show its monthly high and low. CPI values with a base from 1982-84 are used to adjust for inflation.</p>
433
434 <div id="dow_chart" style="width:900px; height:350px;"></div>
7ffbfdc1
DV
435 <p><b>Display: </b>
436 <input type=checkbox id=0 onClick="stockchange(this)" checked>
437 <label for="0"> Nominal</label>
438 <input type=checkbox id=1 onClick="stockchange(this)" checked>
439 <label for="1"> Real</label>
440 </p>
441
68f9bed3 442 <script type="text/javascript">
15c966e0 443 // From http://www.econstats.com/eqty/eq_d_mi_3.csv
7ffbfdc1 444 stockchart = new Dygraph(
15c966e0
AK
445 document.getElementById('dow_chart'),
446 "dow.txt",
447 {
448 showRoller: true,
449 customBars: true,
450 labelsKMB: true
451 }
452 );
7ffbfdc1
DV
453
454 function stockchange(el) {
455 stockchart.setVisibility(el.id, el.checked);
456 }
68f9bed3 457 </script>
94a2e379
DV
458<!--
459
460Here is a script to regenerate the Dow Jones plot:
461
462# Get unadjusted DJIA data in a nice format:
463curl -O http://www.econstats.com/eqty/eq_d_mi_3.csv
464sed '1,17d' eq_d_mi_3.csv | cut -d, -f1,6 | perl -pe 's/(\d{4}-\d\d)-\d\d/$1/g' | perl -pe 's/, */\t/' | grep -v 'na' | perl -ne 'chomp; ($m,$v) = split/\t/; $close{$m} = $v; if ($low{$m} == 0 || $v < $low{$m}) { $low{$m}=$v } if ($v > $high{$m}) { $high{$m} = $v } END { for $x(sort keys %close) { print "$x\t$low{$x}\t$close{$x}\t$high{$x}\n" } } ' > monthly-djia.tsv
465
466# Fetch and format the CPI data:
467curl 'http://data.bls.gov/PDQ/servlet/SurveyOutputServlet?series_id=CUUR0000SA0&years_option=all_years&periods_option=all_periods&output_type=column&output_format=text&delimiter=comma' > cpi-u.txt
468sed '1,/Series Id,Year,/d' cpi-u.txt | sed '/^$/,$d' | cut -d, -f2,3,4 | perl -ne 'print if /,M(0[0-9]|1[012]),/' | perl -pe 's/(\d{4}),M(\d{2}),/$1-$2\t/g' > cpi-u.tsv
469
470# Merge:
15c966e0 471join -t' ' cpi-u.tsv monthly-djia.tsv > annotated-djia.tsv
94a2e379
DV
472perl -ne 'BEGIN{print "Month,Nominal,Real\n"} chomp; ($m,$cpi,$low,$close,$high) = split /\t/; $cpi /= 100.0; print "$m-15,$low;$close;$high,",($low/$cpi),";",($close/$cpi),";",($high/$cpi),"\n"' annotated-djia.tsv > dow.txt
473
474-->
353a0294 475
68f9bed3
AK
476 <h2 id="options">Other Options</h2>
477
7e6fad88 478 <p>These are the options that can be passed in through the optional third parameter of the Dygraph constructor. Under each option is a set of links to tests which demonstrate its use. While we attempt to keep this list up-to-date, a more complete list can be found in the <code>Dygraph.DEFAULT_ATTRS</code> map in <code>dygraph.js</code> and the <code>this.options</code> map in <code>dygraph-canvas.js</code>.</p>
68f9bed3
AK
479
480 <table class="thinborder" width="900">
15c966e0
AK
481 <thead>
482 <tr>
483 <th width="150">Name</th>
0c75dc72
DV
484 <th width="200">Values</th>
485 <th width="150">Default</th>
486 <th>Description</th>
15c966e0
AK
487 </tr>
488 </thead>
489 <tbody>
490 <tr>
491 <td><strong>includeZero</strong></td>
492 <td><code>boolean</code></td>
493 <td><code>false</code></td>
dde90a16 494 <td>Usually, dygraphs will use the range of the data plus some padding to set the range of the y-axis. If this option is set, the y-axis will always include zero, typically as the lowest value. This can be used to avoid exaggerating the variance in the data.
939ecc46 495 <div class="tests">Tests: <a href="tests/no-range.html">no-range</a> <a href="tests/numeric-gviz.html">numeric-gviz</a> <a href="tests/small-range-zero.html">small-range-zero</a> </div>
dde90a16 496 </td>
15c966e0
AK
497 </tr>
498 <tr>
499 <td><strong>rollPeriod</strong></td>
8c851a1b 500 <td><code>integer &gt;= 1</code></td>
15c966e0 501 <td><code>1</code></td>
dde90a16 502 <td>Number of days over which to average data. Discussed extensively above.
939ecc46 503 <div class="tests">Tests: <a href="tests/demo.html">demo</a> <a href="tests/two-series.html">two-series</a> <a href="tests/noise.html">noise</a> </div>
dde90a16 504 </td>
15c966e0
AK
505 </tr>
506 <tr>
507 <td><strong>showRoller</strong></td>
508 <td><code>boolean</code></td>
509 <td><code>false</code></td>
dde90a16 510 <td>If the rolling average period text box should be shown.
1bc2103a 511 <div class="tests">Tests: <a href="tests/callback.html">callback</a> <a href="tests/crosshair.html">crosshair</a> <a href="tests/fractions.html">fractions</a> <a href="tests/isolated-points.html">isolated-points</a> <a href="tests/numeric-gviz.html">numeric-gviz</a> <a href="tests/underlay-callback.html">underlay-callback</a> <a href="tests/highlighted-region.html">highlighted-region</a></div>
dde90a16 512 </td>
15c966e0
AK
513 </tr>
514 <tr>
515 <td><strong>colors</strong></td>
516 <td><code>['red', '#00FF00']</code></td>
517 <td><code></code></td>
dde90a16 518 <td>List of colors for the data series. These can be of the form "#AABBCC" or "rgb(255,100,200)" or "yellow", etc. If not specified, equally-spaced points around a color wheel are used.
939ecc46 519 <div class="tests">Tests: <a href="tests/color-visibility.html">color-visibility</a> <a href="tests/demo.html">demo</a> </div>
dde90a16 520 </td>
15c966e0
AK
521 </tr>
522 <tr>
8c851a1b
DV
523 <td><strong>fillGraph</strong></td>
524 <td><code>boolean<br/></code></td>
f3975624 525 <td><code>false</code></td>
8c851a1b 526 <td>Should the area underneath the graph be filled? This option is not
dde90a16 527 compatible with error bars.
939ecc46 528 <div class="tests">Tests: <a href="tests/fillGraph.html">fillGraph</a> </div>
dde90a16 529 </td>
8c851a1b
DV
530 </tr>
531 <tr>
0c75dc72
DV
532 <td><strong>visibility</strong></td>
533 <td><code>Array of booleans<br/></code></td>
534 <td><code>[true, true, ...]</code></td>
535 <td>Which series should initially be visible? Once the Dygraph has
536 been constructed, you can access and modify the visibility of each
537 series using the <code>visibility</code> and
dde90a16 538 <code>setVisibility</code> methods.
939ecc46 539 <div class="tests">Tests: <a href="tests/visibility.html">visibility</a> <a href="tests/color-visibility.html">color-visibility</a> </div>
0c75dc72
DV
540 </td>
541 </tr>
542 <tr>
15c966e0
AK
543 <td><strong>colorSaturation</strong></td>
544 <td><code>0.0 - 1.0</code></td>
545 <td><code>1.0</code></td>
dde90a16 546 <td>If <strong>colors</strong> is not specified, saturation of the automatically-generated data series colors.
bf5b5f4d 547 <div class="tests">Tests: <font color=red>none</font></div>
dde90a16 548 </td>
15c966e0
AK
549 </tr>
550 <tr>
551 <td><strong>colorValue</strong></td>
552 <td><code>float (0.0 &mdash; 1.0)</code></td>
553 <td><code>1.0</code></td>
dde90a16 554 <td>If colors is not specified, value of the data series colors, as in hue/saturation/value. (0.0-1.0, default 0.5)
bf5b5f4d 555 <div class="tests">Tests: <font color=red>none</font></div>
dde90a16 556 </td>
15c966e0
AK
557 </tr>
558 <tr>
559 <td><strong>clickCallback</strong></td>
560 <td><code>function(e, date){<br>&nbsp;&nbsp;&nbsp;&nbsp;alert(date);<br>}</code></td>
561 <td><code>null</code></td>
dde90a16 562 <td>A function to call when a data point is clicked. The function should take two arguments, the event object for the click and the date that was clicked. (default null)
939ecc46 563 <div class="tests">Tests: <a href="tests/callback.html">callback</a> </div>
dde90a16 564 </td>
15c966e0
AK
565 </tr>
566 <tr>
567 <td><strong>zoomCallback</strong></td>
0c75dc72 568 <td><code>function(minDate,<br/>maxDate){}</code></td>
15c966e0 569 <td><code>null</code></td>
dde90a16 570 <td>A function to call when the zoom window is changed (either by zooming in or out). minDate and maxDate are milliseconds since epoch.
939ecc46 571 <div class="tests">Tests: <a href="tests/callback.html">callback</a> </div>
dde90a16 572 </td>
15c966e0
AK
573 </tr>
574 <tr>
575 <td><strong>strokeWidth</strong></td>
576 <td><code>integer</code></td>
577 <td><code>1</code></td>
dde90a16 578 <td>Width of the data lines. This can be used to increase the contrast or some graphs.
bf5b5f4d 579 <div class="tests">Tests: <font color=red>none</font></div>
dde90a16 580 </td>
15c966e0
AK
581 </tr>
582 <tr>
583 <td><strong>dateWindow</strong></td>
584 <td><code>[<br>&nbsp;&nbsp;Date.parse('2006-01-01'),<br>&nbsp;&nbsp;(new Date()).valueOf()<br>]</code></td>
0c75dc72 585 <td rowspan="2"><code>Full range of the<br/> input is shown</code></td>
dde90a16 586 <td>Initially zoom in on a section of the graph. Is of the form [earliest, latest], where earliest/latest are milliseconds since epoch.
939ecc46 587 <div class="tests">Tests: <a href="tests/dateWindow.html">dateWindow</a> <a href="tests/link-interaction.html">link-interaction</a> </div>
dde90a16 588 </td>
15c966e0
AK
589 </tr>
590 <tr>
591 <td><strong>valueRange</strong></td>
592 <td><code>[10, 110]</code></td>
dde90a16 593 <td>Explicitly set the vertical range of the graph to [low, high].
bf5b5f4d 594 <div class="tests">Tests: <font color=red>none</font></div>
dde90a16 595 </td>
15c966e0
AK
596 </tr>
597 <tr>
598 <td><strong>labelsSeparateLines</strong></td>
599 <td><code>boolean</code></td>
600 <td><code>false</code></td>
dde90a16 601 <td>Put <code>&lt;br/&gt;</code> between lines in the label string. Often used in conjunction with <strong>labelsDiv</strong>.
939ecc46 602 <div class="tests">Tests: <a href="tests/customLabel.html">customLabel</a> <a href="tests/demo.html">demo</a> </div>
dde90a16 603 </td>
15c966e0
AK
604 </tr>
605 <tr>
606 <td><strong>labelsDiv</strong></td>
52fe05c1 607 <td><code style="font-size: small">document.getElementById('foo')</code><br/>or<br/><code>'foo'</code></td>
15c966e0 608 <td><code>null</code></td>
52fe05c1
SJ
609 <td style="vertical-align:top">Show data labels in an external div, rather than on the graph. This value can either be a div element or a div id.
610 <div class="tests">Tests: <a href="tests/label-div.html">label-div</a> </div>
611 </td>
612 </tr>
613 <tr>
614 <td><strong>labelsShowZeroValues</strong></td>
615 <td><code>boolean</code></td>
616 <td><code>true</code></td>
617 <td>Show zero value labels in the labelsDiv.
618 <div class="tests">Tests: <a href="tests/label-div.html">label-div</a> </div>
dde90a16 619 </td>
15c966e0
AK
620 </tr>
621 <tr>
622 <td><strong>labelsKMB</strong></td>
623 <td><code>true</code></td>
624 <td><code>false</code></td>
dde90a16 625 <td>Show K/M/B for thousands/millions/billions on y-axis.
939ecc46 626 <div class="tests">Tests: <a href="tests/demo.html">demo</a> <a href="tests/labelsKMB.html">labelsKMB</a> <a href="tests/no-range.html">no-range</a> </div>
dde90a16 627 </td>
15c966e0
AK
628 </tr>
629 <tr>
65914f5f
DV
630 <td><strong>labelsKMG2</strong></td>
631 <td><code>true</code></td>
632 <td><code>false</code></td>
633 <td>Show k/M/G for kilo/Mega/Giga on y-axis. This is different than
dde90a16 634 <code>labelsKMB</code> in that it uses base 2, not 10.
939ecc46 635 <div class="tests">Tests: <a href="tests/labelsKMB.html">labelsKMB</a> </div>
dde90a16 636 </td>
65914f5f
DV
637 </tr>
638 <tr>
15c966e0
AK
639 <td><strong>labelsDivWidth</strong></td>
640 <td><code>250</code></td>
641 <td><code></code></td>
dde90a16 642 <td>Width (in pixels) of the div which shows information on the currently-highlighted points.
939ecc46 643 <div class="tests">Tests: <a href="tests/customLabel.html">customLabel</a> </div>
dde90a16 644 </td>
15c966e0
AK
645 </tr>
646 <tr>
647 <td><strong>labelsDivStyles</strong></td>
648 <td><code>{}</code></td>
649 <td><code>null</code></td>
dde90a16 650 <td>Additional styles to apply to the currently-highlighted points div. For example, { 'font-weight': 'bold' } will make the labels bold.
939ecc46 651 <div class="tests">Tests: <a href="tests/border.html">border</a> <a href="tests/customLabel.html">customLabel</a> </div>
dde90a16 652 </td>
15c966e0
AK
653 </tr>
654 <tr>
655 <td><strong>highlightCircleSize</strong></td>
656 <td><code>integer</code></td>
657 <td><code>3</code></td>
dde90a16 658 <td>The size in pixels of the dot drawn over highlighted points.
939ecc46 659 <div class="tests">Tests: <a href="tests/grid_dot.html">grid_dot</a> </div>
dde90a16 660 </td>
15c966e0
AK
661 </tr>
662 <tr>
663 <td><strong>drawPoints</strong></td>
664 <td><code>boolean</code></td>
665 <td><code>false</code></td>
dde90a16 666 <td>Draw a small dot at each point, in addition to a line going through the point. This makes the individual data points easier to see, but can increase visual clutter in the chart.
939ecc46 667 <div class="tests">Tests: <a href="tests/draw-points.html">draw-points</a> </div>
dde90a16 668 </td>
15c966e0
AK
669 </tr>
670 <tr>
671 <td><strong>pointSize</strong></td>
672 <td><code>interger</code></td>
673 <td><code>1</code></td>
dde90a16 674 <td>The size of the dot to draw on each point in pixels (see drawPoints). A dot is always drawn when a point is "isolated", i.e. there is a missing point on either side of it. This also controls the size of those dots.
bf5b5f4d 675 <div class="tests">Tests: <font color=red>none</font></div>
dde90a16 676 </td>
15c966e0
AK
677 </tr>
678 <tr>
679 <td><strong>pixelsPerXLabel</strong></td>
680 <td rowspan="2"><code>integer</code></td>
681 <td><code>60</code></td>
dde90a16 682 <td rowspan="2">Number of pixels to require between each x- and y-label. Larger values will yield a sparser axis with fewer ticks.
939ecc46 683 <div class="tests">Tests: <a href="tests/spacing.html">spacing</a> </div>
dde90a16 684 </td>
15c966e0
AK
685 </tr>
686 <tr>
687 <td><strong>pixelsPerYLabel</strong></td>
688 <td><code>30</code></td>
689 </tr>
690 <tr>
691 <td><strong>xAxisLabelWidth</strong></td>
692 <td rowspan="2"><code>integer</code></td>
693 <td><code></code></td>
dde90a16 694 <td rowspan="2">Width (in pixels) of the x- and y-axis labels.
939ecc46 695 <div class="tests">Tests: <a href="tests/customLabel.html">customLabel</a> </div>
dde90a16 696 </td>
15c966e0
AK
697 </tr>
698 <tr>
699 <td><strong>yAxisLabelWidth</strong></td>
700 <td><code></code></td>
701 </tr>
702 <tr>
703 <td><strong>axisLabelFontSize</strong></td>
704 <td><code>integer</code></td>
705 <td><code>14</code></td>
dde90a16 706 <td>Size of the font (in pixels) to use in the axis labels, both x- and y-axis.
bf5b5f4d 707 <div class="tests">Tests: <font color=red>none</font></div>
dde90a16 708 </td>
15c966e0
AK
709 </tr>
710 <tr>
31eddad3
AV
711 <td><strong>xAxisLabelFormatter</strong></td>
712 <td><code>function(date, granularity)</code></td>
713 <td><code>Dygraph.dateAxisFormatter</code></td>
714 <td>Function to call to format values along the x axis.
715 <div class="tests">Tests: <a href="tests/x-axis-formatter.html">xAxisLabelFormatter</a></div>
716 </td>
717 <tr>
15c966e0
AK
718 <td><strong>rightGap</strong></td>
719 <td><code>integer</code></td>
720 <td><code></code></td>
dde90a16 721 <td>Number of pixels to leave blank at the right edge of the Dygraph. This makes it easier to highlight the right-most data point.
bf5b5f4d 722 <div class="tests">Tests: <font color=red>none</font></div>
dde90a16 723 </td>
15c966e0
AK
724 </tr>
725 <tr>
726 <td><strong>errorBars</strong></td>
727 <td><code>boolean</code></td>
728 <td><code>false</code></td>
dde90a16 729 <td>Does the data contain standard deviations? Setting this to true alters the input format (see above).
939ecc46 730 <div class="tests">Tests: <a href="tests/noise.html">noise</a> <a href="tests/customLabel.html">customLabel</a> <a href="tests/draw-points.html">draw-points</a> <a href="tests/fillGraph.html">fillGraph</a> <a href="tests/fractions.html">fractions</a> </div>
dde90a16 731 </td>
15c966e0
AK
732 </tr>
733 <tr>
734 <td><strong>sigma</strong></td>
735 <td><code>integer</code></td>
736 <td><code></code></td>
dde90a16 737 <td>When errorBars is set, shade this many standard deviations above/below each point.
bf5b5f4d 738 <div class="tests">Tests: <font color=red>none</font></div>
dde90a16 739 </td>
15c966e0
AK
740 </tr>
741 <tr>
742 <td><strong>fractions</strong></td>
743 <td><code>boolean</code></td>
744 <td><code>false</code></td>
dde90a16 745 <td>When set, attempt to parse each cell in the CSV file as "a/b", where a and b are integers. The ratio will be plotted. This allows computation of Wilson confidence intervals (see below).
939ecc46 746 <div class="tests">Tests: <a href="tests/fractions.html">fractions</a> </div>
dde90a16 747 </td>
15c966e0
AK
748 </tr>
749 <tr>
750 <td><strong>wilsonInterval</strong></td>
751 <td><code>boolean</code></td>
752 <td><code>true</code></td>
dde90a16 753 <td>Use in conjunction with the "fractions" option. Instead of plotting +/- N standard deviations, dygraphs will compute a Wilson confidence interval and plot that. This has more reasonable behavior for ratios close to 0 or 1.
bf5b5f4d 754 <div class="tests">Tests: <font color=red>none</font></div>
dde90a16 755 </td>
15c966e0
AK
756 </tr>
757 <tr>
758 <td><strong>customBars</strong></td>
759 <td><code>boolean</code></td>
760 <td><code>false</code></td>
dde90a16 761 <td>When set, parse each CSV cell as "low;middle;high". Error bars will be drawn for each point between low and high, with the series itself going through middle.
939ecc46 762 <div class="tests">Tests: <a href="tests/custom-bars.html">custom-bars</a> <a href="tests/zero-series.html">zero-series</a> </div>
dde90a16 763 </td>
15c966e0 764 </tr>
85cda1ca
DV
765
766 <tr>
767 <td><strong>drawCallback</strong></td>
768 <td><code>function(dygraph, is_initial)</code></td>
769 <td><code>null</code></td>
770 <td>When set, this callback gets called every time the dygraph is drawn. This includes the initial draw, after zooming and repeatedly while panning. The first parameter is the dygraph being drawn. The second is a boolean value indicating whether this is the initial draw.
2322a4ca 771 <div class="tests">Tests: <a href="tests/callback.html">callback</a> <a href="tests/synchronize.html">synchronize</a> </div>
85cda1ca
DV
772 </td>
773 </tr>
774
775 <tr>
776 <td><strong>gridLineColor</strong></td>
777 <td><code>red, blue</code></td>
778 <td><code>rgb(128,128,128)</code></td>
779 <td>The color of the gridlines.
2322a4ca 780 <div class="tests">Tests: <a href="tests/grid_dot.html">grid_dot</a> </div>
85cda1ca
DV
781 </td>
782 </tr>
783
784 <tr>
785 <td><strong>highlightCallback</strong></td>
786 <td><code>function(event, x, points)</code></td>
a4c6a67c 787 <td><code>null</code></td>
85cda1ca 788 <td>When set, this callback gets called every time a new point is highlighted. The parameters are the JavaScript mousemove event, the x-coordinate of the highlighted points and an array of highlighted points: <code>[ {name: 'series', yval: y-value}, &hellip; ]</code>
2322a4ca 789 <div class="tests">Tests: <a href="tests/callback.html">callback</a> <a href="tests/crosshair.html">crosshair</a> </div>
a4c6a67c
AV
790 </td>
791 </tr>
792
793 <tr>
794 <td><strong>unhighlightCallback</strong></td>
795 <td><code>function(event)</code></td>
796 <td><code>null</code></td>
797 <td>When set, this callback gets called every time the user stops highlighting any point by mousing out of the graph. The parameter is the mouseout event.
798 <div class="tests">Tests: <a href="tests/callback.html">callback</a> <a href="tests/crosshair.html">crosshair</a> </div>
85cda1ca
DV
799 </td>
800 </tr>
801
802 <tr>
803 <td><strong>strokeWidth</strong></td>
804 <td><code>0.5, 2.0</code></td>
805 <td><code>1.0</code></td>
806 <td>The width of the lines connecting data points.
2322a4ca 807 <div class="tests">Tests: <a href="tests/grid_dot.html">grid_dot</a> </div>
85cda1ca
DV
808 </td>
809 </tr>
810
811 <tr>
812 <td><strong>width</strong></td>
813 <td rowspan="2"><code>integer</code></td>
814 <td><code>480</code></td>
815 <td rowspan="2">Width/Height (in pixels) of the chart. If the container div has been explicitly sized, these attributes will be ignored.
2322a4ca 816 <div class="tests">Tests: <a href="tests/demo.html">demo</a> <a href="tests/link-interaction.html">link-interaction</a> <a href="tests/no-range.html">no-range</a> </div>
85cda1ca
DV
817 </td>
818 </tr>
819 <tr>
820 <td><strong>height</strong></td>
821 <td><code>320</code></td>
822 </tr>
823
15c966e0 824 </tbody>
68f9bed3
AK
825 </table>
826
827 <h2>Common Gotchas</h2>
828
829 <p>Here are a few problems that I've frequently run into while using the dygraphs library.</p>
830
831 <ul>
dde90a16 832 <li>If your chart doesn't display, be sure to check your browser's JavaScript error console. dygraphs makes every attempt to log errors and warnings, and these can often guide you in the right direction.</li>
15c966e0
AK
833 <li>Make sure your CSV files are readable! If your graph isn't showing up, the XMLHttpRequest for the CSV file may be failing. You can determine whether this is the case using tools like <a href="http://www.getfirebug.com/">Firebug</a>.</li>
834 <li>Make sure your CSV files are in the correct format. They must be of the form <code>YYYYMMDD, series1, series2, </code>&hellip; . And if you set the <code>errorBars</code> property, make sure you alternate data series and standard deviations.</li>
835 <li>dygraphs are not happy when placed inside a <code>&lt;center&gt;</code> tag. This applies to the CSS <code>text-align</code> property as well. If you want to center a Dygraph, put it inside a table with <code>align = center</code> set.</li>
836 <li>Don't set the <code>dateWindow</code> property to a date. It expects milliseconds since epoch, which can be obtained from a JavaScript Date object's valueOf method.</li>
837 <li>Make sure you don't have any trailing commas in your call to the Dygraph constructor or in the options parameter. Firefox, Chrome and Safari ignore these but they can cause a graph to not display in Internet Explorer.</li>
68f9bed3
AK
838 </ul>
839
71ac4733
AV
840 <h2 id="gwt">GWT Compatibility</h2>
841 <p>There is currently no GWT wrapper around Dygraphs, however there is a class that can be used to easily load Dygraphs into the browser. To use it, include the generated dygraph-gwt.jar file in your classpath and add the following line to your GWT module:</p>
842
843<pre>
844&lt;inherits name=&quot;org.danvk.dygraphs&quot;/&gt;
845</pre>
846
847 <p>Call org.danvk.Dygraphs.install() when your application starts to install the JavaScript code into the browser. You can use <a href="http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsJSNI.html">JSNI</a> to call Dygraphs from your GWT code, as in the example below. The example uses the <a href="http://code.google.com/p/gwt-google-apis/wiki/VisualizationGettingStarted">Visualization API for GWT</a> and the <a href="#gviz">Dygraphs GViz API.</a></p>
848
849<pre>
fb369f35 850 public static native JavaScriptObject drawDygraph(Element element, DataTable dataTable, double minY, double maxY) /*-{
71ac4733
AV
851 var chart = new $wnd.Dygraph.GVizChart(element);
852 chart.draw(dataTable,
853 {
854 valueRange: [minY, maxY]
855 });
856 return chart;
857 }-*/;
858</pre>
859
68f9bed3 860 <h2 id="policy">Data Policy</h2>
15c966e0 861 <p>dygraphs is purely client-side JavaScript. It does not send your data to any servers &ndash; the data is processed entirely in the client's browser.</p>
2739bb8f 862
68f9bed3 863 <p style="font-size:0.8em">Created May 9, 2008 by <a href=mailto:danvdk@gmail.com>Dan Vanderkam</a></p>
15c966e0 864 </div>
fe57a69b 865
a9df40de 866
15c966e0
AK
867 <!-- Google Analytics -->
868 <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script>
869 <script type="text/javascript">_uacct = "UA-769809-1";urchinTracker();</script>
078d1d29 870</body>
65914f5f 871</html>