| <!-- | |
| Licensed to the Apache Software Foundation (ASF) under one | |
| or more contributor license agreements. See the NOTICE file | |
| distributed with this work for additional information | |
| regarding copyright ownership. The ASF licenses this file | |
| to you under the Apache License, Version 2.0 (the | |
| "License"); you may not use this file except in compliance | |
| with the License. You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, | |
| software distributed under the License is distributed on an | |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| KIND, either express or implied. See the License for the | |
| specific language governing permissions and limitations | |
| under the License. | |
| --> | |
| <html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <script src="lib/simpleRequire.js"></script> | |
| <script src="lib/config.js"></script> | |
| </head> | |
| <body> | |
| <style> | |
| html, body, #main { | |
| width: 100%; | |
| height: 100%; | |
| background: #262626; | |
| } | |
| </style> | |
| <div id="main"></div> | |
| <script> | |
| var chart; | |
| require([ | |
| 'echarts' | |
| ], function (echarts) { | |
| chart = echarts.init(document.getElementById('main')); | |
| var colors = ['#FFAE57', '#FF7853', '#EA5151', '#CC3F57', '#9A2555']; | |
| var bgColor = '#262626'; | |
| var itemStyle = { | |
| star5: { | |
| color: colors[0] | |
| }, | |
| star4: { | |
| color: colors[1] | |
| }, | |
| star3: { | |
| color: colors[2] | |
| }, | |
| star2: { | |
| color: colors[3] | |
| } | |
| }; | |
| var data = [{ | |
| name: '虚构', | |
| itemStyle: { | |
| normal: { | |
| color: colors[1] | |
| } | |
| }, | |
| children: [{ | |
| name: '小说', | |
| children: [{ | |
| name: '5☆', | |
| children: [{ | |
| name: '疼' | |
| }, { | |
| name: '慈悲' | |
| }, { | |
| name: '楼下的房客' | |
| }] | |
| }, { | |
| name: '4☆', | |
| children: [{ | |
| name: '虚无的十字架' | |
| }, { | |
| name: '无声告白' | |
| }, { | |
| name: '童年的终结' | |
| }] | |
| }, { | |
| name: '3☆', | |
| children: [{ | |
| name: '疯癫老人日记' | |
| }] | |
| }] | |
| }, { | |
| name: '其他', | |
| children: [{ | |
| name: '5☆', | |
| children: [{ | |
| name: '纳博科夫短篇小说全集' | |
| }] | |
| }, { | |
| name: '4☆', | |
| children: [{ | |
| name: '安魂曲' | |
| }, { | |
| name: '人生拼图版' | |
| }] | |
| }, { | |
| name: '3☆', | |
| children: [{ | |
| name: '比起爱你,我更需要你' | |
| }] | |
| }] | |
| }] | |
| }, { | |
| name: '非虚构', | |
| itemStyle: { | |
| color: colors[2] | |
| }, | |
| children: [{ | |
| name: '设计', | |
| children: [{ | |
| name: '5☆', | |
| children: [{ | |
| name: '无界面交互' | |
| }] | |
| }, { | |
| name: '4☆', | |
| children: [{ | |
| name: '数字绘图的光照与渲染技术' | |
| }, { | |
| name: '日本建筑解剖书' | |
| }] | |
| }, { | |
| name: '3☆', | |
| children: [{ | |
| name: '奇幻世界艺术\n&RPG地图绘制讲座' | |
| }] | |
| }] | |
| }, { | |
| name: '社科', | |
| children: [{ | |
| name: '5☆', | |
| children: [{ | |
| name: '痛点' | |
| }] | |
| }, { | |
| name: '4☆', | |
| children: [{ | |
| name: '卓有成效的管理者' | |
| }, { | |
| name: '进化' | |
| }, { | |
| name: '后物欲时代的来临', | |
| }] | |
| }, { | |
| name: '3☆', | |
| children: [{ | |
| name: '疯癫与文明' | |
| }] | |
| }] | |
| }, { | |
| name: '心理', | |
| children: [{ | |
| name: '5☆', | |
| children: [{ | |
| name: '我们时代的神经症人格' | |
| }] | |
| }, { | |
| name: '4☆', | |
| children: [{ | |
| name: '皮格马利翁效应' | |
| }, { | |
| name: '受伤的人' | |
| }] | |
| }, { | |
| name: '3☆', | |
| }, { | |
| name: '2☆', | |
| children: [{ | |
| name: '迷恋' | |
| }] | |
| }] | |
| }, { | |
| name: '居家', | |
| children: [{ | |
| name: '4☆', | |
| children: [{ | |
| name: '把房子住成家' | |
| }, { | |
| name: '只过必要生活' | |
| }, { | |
| name: '北欧简约风格' | |
| }] | |
| }] | |
| }, { | |
| name: '绘本', | |
| children: [{ | |
| name: '5☆', | |
| children: [{ | |
| name: '设计诗' | |
| }] | |
| }, { | |
| name: '4☆', | |
| children: [{ | |
| name: '假如生活糊弄了你' | |
| }, { | |
| name: '博物学家的神秘动物图鉴' | |
| }] | |
| }, { | |
| name: '3☆', | |
| children: [{ | |
| name: '方向' | |
| }] | |
| }] | |
| }, { | |
| name: '哲学', | |
| children: [{ | |
| name: '4☆', | |
| children: [{ | |
| name: '人生的智慧' | |
| }] | |
| }] | |
| }, { | |
| name: '技术', | |
| children: [{ | |
| name: '5☆', | |
| children: [{ | |
| name: '代码整洁之道' | |
| }] | |
| }, { | |
| name: '4☆', | |
| children: [{ | |
| name: 'Three.js 开发指南' | |
| }] | |
| }] | |
| }] | |
| }]; | |
| for (var j = 0; j < data.length; ++j) { | |
| var level1 = data[j].children; | |
| for (var i = 0; i < level1.length; ++i) { | |
| var block = level1[i].children; | |
| var bookScore = []; | |
| var bookScoreId; | |
| for (var star = 0; star < block.length; ++star) { | |
| var style = (function (name) { | |
| switch (name) { | |
| case '5☆': | |
| bookScoreId = 0; | |
| return itemStyle.star5; | |
| case '4☆': | |
| bookScoreId = 1; | |
| return itemStyle.star4; | |
| case '3☆': | |
| bookScoreId = 2; | |
| return itemStyle.star3; | |
| case '2☆': | |
| bookScoreId = 3; | |
| return itemStyle.star2; | |
| } | |
| })(block[star].name); | |
| block[star].label = { | |
| color: style.color, | |
| downplay: { | |
| opacity: 0.5 | |
| } | |
| }; | |
| if (block[star].children) { | |
| style = { | |
| opacity: 1, | |
| color: style.color | |
| }; | |
| block[star].children.forEach(function (book) { | |
| book.value = 1; | |
| book.itemStyle = style; | |
| book.label = { | |
| color: style.color | |
| }; | |
| var value = 1; | |
| if (bookScoreId === 0 || bookScoreId === 3) { | |
| value = 5; | |
| } | |
| if (bookScore[bookScoreId]) { | |
| bookScore[bookScoreId].value += value; | |
| } | |
| else { | |
| bookScore[bookScoreId] = { | |
| color: colors[bookScoreId], | |
| value: value | |
| }; | |
| } | |
| }); | |
| } | |
| } | |
| level1[i].itemStyle = { | |
| color: data[j].itemStyle.color | |
| }; | |
| } | |
| } | |
| chart.setOption({ | |
| color: colors, | |
| // title: { | |
| // text: '2017 读书记录', | |
| // bottom: 30, | |
| // left: 'center', | |
| // textStyle: { | |
| // color: colors[0] | |
| // } | |
| // }, | |
| series: [{ | |
| type: 'sunburst', | |
| center: ['50%', '48%'], | |
| data: data, | |
| sort: function (a, b) { | |
| if (a.depth === 1) { | |
| return b.getValue() - a.getValue(); | |
| } | |
| else { | |
| return a.dataIndex - b.dataIndex; | |
| } | |
| }, | |
| label: { | |
| rotate: 'radial', | |
| color: bgColor | |
| }, | |
| itemStyle: { | |
| borderColor: bgColor, | |
| borderWidth: 2 | |
| }, | |
| levels: [{}, { | |
| r0: 0, | |
| r: 40, | |
| label: { | |
| rotate: 0 | |
| } | |
| }, { | |
| r0: 40, | |
| r: 105 | |
| }, { | |
| r0: 115, | |
| r: 140, | |
| itemStyle: { | |
| shadowBlur: 2, | |
| shadowColor: colors[2], | |
| color: 'transparent' | |
| }, | |
| label: { | |
| rotate: 'tangential', | |
| fontSize: 10, | |
| color: colors[0] | |
| } | |
| }, { | |
| r0: 140, | |
| r: 145, | |
| itemStyle: { | |
| shadowBlur: 80, | |
| shadowColor: colors[0] | |
| }, | |
| label: { | |
| position: 'outside', | |
| textShadowBlur: 5, | |
| textShadowColor: '#333', | |
| downplay: { | |
| opacity: 0.5 | |
| } | |
| } | |
| }] | |
| }] | |
| }); | |
| }); | |
| </script> | |
| </body> | |
| </html> |