scatterMatrix.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. <!DOCTYPE>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <script src="lib/esl.js"></script>
  6. <script src="lib/config.js"></script>
  7. <meta name="viewport" content="width=device-width, initial-scale=1" />
  8. <link rel="stylesheet" href="lib/reset.css">
  9. </head>
  10. <body>
  11. <style>
  12. </style>
  13. <div id="main"></div>
  14. <script>
  15. var echarts;
  16. var chart;
  17. var myChart;
  18. require([
  19. 'echarts'
  20. // 'echarts/chart/scatter',
  21. // 'echarts/component/legend',
  22. // 'echarts/component/grid',
  23. // 'echarts/component/tooltip',
  24. // 'echarts/component/toolbox',
  25. // 'echarts/component/markLine',
  26. // 'echarts/component/markPoint',
  27. // 'echarts/component/dataZoom',
  28. // 'echarts/component/visualMap',
  29. // 'echarts/component/brush'
  30. ], function (ec) {
  31. echarts = ec;
  32. var rawData = [
  33. [5.1, 3.5, 1.4, 0.2, "setosa"],
  34. [4.9, 3.0, 1.4, 0.2, "setosa"],
  35. [4.7, 3.2, 1.3, 0.2, "setosa"],
  36. [4.6, 3.1, 1.5, 0.2, "setosa"],
  37. [5.0, 3.6, 1.4, 0.2, "setosa"],
  38. [5.4, 3.9, 1.7, 0.4, "setosa"],
  39. [4.6, 3.4, 1.4, 0.3, "setosa"],
  40. [5.0, 3.4, 1.5, 0.2, "setosa"],
  41. [4.4, 2.9, 1.4, 0.2, "setosa"],
  42. [4.9, 3.1, 1.5, 0.1, "setosa"],
  43. [5.4, 3.7, 1.5, 0.2, "setosa"],
  44. [4.8, 3.4, 1.6, 0.2, "setosa"],
  45. [4.8, 3.0, 1.4, 0.1, "setosa"],
  46. [4.3, 3.0, 1.1, 0.1, "setosa"],
  47. [5.8, 4.0, 1.2, 0.2, "setosa"],
  48. [5.7, 4.4, 1.5, 0.4, "setosa"],
  49. [5.4, 3.9, 1.3, 0.4, "setosa"],
  50. [5.1, 3.5, 1.4, 0.3, "setosa"],
  51. [5.7, 3.8, 1.7, 0.3, "setosa"],
  52. [5.1, 3.8, 1.5, 0.3, "setosa"],
  53. [5.4, 3.4, 1.7, 0.2, "setosa"],
  54. [5.1, 3.7, 1.5, 0.4, "setosa"],
  55. [4.6, 3.6, 1.0, 0.2, "setosa"],
  56. [5.1, 3.3, 1.7, 0.5, "setosa"],
  57. [4.8, 3.4, 1.9, 0.2, "setosa"],
  58. [5.0, 3.0, 1.6, 0.2, "setosa"],
  59. [5.0, 3.4, 1.6, 0.4, "setosa"],
  60. [5.2, 3.5, 1.5, 0.2, "setosa"],
  61. [5.2, 3.4, 1.4, 0.2, "setosa"],
  62. [4.7, 3.2, 1.6, 0.2, "setosa"],
  63. [4.8, 3.1, 1.6, 0.2, "setosa"],
  64. [5.4, 3.4, 1.5, 0.4, "setosa"],
  65. [5.2, 4.1, 1.5, 0.1, "setosa"],
  66. [5.5, 4.2, 1.4, 0.2, "setosa"],
  67. [4.9, 3.1, 1.5, 0.2, "setosa"],
  68. [5.0, 3.2, 1.2, 0.2, "setosa"],
  69. [5.5, 3.5, 1.3, 0.2, "setosa"],
  70. [4.9, 3.6, 1.4, 0.1, "setosa"],
  71. [4.4, 3.0, 1.3, 0.2, "setosa"],
  72. [5.1, 3.4, 1.5, 0.2, "setosa"],
  73. [5.0, 3.5, 1.3, 0.3, "setosa"],
  74. [4.5, 2.3, 1.3, 0.3, "setosa"],
  75. [4.4, 3.2, 1.3, 0.2, "setosa"],
  76. [5.0, 3.5, 1.6, 0.6, "setosa"],
  77. [5.1, 3.8, 1.9, 0.4, "setosa"],
  78. [4.8, 3.0, 1.4, 0.3, "setosa"],
  79. [5.1, 3.8, 1.6, 0.2, "setosa"],
  80. [4.6, 3.2, 1.4, 0.2, "setosa"],
  81. [5.3, 3.7, 1.5, 0.2, "setosa"],
  82. [5.0, 3.3, 1.4, 0.2, "setosa"],
  83. [7.0, 3.2, 4.7, 1.4, "versicolor"],
  84. [6.4, 3.2, 4.5, 1.5, "versicolor"],
  85. [6.9, 3.1, 4.9, 1.5, "versicolor"],
  86. [5.5, 2.3, 4.0, 1.3, "versicolor"],
  87. [6.5, 2.8, 4.6, 1.5, "versicolor"],
  88. [5.7, 2.8, 4.5, 1.3, "versicolor"],
  89. [6.3, 3.3, 4.7, 1.6, "versicolor"],
  90. [4.9, 2.4, 3.3, 1.0, "versicolor"],
  91. [6.6, 2.9, 4.6, 1.3, "versicolor"],
  92. [5.2, 2.7, 3.9, 1.4, "versicolor"],
  93. [5.0, 2.0, 3.5, 1.0, "versicolor"],
  94. [5.9, 3.0, 4.2, 1.5, "versicolor"],
  95. [6.0, 2.2, 4.0, 1.0, "versicolor"],
  96. [6.1, 2.9, 4.7, 1.4, "versicolor"],
  97. [5.6, 2.9, 3.6, 1.3, "versicolor"],
  98. [6.7, 3.1, 4.4, 1.4, "versicolor"],
  99. [5.6, 3.0, 4.5, 1.5, "versicolor"],
  100. [5.8, 2.7, 4.1, 1.0, "versicolor"],
  101. [6.2, 2.2, 4.5, 1.5, "versicolor"],
  102. [5.6, 2.5, 3.9, 1.1, "versicolor"],
  103. [5.9, 3.2, 4.8, 1.8, "versicolor"],
  104. [6.1, 2.8, 4.0, 1.3, "versicolor"],
  105. [6.3, 2.5, 4.9, 1.5, "versicolor"],
  106. [6.1, 2.8, 4.7, 1.2, "versicolor"],
  107. [6.4, 2.9, 4.3, 1.3, "versicolor"],
  108. [6.6, 3.0, 4.4, 1.4, "versicolor"],
  109. [6.8, 2.8, 4.8, 1.4, "versicolor"],
  110. [6.7, 3.0, 5.0, 1.7, "versicolor"],
  111. [6.0, 2.9, 4.5, 1.5, "versicolor"],
  112. [5.7, 2.6, 3.5, 1.0, "versicolor"],
  113. [5.5, 2.4, 3.8, 1.1, "versicolor"],
  114. [5.5, 2.4, 3.7, 1.0, "versicolor"],
  115. [5.8, 2.7, 3.9, 1.2, "versicolor"],
  116. [6.0, 2.7, 5.1, 1.6, "versicolor"],
  117. [5.4, 3.0, 4.5, 1.5, "versicolor"],
  118. [6.0, 3.4, 4.5, 1.6, "versicolor"],
  119. [6.7, 3.1, 4.7, 1.5, "versicolor"],
  120. [6.3, 2.3, 4.4, 1.3, "versicolor"],
  121. [5.6, 3.0, 4.1, 1.3, "versicolor"],
  122. [5.5, 2.5, 4.0, 1.3, "versicolor"],
  123. [5.5, 2.6, 4.4, 1.2, "versicolor"],
  124. [6.1, 3.0, 4.6, 1.4, "versicolor"],
  125. [5.8, 2.6, 4.0, 1.2, "versicolor"],
  126. [5.0, 2.3, 3.3, 1.0, "versicolor"],
  127. [5.6, 2.7, 4.2, 1.3, "versicolor"],
  128. [5.7, 3.0, 4.2, 1.2, "versicolor"],
  129. [5.7, 2.9, 4.2, 1.3, "versicolor"],
  130. [6.2, 2.9, 4.3, 1.3, "versicolor"],
  131. [5.1, 2.5, 3.0, 1.1, "versicolor"],
  132. [5.7, 2.8, 4.1, 1.3, "versicolor"],
  133. [6.3, 3.3, 6.0, 2.5, "virginica"],
  134. [5.8, 2.7, 5.1, 1.9, "virginica"],
  135. [7.1, 3.0, 5.9, 2.1, "virginica"],
  136. [6.3, 2.9, 5.6, 1.8, "virginica"],
  137. [6.5, 3.0, 5.8, 2.2, "virginica"],
  138. [7.6, 3.0, 6.6, 2.1, "virginica"],
  139. [4.9, 2.5, 4.5, 1.7, "virginica"],
  140. [7.3, 2.9, 6.3, 1.8, "virginica"],
  141. [6.7, 2.5, 5.8, 1.8, "virginica"],
  142. [7.2, 3.6, 6.1, 2.5, "virginica"],
  143. [6.5, 3.2, 5.1, 2.0, "virginica"],
  144. [6.4, 2.7, 5.3, 1.9, "virginica"],
  145. [6.8, 3.0, 5.5, 2.1, "virginica"],
  146. [5.7, 2.5, 5.0, 2.0, "virginica"],
  147. [5.8, 2.8, 5.1, 2.4, "virginica"],
  148. [6.4, 3.2, 5.3, 2.3, "virginica"],
  149. [6.5, 3.0, 5.5, 1.8, "virginica"],
  150. [7.7, 3.8, 6.7, 2.2, "virginica"],
  151. [7.7, 2.6, 6.9, 2.3, "virginica"],
  152. [6.0, 2.2, 5.0, 1.5, "virginica"],
  153. [6.9, 3.2, 5.7, 2.3, "virginica"],
  154. [5.6, 2.8, 4.9, 2.0, "virginica"],
  155. [7.7, 2.8, 6.7, 2.0, "virginica"],
  156. [6.3, 2.7, 4.9, 1.8, "virginica"],
  157. [6.7, 3.3, 5.7, 2.1, "virginica"],
  158. [7.2, 3.2, 6.0, 1.8, "virginica"],
  159. [6.2, 2.8, 4.8, 1.8, "virginica"],
  160. [6.1, 3.0, 4.9, 1.8, "virginica"],
  161. [6.4, 2.8, 5.6, 2.1, "virginica"],
  162. [7.2, 3.0, 5.8, 1.6, "virginica"],
  163. [7.4, 2.8, 6.1, 1.9, "virginica"],
  164. [7.9, 3.8, 6.4, 2.0, "virginica"],
  165. [6.4, 2.8, 5.6, 2.2, "virginica"],
  166. [6.3, 2.8, 5.1, 1.5, "virginica"],
  167. [6.1, 2.6, 5.6, 1.4, "virginica"],
  168. [7.7, 3.0, 6.1, 2.3, "virginica"],
  169. [6.3, 3.4, 5.6, 2.4, "virginica"],
  170. [6.4, 3.1, 5.5, 1.8, "virginica"],
  171. [6.0, 3.0, 4.8, 1.8, "virginica"],
  172. [6.9, 3.1, 5.4, 2.1, "virginica"],
  173. [6.7, 3.1, 5.6, 2.4, "virginica"],
  174. [6.9, 3.1, 5.1, 2.3, "virginica"],
  175. [5.8, 2.7, 5.1, 1.9, "virginica"],
  176. [6.8, 3.2, 5.9, 2.3, "virginica"],
  177. [6.7, 3.3, 5.7, 2.5, "virginica"],
  178. [6.7, 3.0, 5.2, 2.3, "virginica"],
  179. [6.3, 2.5, 5.0, 1.9, "virginica"],
  180. [6.5, 3.0, 5.2, 2.0, "virginica"],
  181. [6.2, 3.4, 5.4, 2.3, "virginica"],
  182. [5.9, 3.0, 5.1, 1.8, "virginica"]
  183. ];
  184. var GRID_WIDTH = 220;
  185. var GRID_HEIGHT = 220;
  186. var GAP = 20;
  187. var CATEGORY_DIM = 4;
  188. var CROSS_DIM_NUMBER = 4;
  189. var BASE_LEFT = 30;
  190. var BASE_TOP = 20;
  191. var SYMBOL_SIZE = 8;
  192. function genData(data, dimX, dimY) {
  193. var result = [];
  194. for (var i = 0; i < data.length; i++) {
  195. result.push([data[i][dimX], data[i][dimY], data[i][CATEGORY_DIM]]);
  196. }
  197. return result;
  198. }
  199. function getCategories(data) {
  200. var map = {};
  201. var result = [];
  202. for (var i = 0; i < data.length; i++) {
  203. if (!map[data[i][CATEGORY_DIM]]) {
  204. map[data[i][CATEGORY_DIM]] = 1;
  205. }
  206. }
  207. for (var cate in map) {
  208. if (map.hasOwnProperty(cate)) {
  209. result.push(cate);
  210. }
  211. }
  212. return result;
  213. }
  214. function genGrids(option) {
  215. var gridList = option.grid = [];
  216. var xAxisList = option.xAxis = [];
  217. var yAxisList = option.yAxis = [];
  218. var seriesList = option.series = [];
  219. var visualMapSeriesIndices = option.visualMap.seriesIndex = [];
  220. var axisPointerLinkList = option.axisPointer.link = [];
  221. var axisPointerLinkMap = {};
  222. for (var i = 0; i < CROSS_DIM_NUMBER; i++) {
  223. for (var j = 0; j < CROSS_DIM_NUMBER; j++) {
  224. var id = i + '-' + j;
  225. var linkItem = axisPointerLinkMap['x' + i];
  226. if (!linkItem) {
  227. linkItem = axisPointerLinkMap['x' + i] = {xAxisId: []};
  228. axisPointerLinkList.push(linkItem);
  229. }
  230. linkItem.xAxisId.push(id);
  231. var linkItem = axisPointerLinkMap['y' + j];
  232. if (!linkItem) {
  233. linkItem = axisPointerLinkMap['y' + j] = {yAxisId: []};
  234. axisPointerLinkList.push(linkItem);
  235. }
  236. linkItem.yAxisId.push(id);
  237. gridList.push({
  238. left: BASE_LEFT + i * (GRID_WIDTH + GAP),
  239. top: BASE_TOP + (CROSS_DIM_NUMBER - 1 - j) * (GRID_HEIGHT + GAP),
  240. width: GRID_WIDTH,
  241. height: GRID_HEIGHT
  242. });
  243. xAxisList.push({
  244. id: id,
  245. axisLine: {
  246. onZero: false
  247. },
  248. axisTick: {
  249. show: j === 0
  250. },
  251. axisLabel: {
  252. show: j === 0
  253. },
  254. type: 'value',
  255. gridIndex: i * CROSS_DIM_NUMBER + j,
  256. scale: true
  257. });
  258. yAxisList.push({
  259. id: id,
  260. axisLine: {
  261. onZero: false
  262. },
  263. axisTick: {
  264. show: i === 0
  265. },
  266. axisLabel: {
  267. show: i === 0
  268. },
  269. type: 'value',
  270. gridIndex: i * CROSS_DIM_NUMBER + j,
  271. scale: true
  272. });
  273. seriesList.push({
  274. type: 'scatter',
  275. symbolSize: SYMBOL_SIZE,
  276. xAxisIndex: i * CROSS_DIM_NUMBER + j,
  277. yAxisIndex: i * CROSS_DIM_NUMBER + j,
  278. data: genData(rawData, i, j)
  279. });
  280. visualMapSeriesIndices.push(i * CROSS_DIM_NUMBER + j);
  281. }
  282. }
  283. }
  284. var option = {
  285. legend: {
  286. data: ['scatter', 'scatter2', 'scatter3']
  287. },
  288. animation: false,
  289. brush: {
  290. brushLink: 'all'
  291. },
  292. axisPointer: {
  293. show: true,
  294. snap: true,
  295. link: [],
  296. lineStyle: {
  297. type: 'dashed'
  298. }
  299. },
  300. visualMap: {
  301. type: 'piecewise',
  302. categories: getCategories(rawData),
  303. dimension: 2,
  304. orient: 'horizontal',
  305. top: 0,
  306. left: 'center',
  307. inRange: {
  308. color: ['#c23531','#2f4554', '#61a0a8']
  309. }
  310. },
  311. tooltip: {
  312. trigger: 'item',
  313. extraCssText: 'max-width:400px; white-space: normal;',
  314. formatter: function (params) {
  315. if (echarts.util.isArray(params)) {
  316. var map = {
  317. x: {items: []},
  318. y: {items: []}
  319. };
  320. echarts.util.each(params, function (param) {
  321. var dim = param.axisDim;
  322. var mapItem = map[dim];
  323. mapItem.axisValueLabel = param.axisValueLabel;
  324. mapItem.items.push(
  325. param.value[dim === 'x' ? 1 : 0]
  326. + ' ' + param.value[2]
  327. );
  328. });
  329. return map.x.axisValueLabel + '<br>(' + map.x.items.join(') (') + ')'
  330. + '<br><br>'
  331. + map.y.axisValueLabel + '<br>(' + map.y.items.join(') (') + ')';
  332. }
  333. else {
  334. return params.name + ' ' + params.value;
  335. }
  336. }
  337. }
  338. };
  339. genGrids(option);
  340. var mainEl = document.getElementById('main');
  341. mainEl.style.height = BASE_TOP * 2 + CROSS_DIM_NUMBER * (GRID_HEIGHT + GAP) + 'px';
  342. chart = myChart = echarts.init(mainEl);
  343. chart.setOption(option);
  344. });
  345. </script>
  346. </body>
  347. </html>