boxplot.html 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <meta name="viewport" content="width=device-width, initial-scale=1" />
  5. <link rel="stylesheet" href="lib/reset.css"/>
  6. <script src="lib/esl.js"></script>
  7. <script src="lib/config.js"></script>
  8. <script src="lib/facePrint.js"></script>
  9. </head>
  10. <body>
  11. <style>
  12. #main {
  13. width: 900px;
  14. height: 650px;
  15. border: 9px solid #eee;
  16. }
  17. </style>
  18. <div id="info"></div>
  19. <div id="main"></div>
  20. <script>
  21. /**
  22. * @see <https://en.wikipedia.org/wiki/Michelson%E2%80%93Morley_experiment>
  23. * @see <http://bl.ocks.org/mbostock/4061502>
  24. */
  25. var chart;
  26. var data;
  27. var mean;
  28. require([
  29. 'echarts',
  30. 'data/Michelson-Morley.json',
  31. 'extension/dataTool'
  32. // 'zrender/core/env'
  33. // 'echarts/chart/boxplot',
  34. // 'echarts/chart/scatter',
  35. // 'echarts/component/title',
  36. // 'echarts/component/legend',
  37. // 'echarts/component/markLine',
  38. // 'echarts/component/markPoint',
  39. // 'echarts/component/grid',
  40. // 'echarts/component/tooltip',
  41. // 'zrender/vml/vml'
  42. ], function (echarts, rawData, dataTool) {
  43. var prepareBoxplotData = dataTool.prepareBoxplotData;
  44. var env = echarts.env;
  45. chart = echarts.init(document.getElementById('main'), null, {
  46. });
  47. update('horizontal');
  48. // update('vertical');
  49. initControlPanel(env);
  50. function update(layout) {
  51. data = prepareBoxplotData(rawData, {
  52. layout: layout
  53. });
  54. mean = calculateMean(rawData);
  55. var categoryAxis = {
  56. type: 'category',
  57. data: data.axisData,
  58. boundaryGap: true,
  59. nameGap: 30,
  60. splitArea: {
  61. show: false
  62. },
  63. axisLabel: {
  64. formatter: 'expr {value}'
  65. },
  66. splitLine: {
  67. show: false
  68. }
  69. };
  70. var valueAxis = {
  71. type: 'value',
  72. name: 'km/s minus 299,000',
  73. splitArea: {
  74. show: true
  75. }
  76. };
  77. chart.setOption({
  78. aria: {
  79. show: true
  80. },
  81. title: [
  82. {
  83. text: 'Michelson-Morley Experiment',
  84. left: 'center'
  85. },
  86. {
  87. text: 'upper: Q3 + 1.5 * IRQ \nlower: Q1 - 1.5 * IRQ',
  88. borderColor: '#999',
  89. borderWidth: 1,
  90. textStyle: {
  91. fontSize: 14
  92. },
  93. left: '10%',
  94. top: '90%'
  95. }
  96. ],
  97. legend: {
  98. data: ['line', 'line2', 'line3']
  99. },
  100. tooltip: {
  101. trigger: 'item',
  102. axisPointer: {
  103. type: 'shadow'
  104. }
  105. },
  106. grid: {
  107. left: '10%',
  108. right: '10%',
  109. bottom: '15%'
  110. },
  111. xAxis: layout === 'horizontal' ? categoryAxis : valueAxis,
  112. yAxis: layout === 'vertical' ? categoryAxis : valueAxis,
  113. series: [
  114. {
  115. name: 'boxplot',
  116. type: 'boxplot',
  117. data: data.boxData,
  118. markPoint: {
  119. data: [
  120. {
  121. name: '某个坐标',
  122. coord: [2, 300]
  123. },
  124. {
  125. name: '某个屏幕坐标',
  126. x: 100,
  127. y: 200,
  128. label: {
  129. normal: {
  130. show: false,
  131. formatter: 'asdf'
  132. },
  133. emphasis: {
  134. show: true,
  135. position: 'top',
  136. formatter: 'zxcv'
  137. }
  138. }
  139. },
  140. {
  141. name: 'max value (default)',
  142. type: 'max'
  143. },
  144. {
  145. name: 'min value (default)',
  146. type: 'min'
  147. },
  148. {
  149. name: 'max value (dim:Q1)',
  150. type: 'max',
  151. valueDim: 'Q1'
  152. },
  153. {
  154. name: 'average value (dim:Q1)',
  155. type: 'average',
  156. valueDim: 'Q1'
  157. }
  158. ]
  159. },
  160. markLine: {
  161. data: [
  162. [
  163. {name: '两个坐标之间的标线', coord: [1, 240]},
  164. {coord: [2, 260]}
  165. ],
  166. [
  167. {name: '两个屏幕坐标之间的标线', x: 50, y: 60},
  168. {x: 70, y: 90}
  169. ],
  170. [
  171. {name: 'max - min', type: 'max'},
  172. {type: 'min'}
  173. ],
  174. {
  175. name: 'min line',
  176. type: 'min'
  177. },
  178. {
  179. name: 'max line on dim:Q3',
  180. type: 'max',
  181. valueDim: 'Q3'
  182. }
  183. ]
  184. }
  185. },
  186. {
  187. name: 'outlier',
  188. type: 'scatter',
  189. data: data.outliers
  190. }
  191. ]
  192. });
  193. }
  194. function calculateMean(rawData) {
  195. var sum = 0;
  196. var count = 0;
  197. for (var i = 0, len = rawData.length; i < len; i++) {
  198. for (var j = 0, lenj = rawData[i].length; j < lenj; j++) {
  199. var value = rawData[i][j];
  200. count++;
  201. if (!isNaN(value) && value != null && value !== '') {
  202. sum += value;
  203. }
  204. }
  205. }
  206. return sum / count;
  207. };
  208. function initControlPanel(env) {
  209. if (!env.browser.ie || env.browser.ie.version > 8) {
  210. var scr = document.createElement('script');
  211. scr.src = 'lib/dat.gui.min.js';
  212. scr.onload = function () {
  213. var gui = new dat.GUI();
  214. var config = {
  215. layout: 'horizontal'
  216. };
  217. gui
  218. .add(config, 'layout', ['horizontal', 'vertical'])
  219. .onChange(update);
  220. };
  221. document.head.appendChild(scr);
  222. }
  223. }
  224. });
  225. </script>
  226. </body>
  227. </html>