hack, hack
[dygraphs.git] / docs / index.html
CommitLineData
078d1d29
DV
1<html>
2 <head>
3 <title>dygraphs JavaScript Library</title>
4 <!--[if IE]>
5 <script type="text/javascript" src="excanvas.js"></script>
6 <![endif]-->
9f006dbf 7 <script type="text/javascript" src="dygraph-combined.js"></script>
078d1d29
DV
8 <style type="text/css">
9 .thinborder {
10 border-width: 1px;
11 border-spacing: 0px;
12 border-style: solid;
13 border-color: black;
14 border-collapse: collapse;
15 }
16 .thinborder td, .thinborder th {
17 border-width: 1px;
18 padding: 5px;
19 border-style: solid;
20 border-color: black;
21 }
22 </style>
23 </head>
24<body>
25 <center>
52e5492a
DV
26 <p><span style="font-size:28pt;">dygraphs JavaScript Library</span><br/>
27 <a href="http://code.google.com/p/dygraphs/">code.google.com/p/dygraphs</a></p>
078d1d29
DV
28 </center>
29
285a6bda 30<p>The dygraphs JavaScript library produces produces interactive, zoomable charts of time series.</p>
078d1d29
DV
31
32<h3>Features</h3>
33<ul>
34 <li>Plots time series without using an external server or Flash</li>
35 <li>Supports multiple data series</li>
36 <li>Supports error bands around data series</li>
37 <li>Displays values on mouseover</li>
38 <li>Interactive zoom</li>
39 <li>Adjustable averaging period</li>
40 <li>Customizable click-through actions</li>
285a6bda 41 <li>Compatible with the Google Visualization API</li>
078d1d29
DV
42</ul>
43
44<h3>Caveats</h3>
45<ul>
46 <li>Requires Firefox 1.5+ or Safari/WebKit 1.3+.</li>
04aa50fd 47 <li>Internet Explorer is poorly supported.</li>
078d1d29
DV
48</ul>
49
50<h2>Demo</h2>
51<font size=-1>(Mouse over to highlight individual values. Click and drag to zoom. Double-click to zoom out.)</font><br/>
52<table><tr><td>
53<div id="demodiv" style="width:480px; height:320px;"></div>
54</td><td valign=top>
52e5492a 55<div id="status" style="width:200px; font-size:0.8em; padding-top:5px;"></div>
078d1d29 56</td>
6153f697 57</tr></table>
078d1d29
DV
58<script type="text/javascript">
59 g = new DateGraph(
60 document.getElementById("demodiv"),
61 function() {
ca433857 62 var zp = function(x) { if (x < 10) return "0"+x; else return x; };
078d1d29
DV
63 var r = "date,parabola,line,another line,sine wave\n";
64 for (var i=1; i<=31; i++) {
ca433857 65 r += "200610" + zp(i);
078d1d29
DV
66 r += "," + 10*(i*(31-i));
67 r += "," + 10*(8*i);
68 r += "," + 10*(250 - 8*i);
69 r += "," + 10*(125 + 125 * Math.sin(0.3*i));
70 r += "\n";
71 }
72 return r;
73 },
74 null,
75 {
76 rollPeriod: 1,
77 labelsDiv: document.getElementById('status'),
78 labelsSeparateLines: true,
79 labelsKMB: true,
80 colors: ["hsl(180,60,50)",
81 "rgb(255,100,100)",
82 "#00DD55",
83 "rgba(50,50,200,0.4)"],
2a6bfbd4 84 padding: {left: 40, right: 30, top: 15, bottom: 15},
078d1d29
DV
85 }
86 );
87</script>
88
bb89f446
DV
89<p>For more demos, browse the dygraph <a href="tests/">tests</a> directory.</p>
90
078d1d29
DV
91<h2>Usage</h2>
92
285a6bda 93<p>The dygraphs library depends on two other JS libraries: <a href="http://www.mochikit.com/">MochiKit</a> and <a href="http://www.liquidx.net/plotkit/">PlotKit</a>. Rather than tracking down copies of these libraries, I recommend using a packed version of dygraphs that combines all three libraries into a single JS file. Either grab this file from dygraph project's <a href="http://code.google.com/p/dygraphs/downloads/list">downloads</a> page or create it yourself by <a href="http://code.google.com/p/dygraphs/source/checkout">checking out</a> a copy of the code and running:
078d1d29 94
9f006dbf 95<pre>./generate-combined.sh</pre>
078d1d29 96
9f006dbf 97<p>The combined JS file is now in <code>dygraph-combined.js</code>. Here's a basic example to get things started:</p>
078d1d29
DV
98
99<table>
100 <tr><th>HTML</th>
101 <td rowspan=2><img src=arrow.gif /></td>
102 <th>Output</th></tr>
103<tr>
104<td valign=top><pre>
105&lt;html&gt;
106&lt;head&gt;
107&lt;script type="text/javascript" src="combined.js"&gt;&lt;/script&gt;
108&lt;/head&gt;
109&lt;body&gt;
285a6bda 110&lt;div id="graphdiv"&gt;&lt;/div&gt;
078d1d29 111&lt;script type="text/javascript"&gt;
285a6bda 112 g = new Dygraph(
078d1d29 113 document.getElementById("graphdiv"), // containing div
285a6bda
DV
114 "Date,Temperature\n" + // CSV or path to a CSV file.
115 "20080507,75\n" +
116 "20080508,70\n" +
117 "20080509,80\n",
078d1d29
DV
118 );
119&lt;/script&gt;
120&lt;/body&gt;
121&lt;/html&gt;
122</pre>
123</td><td valign=top>
285a6bda 124 <div id="graphdiv"></div>
078d1d29 125 <script type="text/javascript">
285a6bda
DV
126 g = new Dygraph(
127 document.getElementById("graphdiv"), // containing div
128 "Date,Temperature\n" + // CSV or path to a CSV file.
129 "20080507,75\n" +
130 "20080508,70\n" +
131 "20080509,80\n"
132 );
078d1d29
DV
133 </script>
134</td></tr></table>
135
285a6bda 136<p>In order to keep this example self-contained, the second parameter is a function that returns CSV data. These lines <i>must</i> begin with a date in the form <i>YYYYMMDD</i>. In most applications, it makes more sense to include a CSV file instead. If the second parameter to the constructor is a string, 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&monthend=12&yearend=2007&req_city=NA&req_state=NA&req_statename=NA">Weather Underground</a>)</p>
078d1d29
DV
137
138<table>
139 <tr><th>HTML</th>
140 <td rowspan=2><img src=arrow.gif /></td>
141 <th>Output</th></tr>
142<tr>
143<td valign=top><pre>
144&lt;html&gt;
145&lt;head&gt;
146&lt;script type="text/javascript" src="combined.js"&gt;&lt;/script&gt;
147&lt;/head&gt;
148&lt;body&gt;
149&lt;div id="graphdiv" style="width:600px; height:300px;"&gt;&lt;/div&gt;
150&lt;script type="text/javascript"&gt;
285a6bda 151 g = new Dygraph(
078d1d29
DV
152 document.getElementById("graphdiv"),
153 "temperatures.csv", // path to CSV file
285a6bda 154 {} // additional options
078d1d29
DV
155 );
156&lt;/script&gt;
157&lt;/body&gt;
158&lt;/html&gt;
159</pre>
160</td><td valign=top>
161 <div id="graphdiv2" style="width:600px; height:300px;"></div>
162 <script type="text/javascript">
285a6bda 163 g2 = new Dygraph(
078d1d29 164 document.getElementById("graphdiv2"),
285a6bda 165 "temperatures.csv", {}
078d1d29
DV
166 );
167 </script>
168</td></tr></table>
169
170<p>Click <a href="temperatures.csv">here</a> to view the <code>temperatures.csv</code> file. There are a few things to note here:</p>
171
172<ul>
285a6bda
DV
173 <li>The Dygraph sent off an XHR to get the temperatures.csv file.</li>
174 <li>The labels were taken from the first line of <code>temperatures.csv</code>, which is <code>Date,High,Low</code>.</li>
175 <li>The Dygraph automatically chose two different, easily-distinguishable colors for the two data series.</li>
078d1d29 176 <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>
285a6bda 177 <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>
078d1d29
DV
178 <li>The data is very spiky. A moving average would be easier to interpret.</li>
179</ul>
180
285a6bda 181<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 <b>rollPeriod</b> option. Here's how it's done:</p>
078d1d29
DV
182
183<table>
184 <tr><th>HTML</th>
185 <td rowspan=2><img src=arrow.gif /></td>
186 <th>Output</th></tr>
187<tr>
188<td valign=top><pre>
189&lt;html&gt;
190&lt;head&gt;
191&lt;script type="text/javascript" src="combined.js"&gt;&lt;/script&gt;
192&lt;/head&gt;
193&lt;body&gt;
194&lt;div id="graphdiv" style="width:600px; height:300px;"&gt;&lt;/div&gt;
195&lt;script type="text/javascript"&gt;
285a6bda 196 g = new Dygraph(
078d1d29 197 document.getElementById("graphdiv"),
285a6bda 198 "temperatures.csv",
078d1d29 199 { rollPeriod: 7,
738fc797 200 showRoller: true,
078d1d29
DV
201 }
202 );
203&lt;/script&gt;
204&lt;/body&gt;
205&lt;/html&gt;
206</pre>
207</td><td valign=top>
208 <div id="graphdiv3" style="width:600px; height:300px;"></div>
209 <script type="text/javascript">
285a6bda 210 g3 = new Dygraph(
078d1d29 211 document.getElementById("graphdiv3"),
285a6bda 212 "temperatures.csv",
078d1d29 213 { rollPeriod: 7,
738fc797 214 showRoller: true,
078d1d29
DV
215 }
216 );
217 </script>
218</td></tr></table>
219
738fc797 220<p>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).</p>
078d1d29
DV
221
222<h2>Error Bars</h2>
285a6bda 223<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 +/-<i>n</i> 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. <i>&sigma;</i> = sqrt((<i>&sigma;_1</i>^2 + <i>&sigma;_2</i>^2 + ... + <i>&sigma;_n</i>^2)/<i>n</i>))</p>
078d1d29
DV
224
225<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 <a href="twonormals.csv">here</a>.</p>
226
227<table>
228 <tr><th>HTML</th>
229 <td rowspan=2><img src=arrow.gif /></td>
230 <th>Output</th></tr>
231<tr>
232<td valign=top><pre>
233&lt;html&gt;
234&lt;head&gt;
235&lt;script type="text/javascript"
236 src="combined.js"&gt;&lt;/script&gt;
237&lt;/head&gt;
238&lt;body&gt;
239&lt;div id="graphdiv"
240 style="width:800px; height:400px;"
241 &gt;&lt;/div&gt;
242&lt;script type="text/javascript"&gt;
243$ = document.getElementById;
285a6bda 244g = new Dygraph(
078d1d29
DV
245 $("graphdiv"),
246 "twonormals.csv",
078d1d29 247 { rollPeriod: 7,
738fc797 248 showRoller: true,
078d1d29
DV
249 errorBars: true,
250 valueRange: [50,125]
251 }
252);
253&lt;/script&gt;
254&lt;/body&gt;
255&lt;/html&gt;
256</pre>
257</td><td valign=top>
258 <div id="graphdiv4" style="width:800px; height:400px;"></div>
259 <script type="text/javascript">
260$ = document.getElementById;
285a6bda 261new Dygraph(
078d1d29
DV
262 document.getElementById("graphdiv4"),
263 "twonormals.csv",
078d1d29 264 { rollPeriod: 14,
738fc797 265 showRoller: true,
078d1d29
DV
266 errorBars: true,
267 valueRange: [50, 125]
268 }
269);
270 </script>
271</td></tr></table>
272
273<p>Things to note here:</p>
274<ul>
275 <li>The <b>errorBars</b> option affects both the interpretation of the CSV file and the display of the graph. When <b>errorBars</b> is set to true, each line is interpreted as <i>YYYYMMDD</i>,<i>A</i>,<i>sigma_A</i>,<i>B</i>,<i>sigma_B</i>,...</li>
276 <li>The first line of the CSV file doesn't mention the error columns. In this case, it's just "Date,Series1,Series2".</li>
277 <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>
278 <li>The error bars are partially transparent. This can be seen when they overlap one another.</li>
279</ul>
280
353a0294
DV
281<h2>One last demo</h2>
282
283<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>
284
285<div id=dow_chart style="width:1000px; height:400px;"></div>
286<script type="text/javascript">
287 // From http://www.econstats.com/eqty/eq_d_mi_3.csv
285a6bda 288 dow = new Dygraph(
353a0294
DV
289 document.getElementById('dow_chart'),
290 "dow.txt",
353a0294 291 {
738fc797 292 showRoller: true,
353a0294
DV
293 customBars: true,
294 labelsKMB: true,
295 padding: {left:30, right:30, top:5, bottom:5}
296 });
297</script>
94a2e379
DV
298<!--
299
300Here is a script to regenerate the Dow Jones plot:
301
302# Get unadjusted DJIA data in a nice format:
303curl -O http://www.econstats.com/eqty/eq_d_mi_3.csv
304sed '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
305
306# Fetch and format the CPI data:
307curl '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
308sed '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
309
310# Merge:
311join -t' ' cpi-u.tsv monthly-djia.tsv > annotated-djia.tsv
312perl -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
313
314-->
353a0294
DV
315
316
078d1d29 317<h2>Other Options</h2>
bb89f446 318<p>These are the options that can be passed in through the optional third parameter of the Dygraph constructor. To see demonstrations of many of these options, browse the <a href="tests/">dygraphs tests</a> directory.</p>
078d1d29
DV
319
320<table class=thinborder width=1000>
321 <tr><th>Name</th><th>Sample Value</th><th>Description</th></tr>
322 <tr>
7387b66c
DV
323 <td><b>includeZero</b></td>
324 <td><code>true, false</code></td>
325 <td>Usually, dygraphs will use the range of the data plus some padding to
326 set the range of the y-axis. If this option is set, the y-axis will always
327 include zero, typically as the lowest value. This can be used to avoid
328 exaggerating the variance in the data.</td>
329 </tr>
330
331 <tr>
078d1d29
DV
332 <td><b>rollPeriod</b></td>
333 <td><code>7</code></td>
334 <td>Number of days over which to average data. Discussed extensively above.</td>
672f92a0
DV
335 </tr>
336
337 <tr>
738fc797
DV
338 <td><b>showRoller</b></td>
339 <td><code>true</code></td>
340 <td>Should the rolling average period text box be shown? Default is false.</td>
672f92a0
DV
341 </tr>
342
343 <tr>
078d1d29
DV
344 <td><b>colors</b></td>
345 <td><code>['red',&nbsp;'#00FF00']</code></td>
346 <td>List of colors for the data series. These can be of the form "#AABBCC"
347 or "rgb(255,100,200)" or "yellow", etc. If not specified, equally-spaced
348 points around a color wheel are used.</td>
672f92a0
DV
349 </tr>
350
351 <tr>
078d1d29
DV
352 <td><b>colorSaturation</b></td>
353 <td><code>1.0</code></td>
354 <td>If <b>colors</b> is not specified, saturation of the
355 automatically-generated data series colors. (0.0-1.0, default:
356 1.0)</td>
672f92a0
DV
357 </tr>
358
359 <tr>
078d1d29
DV
360 <td><b>colorValue</b></td>
361 <td><code>0.5</code></td>
362 <td>If colors is not specified, value of the data series colors, as in
363 hue/saturation/value. (0.0-1.0, default 0.5)</td>
672f92a0
DV
364 </tr>
365
366 <tr>
078d1d29
DV
367 <td><b>clickCallback</b></td>
368 <td><code>function(e,date){ alert(date); }</code></td>
369 <td>A function to call when a data point is clicked. The function should take
370 two arguments, the event object for the click and the date that was
371 clicked. (default null)</td>
672f92a0
DV
372 </tr>
373
374 <tr>
375 <td><b>zoomCallback</b></td>
376 <td><code>function(minDate,maxDate) {}</code></td>
377 <td>A function to call when the zoom window is changed (either by zooming
378 in or out). minDate and maxDate are millis since epoch.</td>
379 </tr>
380
381 <tr>
078d1d29
DV
382 <td><b>strokeWidth</b></td>
383 <td><code>2.0</code></td>
384 <td>Width of the data lines. This can be used to increase the contrast or
385 some graphs. (default 1.0)</td>
672f92a0
DV
386 </tr>
387
388 <tr>
078d1d29 389 <td><b>dateWindow</b></td>
672f92a0 390 <td><code>[Date.parse('2006-01-01'),<br/>
078d1d29
DV
391 (new&nbsp;Date()).valueOf()]</code></td>
392 <td>Initially zoom in on a section of the graph. Is of the form [earliest,
393 latest], where earliest/latest are millis since epoch. By default, the
394 full range of the input is shown.</td>
672f92a0
DV
395 </tr>
396
397 <tr>
078d1d29
DV
398 <td><b>valueRange</b></td>
399 <td><code>[10, 110]</code></td>
400 <td>Explicitly set the vertical range of the graph to [low, high]. By
401 default, some clever heuristics are used (see above).</td>
672f92a0
DV
402 </tr>
403
404 <tr>
078d1d29
DV
405 <td><b>labelsSeparateLines</b></td>
406 <td><code>true</code></td>
407 <td>Put &lt;br/&gt; between lines in the label string. Often used in
408 conjunction with <b>labelsDiv</b>. (default false)</td>
672f92a0
DV
409 </tr>
410
411 <tr>
078d1d29
DV
412 <td><b>labelsDiv</b></td>
413 <td><code>document.getElementById('foo')</code></td>
414 <td>Show data labels in an external div, rather than on the graph. (default
415 null)</td>
672f92a0
DV
416 </tr>
417
418 <tr>
078d1d29
DV
419 <td><b>labelsKMB</b></td>
420 <td><code>true</code></td>
421 <td>Show K/M/B for thousands/millions/billions on y-axis (default
422 false).</td>
423 </tr>
672f92a0
DV
424
425 <tr>
426 <td><b>labelsDivWidth</b></td>
427 <td>250</td>
428 <td>Width (in pixels) of the div which shows information on the
429 currently-highlighted points.</td>
430 </tr>
431
432 <tr>
433 <td><b>labelsDivStyles</b></td>
434 <td>{}</td>
435 <td>Additional styles to apply to the currently-highlighted points div. For
436 example, { 'font-weigth': 'bold' } will make the labels bold.</td>
437 </tr>
438
439 <tr>
440 <td><b>highlightCircleSize</b></td>
441 <td><code>3</code></td>
442 <td>Size (in pixels) of the dot drawn over highlighted points (default 3).</td>
443 </tr>
444
445 <tr>
446 <td><b>pixelsPerXLabel</b>, <b>pixelsPerYLabel</b></td>
447 <td>50</td>
448 <td>Number of pixels to require between each x- and y-label. Larger values
449 will yield a sparser axis with fewer ticks. Defaults: 60 (x-axis), 30
450 (y-axis).</td>
451 </tr>
452
453 <tr>
454 <td><b>xAxisLabelWidth</b>, <b>yAxisLabelWidth</b></td>
455 <td>50</td>
456 <td>Width (in pixels) of the x- and y-axis labels.</td>
457 </tr>
458
459 <tr>
460 <td><b>axisLabelFontSize</b></td>
461 <td>14</td>
462 <td>Size of the font (in pixels) to use in the axis labels, both x- and
463 y-axis.</td>
464 </tr>
465
466 <tr>
467 <td><b>rightGap</b></td>
468 <td>5</td>
469 <td>Number of pixels to leave blank at the right edge of the Dygraph. This
470 makes it easier to highlight the right-most data point.</td>
471 </tr>
472
473 <tr>
474 <td><b>errorBars</b></td>
475 <td><code>false</code></td>
476 <td>Does the data contain standard deviations? Setting this to true alters
477 the input format (see above). (default false)</td>
478 </tr>
479
480 <tr>
481 <td><b>sigma</b></td>
482 <td>2</td>
483 <td>When errorBars is set, shade this many standard deviations above/below
484 each point.</td>
485 </tr>
486
487 <tr>
488 <td><b>fractions</b></td>
489 <td>false</td>
490 <td>When set, attempt to parse each cell in the CSV file as "a/b", where a
491 and b are integers. The ratio will be plotted. This allows computation of
492 Wilson confidence intervals (see below).</td>
493 </tr>
494
495 <tr>
496 <td><b>wilsonInterval</b></td>
497 <td>true</td>
498 <td>Use in conjunction with the "fractions" option. Instead of plotting +/-
499 N standard deviations, dygraphs will compute a Wilson confidence interval
500 and plot that. This has more reasonable behavior for ratios close to 0 or
501 1.</td>
502 </tr>
503
078d1d29 504 <tr>
672f92a0
DV
505 <td><b>customBars</b></td>
506 <td>false</td>
507 <td>When set, parse each CSV cell as "low;middle;high". Error bars will be
508 drawn for each point between low and high, with the series itself going
509 through middle.</td>
078d1d29
DV
510 </tr>
511</table>
512
285a6bda 513<p>Any options you specify also get passed on to PlotKit's <a href="http://media.liquidx.net/js/plotkit-doc/PlotKit.Renderer.html">Renderer</a> class. dygraphs will override some of these (e.g. strokeColor), but others may be useful. The <code>padding</code> property is an example of this.</p>
078d1d29
DV
514
515<h2>Common Gotchas</h2>
516<p>Here are a few problems that I've frequently run into while using the
517dygraphs library.</p>
518
519<ul>
520 <li>Make sure your CSV files are readable! If your graph isn't showing up,
521 the XMLHttpRequest for the CSV file may be failing. You can determine whether
522 this is the case using tools like <a
523 href="http://www.getfirebug.com/">Firebug</a>.</li>
524
525 <li>Make sure your CSV files are in the correct format. They must be of the
285a6bda
DV
526 form <code>YYYYMMDD,series1,series2,...</code>. And if you set the
527 <code>errorBars</code> property, make sure you alternate data series and
528 standard deviations.</li>
078d1d29
DV
529
530 <li>dygraphs are not happy when placed inside a <code>&lt;center&gt;</code>
531 tag. This applies to the CSS <code>text-align</code> property as well. If you
285a6bda 532 want to center a Dygraph, put it inside a table with "align=center"
078d1d29
DV
533 set.</li>
534
078d1d29
DV
535 <li>Don't set the <code>dateWindow</code> property to a date. It expects
536 milliseconds since epoch, which can be obtained from a JavaScript Date
537 object's valueOf method.</li>
538</ul>
539
2739bb8f
DV
540<h2>Data Policy</h2>
541<p>dygraphs is purely client-side JavaScript. It does not send your data to any
5520fcc0 542servers -- the data is processed entirely in the client's browser.</p>
2739bb8f 543
078d1d29
DV
544<p><font size=-1>Created May 9, 2008 by <a href=mailto:danvdk@gmail.com>Dan Vanderkam</a></font></p>
545
a9df40de
DV
546<!-- Google Analytics -->
547<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
548</script>
549<script type="text/javascript">
550_uacct = "UA-769809-1";
551urchinTracker();
552</script>
553
078d1d29
DV
554</body>
555</html>