sunburst-book.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <script src="lib/esl.js"></script>
  5. <script src="lib/config.js"></script>
  6. </head>
  7. <body>
  8. <style>
  9. html, body, #main {
  10. width: 100%;
  11. height: 100%;
  12. background: #262626;
  13. }
  14. </style>
  15. <div id="main"></div>
  16. <script>
  17. var chart;
  18. require([
  19. 'echarts'
  20. ], function (echarts) {
  21. chart = echarts.init(document.getElementById('main'));
  22. var colors = ['#FFAE57', '#FF7853', '#EA5151', '#CC3F57', '#9A2555'];
  23. var bgColor = '#262626';
  24. var itemStyle = {
  25. star5: {
  26. color: colors[0]
  27. },
  28. star4: {
  29. color: colors[1]
  30. },
  31. star3: {
  32. color: colors[2]
  33. },
  34. star2: {
  35. color: colors[3]
  36. }
  37. };
  38. var data = [{
  39. name: '虚构',
  40. itemStyle: {
  41. normal: {
  42. color: colors[1]
  43. }
  44. },
  45. children: [{
  46. name: '小说',
  47. children: [{
  48. name: '5☆',
  49. children: [{
  50. name: '疼'
  51. }, {
  52. name: '慈悲'
  53. }, {
  54. name: '楼下的房客'
  55. }]
  56. }, {
  57. name: '4☆',
  58. children: [{
  59. name: '虚无的十字架'
  60. }, {
  61. name: '无声告白'
  62. }, {
  63. name: '童年的终结'
  64. }]
  65. }, {
  66. name: '3☆',
  67. children: [{
  68. name: '疯癫老人日记'
  69. }]
  70. }]
  71. }, {
  72. name: '其他',
  73. children: [{
  74. name: '5☆',
  75. children: [{
  76. name: '纳博科夫短篇小说全集'
  77. }]
  78. }, {
  79. name: '4☆',
  80. children: [{
  81. name: '安魂曲'
  82. }, {
  83. name: '人生拼图版'
  84. }]
  85. }, {
  86. name: '3☆',
  87. children: [{
  88. name: '比起爱你,我更需要你'
  89. }]
  90. }]
  91. }]
  92. }, {
  93. name: '非虚构',
  94. itemStyle: {
  95. color: colors[2]
  96. },
  97. children: [{
  98. name: '设计',
  99. children: [{
  100. name: '5☆',
  101. children: [{
  102. name: '无界面交互'
  103. }]
  104. }, {
  105. name: '4☆',
  106. children: [{
  107. name: '数字绘图的光照与渲染技术'
  108. }, {
  109. name: '日本建筑解剖书'
  110. }]
  111. }, {
  112. name: '3☆',
  113. children: [{
  114. name: '奇幻世界艺术\n&RPG地图绘制讲座'
  115. }]
  116. }]
  117. }, {
  118. name: '社科',
  119. children: [{
  120. name: '5☆',
  121. children: [{
  122. name: '痛点'
  123. }]
  124. }, {
  125. name: '4☆',
  126. children: [{
  127. name: '卓有成效的管理者'
  128. }, {
  129. name: '进化'
  130. }, {
  131. name: '后物欲时代的来临',
  132. }]
  133. }, {
  134. name: '3☆',
  135. children: [{
  136. name: '疯癫与文明'
  137. }]
  138. }]
  139. }, {
  140. name: '心理',
  141. children: [{
  142. name: '5☆',
  143. children: [{
  144. name: '我们时代的神经症人格'
  145. }]
  146. }, {
  147. name: '4☆',
  148. children: [{
  149. name: '皮格马利翁效应'
  150. }, {
  151. name: '受伤的人'
  152. }]
  153. }, {
  154. name: '3☆',
  155. }, {
  156. name: '2☆',
  157. children: [{
  158. name: '迷恋'
  159. }]
  160. }]
  161. }, {
  162. name: '居家',
  163. children: [{
  164. name: '4☆',
  165. children: [{
  166. name: '把房子住成家'
  167. }, {
  168. name: '只过必要生活'
  169. }, {
  170. name: '北欧简约风格'
  171. }]
  172. }]
  173. }, {
  174. name: '绘本',
  175. children: [{
  176. name: '5☆',
  177. children: [{
  178. name: '设计诗'
  179. }]
  180. }, {
  181. name: '4☆',
  182. children: [{
  183. name: '假如生活糊弄了你'
  184. }, {
  185. name: '博物学家的神秘动物图鉴'
  186. }]
  187. }, {
  188. name: '3☆',
  189. children: [{
  190. name: '方向'
  191. }]
  192. }]
  193. }, {
  194. name: '哲学',
  195. children: [{
  196. name: '4☆',
  197. children: [{
  198. name: '人生的智慧'
  199. }]
  200. }]
  201. }, {
  202. name: '技术',
  203. children: [{
  204. name: '5☆',
  205. children: [{
  206. name: '代码整洁之道'
  207. }]
  208. }, {
  209. name: '4☆',
  210. children: [{
  211. name: 'Three.js 开发指南'
  212. }]
  213. }]
  214. }]
  215. }];
  216. for (var j = 0; j < data.length; ++j) {
  217. var level1 = data[j].children;
  218. for (var i = 0; i < level1.length; ++i) {
  219. var block = level1[i].children;
  220. var bookScore = [];
  221. var bookScoreId;
  222. for (var star = 0; star < block.length; ++star) {
  223. var style = (function (name) {
  224. switch (name) {
  225. case '5☆':
  226. bookScoreId = 0;
  227. return itemStyle.star5;
  228. case '4☆':
  229. bookScoreId = 1;
  230. return itemStyle.star4;
  231. case '3☆':
  232. bookScoreId = 2;
  233. return itemStyle.star3;
  234. case '2☆':
  235. bookScoreId = 3;
  236. return itemStyle.star2;
  237. }
  238. })(block[star].name);
  239. block[star].label = {
  240. color: style.color,
  241. downplay: {
  242. opacity: 0.5
  243. }
  244. };
  245. if (block[star].children) {
  246. style = {
  247. opacity: 1,
  248. color: style.color
  249. };
  250. block[star].children.forEach(function (book) {
  251. book.value = 1;
  252. book.itemStyle = style;
  253. book.label = {
  254. color: style.color
  255. };
  256. var value = 1;
  257. if (bookScoreId === 0 || bookScoreId === 3) {
  258. value = 5;
  259. }
  260. if (bookScore[bookScoreId]) {
  261. bookScore[bookScoreId].value += value;
  262. }
  263. else {
  264. bookScore[bookScoreId] = {
  265. color: colors[bookScoreId],
  266. value: value
  267. };
  268. }
  269. });
  270. }
  271. }
  272. level1[i].itemStyle = {
  273. color: data[j].itemStyle.color
  274. };
  275. }
  276. }
  277. chart.setOption({
  278. color: colors,
  279. // title: {
  280. // text: '2017 读书记录',
  281. // bottom: 30,
  282. // left: 'center',
  283. // textStyle: {
  284. // color: colors[0]
  285. // }
  286. // },
  287. series: [{
  288. type: 'sunburst',
  289. center: ['50%', '48%'],
  290. data: data,
  291. sort: function (a, b) {
  292. if (a.depth === 1) {
  293. return b.getValue() - a.getValue();
  294. }
  295. else {
  296. return a.dataIndex - b.dataIndex;
  297. }
  298. },
  299. label: {
  300. rotate: 'radial',
  301. color: bgColor
  302. },
  303. itemStyle: {
  304. borderColor: bgColor,
  305. borderWidth: 2
  306. },
  307. levels: [{}, {
  308. r0: 0,
  309. r: 40,
  310. label: {
  311. rotate: 0
  312. }
  313. }, {
  314. r0: 40,
  315. r: 105
  316. }, {
  317. r0: 115,
  318. r: 140,
  319. itemStyle: {
  320. shadowBlur: 2,
  321. shadowColor: colors[2],
  322. color: 'transparent'
  323. },
  324. label: {
  325. rotate: 'tangential',
  326. fontSize: 10,
  327. color: colors[0]
  328. }
  329. }, {
  330. r0: 140,
  331. r: 145,
  332. itemStyle: {
  333. shadowBlur: 80,
  334. shadowColor: colors[0]
  335. },
  336. label: {
  337. position: 'outside',
  338. textShadowBlur: 5,
  339. textShadowColor: '#333',
  340. downplay: {
  341. opacity: 0.5
  342. }
  343. }
  344. }]
  345. }]
  346. });
  347. });
  348. </script>
  349. </body>
  350. </html>