diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..bd17dc9a3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,5 @@ +### 提 issue 注意事项 +0. 先仔细阅读文档中是否有关于您需要解决的问题的解决方法 +1. 提 issue 前请先搜搜看以往的 issue 有没有解决了您的问题 +2. 如若是不能正常使用的问题,请贴上详细的 pyecharts 版本,使用系统以及 Python 版本 +3. 最好详细描述问题,必要时加上**代码+贴图** \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..137bf0f50 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,6 @@ +### 提 PR 注意事项 +0. 同步到 dev 分支的最新版本 +1. 代码尽量保持与项目统一风格,尽量按照 PEP8 规范写代码,必要时附上注释 +2. 如需要时请添加单元测试,也请确保所有测试能够通过 +3. 将 PR 推送至远程的 dev 分支,master 分支只负责发布新版本。请在提交信息中描述关于该 PR 的详细信息,需要时加上截图。 +4. 若是对文档进行修改,请确保数字,字母与中文之间两边均有一空格,如你所看到的整篇文档一样 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 146f1d7fd..8f1560c12 100644 --- a/.gitignore +++ b/.gitignore @@ -8,9 +8,7 @@ __pycache__/ .idea # Distribution / packaging .Python -/json/ -/js/ -/images_/ +test/*.html env/ build/ develop-eggs/ @@ -90,3 +88,7 @@ ENV/ # Rope project settings .ropeproject +*~ + +# for mac +.DS_store diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..589e70085 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,22 @@ +sudo: false +language: python +notifications: + email: + recipients: + - chenjiandongx@qq.com + on_success: always # default: change + on_failure: always # default: always +python: + - 3.6 + - 3.5 + - 3.4 + - 2.7 +before_install: + - pip install -r test/requirements.txt +script: + - python setup.py install + - make tests +after_success: + - cd test + - codecov + diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..ba8ee5fc4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017-2018 chenjiandongx + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 000000000..61fec8554 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,3 @@ +include README.md +include changelog.md +include pyecharts/templates/*.html diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..f5df8ea52 --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ +all: tests + +tests: + bash test.sh diff --git a/README.md b/README.md index 0ffdd02fc..f4a4393bf 100644 --- a/README.md +++ b/README.md @@ -1 +1,152 @@ -// TODO \ No newline at end of file +# [pyecharts](https://github.com/pyecharts/pyecharts) [![Build Status](https://travis-ci.org/pyecharts/pyecharts.svg?branch=master)](https://travis-ci.org/pyecharts/pyecharts) [![Build status](https://ci.appveyor.com/api/projects/status/81cbsfjpfryv1cl8?svg=true)](https://ci.appveyor.com/project/chenjiandongx/pyecharts) [![codecov](https://codecov.io/gh/pyecharts/pyecharts/branch/master/graph/badge.svg)](https://codecov.io/gh/pyecharts/pyecharts) [![PyPI version](https://badge.fury.io/py/pyecharts.svg)](https://badge.fury.io/py/pyecharts) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT) + +> pyecharts is a library to generate charts using Echarts. It simply provides the interface of 28+ kinds of charts between Echarts and Python. + + +## Introduction +[Echarts](https://github.com/ecomfe/echarts) is an open source library from Baidu for data visualization in javascript. It has awesome demo pages so I started to look out for an interface library so that I could use it in Python. I ended up with [echarts-python](https://github.com/yufeiminds/echarts-python) on github but it lacks of documentation and was not updated for a while. Just like many other Python projects, I started my own project, pyecharts, referencing echarts-python and another library [pygal](https://github.com/Kozea/pygal). + +## Installation +### Python Compatibility + +pyecharts works on Python2.7 and Python3.4+. + +pyecharts handles all strings and files with unicode encoding and you **MUST** use unicode string on Python 2. + +```python +#coding=utf-8 +from __future__ import unicode_literals +``` + +### pyecharts + +You can install it via pip +``` +$ pip install pyecharts +``` + +or clone it and install it +``` +$ git clone https://github.com/pyecharts/pyecharts.git +$ cd pyecharts +$ pip install -r requirements.txt +$ python setup.py install +``` + +Please note: since version 0.3.2, NO LONGER pyecharts comes with any map files. Please read next section for more informations. + +### map extensions + +Here is a list of map extensions from pyecharts dev team: + +1. [World countries include China map and World map](https://echarts-maps.github.io/echarts-countries-js/): [echarts-countries-pypkg](https://github.com/pyecharts/echarts-countries-pypkg) (1.9MB) +2. [Chinese provinces and regions](https://echarts-maps.github.io/echarts-china-provinces-js/): [echarts-china-provinces-pypkg](https://github.com/pyecharts/echarts-china-provinces-pypkg) (730KB) +3. [Chinese cities](https://echarts-maps.github.io/echarts-china-cities-js/): [echarts-china-cities-pypkg](https://github.com/pyecharts/echarts-china-cities-pypkg) (3.8MB) + +In order to install them, you can try one of them or all: + +``` +$ pip install echarts-countries-pypkg +$ pip install echarts-china-provinces-pypkg +$ pip install echarts-china-cities-pypkg +``` + +## Basic Usage + +### Render to Local Html File + +```python +from pyecharts import Bar + +attr = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] +v1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3] +v2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3] +bar = Bar("Bar chart", "precipitation and evaporation one year") +bar.add("precipitation", attr, v1, mark_line=["average"], mark_point=["max", "min"]) +bar.add("evaporation", attr, v2, mark_line=["average"], mark_point=["max", "min"]) +bar.render() +``` + +It will create a file named *render.html* in the root directory, open file with your borwser. + +![usage-0](https://user-images.githubusercontent.com/19553554/35388262-078a4afc-020e-11e8-8acc-cc7bc8a4e8a6.gif) + +### Export as Images or Pdf + +[pyecharts-snapshot](https://github.com/pyecharts/pyecharts-snapshot) is a library which renders the output of pyecharts as a png, jpeg, gif image or a pdf file at command line or in your code. + +See more detail at the repositoty. + +## Platform Support + +pyecharts exposes chart API and template API so that it can work on some common platforms. + +### Work on Jupyter Notebook + +In the Notebook cell ,you can simply call the instance itself to diplay the chart. + +All chart classes in pyecharts implement the `_repr_html_` interface about [IPython Rich Display](http://ipython.readthedocs.io/en/stable/config/integrating.html#rich-display) . + +In the case of online jshost mode,you can also download as some file formats (ipynb/py/html/pdf) and run without jupyter notebook enviromnment. + +![pandas_numpy](https://user-images.githubusercontent.com/19553554/35104252-3e36cee2-fca3-11e7-8e43-09bbe8dbbd1e.png) + +### Integrate With Web Framework + +With the help of pyecharts API,it is easy to integrate pyecharts to your web projects, such as Flask and Django. + +Demo + +![flask-0](https://user-images.githubusercontent.com/19553554/35081158-3faa7c34-fc4d-11e7-80c9-2de79371374f.gif) + +## Advance Topics + +### Cusom Template FIles and Layout + +pyecharts exposes engine API so that you can use your own template file and integrate with CSS framework. + +In addition,pyecharts also ships a lot of jinja2 template functions used in template files. + +### Custom Map Library + +All map is hosted by the repository [echarts-china-cities-js](https://github.com/pyecharts/echarts-china-cities-js) and [echarts-countries-js](https://github.com/pyecharts/echarts-countries-js) . + +## Documentation + +* [中文文档](http://pyecharts.org/#/zh-cn/) +* [English Documentation](http://pyecharts.org/#/en-us/) + +## Examples + +All examples is hosted on the repository [pyecharts-users-cases](https://github.com/pyecharts/pyecharts-users-cases) . + +## Test + +### Unit Test + +You should install the libraries in the requirements.txt files. + +``` +pip install -r test\requirements.txt +``` + +And run with the [nose](https://nose.readthedocs.io/en/latest/) commands. + +```shell +$ make +``` + +### Quality Assurance + + [flake8](http://flake8.pycqa.org/en/latest/index.html) and [pylint](https://www.pylint.org/) are used to improve the quality of code. + +### Continuous Integration + +The project is developed with [Travis CI](https://travis-ci.org/) and [AppVeyor](https://ci.appveyor.com/). + +## Author + +[![chenjiandongx](https://user-images.githubusercontent.com/19553554/35315207-02ea37ea-0106-11e8-9f9f-8fb26922c492.png)](https://github.com/chenjiandongx) [![chfw](https://user-images.githubusercontent.com/19553554/35315208-032a38a4-0106-11e8-85f1-7f601330027f.png)](https://github.com/chfw) [![kinegratii](https://user-images.githubusercontent.com/19553554/35315209-0368f8fa-0106-11e8-99f6-c71d7624a2c9.png)](https://github.com/kinegratii) + +## License +pyecharts is released under the MIT License. See LICENSE for more information. diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 000000000..ae5ea944c --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,17 @@ +environment: + + matrix: + - PYTHON: "C:\\Python27-x64" + - PYTHON: "C:\\Python35-x64" + - PYTHON: "C:\\Python36-x64" + +install: + - "%PYTHON%\\python.exe -m pip install -r requirements.txt" + - cd test + - "%PYTHON%\\python.exe -m pip install -r requirements.txt" + - "%PYTHON%\\python.exe -m pip install mock" + +build: off + +test_script: + "%PYTHON%/Scripts/nosetests --with-coverage --cover-package pyecharts --cover-package test && cd .. && %PYTHON%/Scripts/flake8 --exclude docs --builtins=unicode,xrange,long" diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 000000000..cd67d9422 --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +pyecharts.org diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..3e7c415ac --- /dev/null +++ b/docs/README.md @@ -0,0 +1,26 @@ +# pyecharts 文档 + +[![Build Status](https://travis-ci.org/pyecharts/pyecharts.svg?branch=master)](https://travis-ci.org/pyecharts/pyecharts) [![Build status](https://ci.appveyor.com/api/projects/status/81cbsfjpfryv1cl8?svg=true)](https://ci.appveyor.com/project/chenjiandongx/pyecharts) [![codecov](https://codecov.io/gh/pyecharts/pyecharts/branch/master/graph/badge.svg)](https://codecov.io/gh/pyecharts/pyecharts) [![PyPI version](https://badge.fury.io/py/pyecharts.svg)](https://badge.fury.io/py/pyecharts) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT) + + +pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,pyecharts 是为了与 Python 进行对接,方便在 Python 中直接使用数据生成图。 + +**基本使用** + +[渲染图表](zh-cn/prepare) | [图表配置](zh-cn/charts) + +**高级话题** + +[图表 API](zh-cn/api) | [自定义地图](zh-cn/customize_map) + +**平台支持** + +[Jupyter Notebook](zh-cn/jupyter_notebook) | [Flask](zh-cn/flask) | [Django](zh-cn/django) | [web 框架整合](zh-cn/web_integration) + +**其他资源** + +[示例项目](https://github.com/pyecharts/pyecharts-users-cases) | [地图扩展项目](https://github.com/pyecharts/echarts-china-cities-js) + +**项目开发** + +[版本日志](zh-cn/changelog) | [发布日志](zh-cn/release-note/) | [开发团队](zh-cn/team) | [赞助者名单](zh-cn/donors) | [FAQ](zh-cn/faq) diff --git a/docs/_coverpage.md b/docs/_coverpage.md new file mode 100644 index 000000000..e34201e6f --- /dev/null +++ b/docs/_coverpage.md @@ -0,0 +1,13 @@ +![logo](https://user-images.githubusercontent.com/19553554/34926690-2bac6002-f9ec-11e7-8b30-aceef8a814e3.png) + +# pyecharts + +> A Python Echarts Plotting Library. + +* Chart: 28+ kinds of charts +* Map: 300+ Chinese cities / 200+ countries and regions +* Platforms: Pure Python / Jupyter Notebook / Web Framework + + +[GitHub](https://github.com/pyecharts/pyecharts/) +[Get Started](zh-cn/prepare) \ No newline at end of file diff --git a/docs/class-relationship-diagram.uml b/docs/class-relationship-diagram.uml new file mode 100644 index 000000000..90ceff81e --- /dev/null +++ b/docs/class-relationship-diagram.uml @@ -0,0 +1,29 @@ +@startuml +Base <|-- Chart +Base <|-- Timeline +Base <|-- Grid +Base <|-- Overlap +Chart <|-- Bar +Chart <|-- Bar3D +Chart <|-- Boxplot +Chart <|-- EffectScatter +Chart <|-- Funnel +Chart <|-- Geo +Chart <|-- Graph +Chart <|-- HeapMap +Chart <|-- KLine +Chart <|-- Line +Chart <|-- Line3D +Chart <|-- Liquid +Chart <|-- Map +Chart <|-- Parallel +Chart <|-- Pie +Chart <|-- Polar +Chart <|-- Radar +Chart <|-- Sankey +Chart <|-- Scatter +Chart <|-- Scatter3D +Chart <|-- ThemeRiver +Chart <|-- TreeMap +Chart <|-- WorldCould +@enduml \ No newline at end of file diff --git a/docs/en-us/README.md b/docs/en-us/README.md new file mode 100644 index 000000000..3d86ba6ce --- /dev/null +++ b/docs/en-us/README.md @@ -0,0 +1,26 @@ +# pyecharts Document + +[![Build Status](https://travis-ci.org/pyecharts/pyecharts.svg?branch=master)](https://travis-ci.org/pyecharts/pyecharts) [![Build status](https://ci.appveyor.com/api/projects/status/81cbsfjpfryv1cl8?svg=true)](https://ci.appveyor.com/project/chenjiandongx/pyecharts) [![codecov](https://codecov.io/gh/pyecharts/pyecharts/branch/master/graph/badge.svg)](https://codecov.io/gh/pyecharts/pyecharts) [![PyPI version](https://badge.fury.io/py/pyecharts.svg)](https://badge.fury.io/py/pyecharts) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT) + + +[Echarts](https://github.com/ecomfe/echarts) is an open source library from Baidu for data visualization in javascript. It has awesome demo pages so I started to look out for an interface library so that I could use it in Python. I ended up with [echarts-python](https://github.com/yufeiminds/echarts-python) on github but it lacks of documentation and was not updated for a while. Just like many other Python projects, I started my own project, pyecharts, referencing echarts-python and another library [pygal](https://github.com/Kozea/pygal). + +**Basic Usage** + +[Chart Render](en-us/prepare) | [Chart Options](en-us/charts) + +**Advance Topics** + +[Chart API](en-us/api) | [Custom Map](en-us/customize_map) + +**Platform Support** + +[Jupyter Notebook](en-us/jupyter_notebook) | [Flask](en-us/flask) | [Django](en-us/django) | [Web Integration](en-us/web_integration) + +**Other Resources** + +[Demo Projects](https://github.com/pyecharts/pyecharts-users-cases) | [Map Extension](https://github.com/pyecharts/echarts-china-cities-js) + +**Development** + +[Changelog](zh-cn/changelog) | [Release Note](zh-cn/release-note) | [Team](en-us/team) | [FAQ](en-us/faq) diff --git a/docs/en-us/_sidebar.md b/docs/en-us/_sidebar.md new file mode 100644 index 000000000..988277a13 --- /dev/null +++ b/docs/en-us/_sidebar.md @@ -0,0 +1,10 @@ +- [Quick Start](en-us/prepare) +- [Charts](en-us/charts) +- [Map extensions](en-us/customize_map) +- [pyecharts+Flask](en-us/flask) +- [pyecharts+Django](en-us/django) +- [Web integration](en-us/web_integration) +- [Screenshots](zh-cn/gallery) +- [API](en-us/api) +- [FAQ](en-us/faq) + diff --git a/docs/en-us/api.md b/docs/en-us/api.md new file mode 100644 index 000000000..fea6a79f4 --- /dev/null +++ b/docs/en-us/api.md @@ -0,0 +1,354 @@ +pyecharts API + +This document describes the public API for *pyecharts* library and it will be read by users and developers. + +## Total Proccess + +A common proccess can be listed as the following table: + +| Step | Code Demo | Remark | +| ------------------------ | ---------------------------------------- | ------ | +| 1 Create chart instance | `bar = Bar()` | | +| 2 Add data | `bar.add(**kwargs)` | | +| 3 Create config instance | `config = PyEchartsConfig(**kwargs)` | | +| 4 Create template engine | `engine = EchartsEnvironment(pyecharts_config=config)` | | +| 5 Get template file | `tpl = engine.get_template('demo_tpl.html')` | | +| 6 Render | `html = tpl.render(bar=bar)` | | +| 7 Write to target file | `write_utf8_html_file('my_demo_chart.html', html)` | | + + + +## pyecharts Config Items + +pyecharts follows the principle of "Config-Use" . The class `pyecharts.conf.PyEChartsConfig` contains all config items when using *pyecharts* library.Before building chart, you can use module function `configure` to set all config items. + +```python +import pyecharts +pyecharts.configure(P1=V1, P2=V2,...) +``` + +### Config Item List + +**echarts_template_dir** + +The diretory of template files. Default value: '.'(current diretory). + +**jshost** + +The repository of js dependency files.You can set it with a local host url or remote host url(starts with `http://` or `https://` ). + +You can also use `pyecharts.online()` to set this item. + +WIth the compatibility, this string value do not need `/` as its ending character. + +**force_js_embed** + +Whether to force to insert javascript file with internal embed mode. This item will affect the function`echarts_js_dependencies` . + +## Charts Classes + +Charts classes is the core component of this library.Each charts class represents the one kind of chart in [Echarts](http://echarts.baidu.com/) . + +This pictures the inherit tree for these charts classes. + +![class-relationship-diagram](https://github.com/chenjiandongx/pyecharts/blob/master/images/class-relationship-diagram.png) + +### Properties + +This table list properties for these chart classes. + +| Properites/Charts | Base | Chart/FOO_CHART | Grid | Overlap | Timeline | Page | +| ----------------- | ---- | --------------- | ---- | ------- | -------- | ---- | +| chart_id | ✓ | ✓ | ✓ | ✓ | ✓ | | +| width | ✓ | ✓ | ✓ | ✓ | ✓ | | +| heigth | ✓ | ✓ | ✓ | ✓ | ✓ | | +| options | ✓ | ✓ | ✓ | ✓ | ✓ | | +| js_dependencies | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | + +**chart_id** + +Data type:str.The identifier string for a chart. E.g.`'d2d9dcc4e28247518186c0882d356ba8'` 。 + +**width** + +Data type:number/str.A valid string for css length.The width(px) of div container for a chart. + +**height** + +Data type:number/str.A valid string for css length.The height(px) of div container for a chart. + +**options** + +Data type:dict.The config options for a chart。Each chart has its own format and value.Please see more detail at ECharts document。 + +**js_dependencies** + +*Changed in v0.4* + +Data type:list.The js filename collections for a chart's dependencies.Every element do not contain the filename extension(.js).E.g `{'echarts.min', 'fujian'}` . + +> In previous v0.4, the js_dependencies returns a unordered set. + + +### Methods + +**add()** + +Add options and data to a chart.See the source code for more detail. + +| Chart Class | Function Sign | +| ----------- | ---------------------------------------- | +| Base | `add(**echarts_options)` | +| Grid | `add(grid_width=None, grid_height=None, grid_top=None, grid_bottom=None, grid_left=None, grid_right=None)` | +| Overlap | `add(chart, xaix_index=0, yaix_index=0, id_add_xaxis=False, is_add_yaxis=False)` | +| Timeline | `add(chart, time_point)` | +| Page | `add(achart_or_charts)` | + +**get_js_dependencies()** + +Gert the javascript dependencies of a chart. + +**render(path='render.html')** + +Render to a HTML page. + +**render_embed()** + +Render javascript code fragment including options. + +**print_echarts_options()** + +Print all options of charts.The new alias form `show_config`. + +**show_config()** + +Print all options of charts.From v0.3.3,this method has been deprecated and use `print_echarts_options` instead. + +## Multiple Chart + +`pyecharts.custom.page.Page` is used to show multiple chart in a html page,which includes properties and methods above. + +Also, `Page` inherits built-in `list` and len,iter,index,splice,append,extend are supported. + +Example,print the option for each chart in a page object. + +```python +page = Page() +line = Line('Demo Line') +# ... Add data to line +page.add(line) +kline = KLine('Demo kline') +# ... Add data to kline +page.append(kline) + +for chart in page: + chart.show_config() +``` + + + +## Data Hanlder Methods + +These methods are tool methods for data handlers. + +**cast** + +`pyecharts.base.Base.cast(seq)` + +Class method for formatting and converting data.It can convert your origin data to the corresponding data for pyecharts library. + +Example: + +```python +o_data = [('A', '34'), ('B', '45'), ('C', '12')] +x, y = Base.cast(o_data) +print(x) # ['A', 'B', 'C'] +print(y) # ['34', '45', '12'] +``` + +**json_dumps** + +`pyecharts.utils.json_dumps(data, indent=0)` + +Convert *data* to json string, and add encoding for some specified data type: + +- Convert Datetime and Time objects to ISO8601 format string. +- Cast numpy arrays. See the document of [astype](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.astype.html) and [tolist](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.tolist.html) . + +## Template Engine + +### Overview + +*pyecharts* use [Jinja2](http://jinja.pocoo.org/) as its template engine, with some extra template functions. + +> *Tempate function* and *template tag* is the same feature in the area of template engine.In Django it is called *template tag* and it is called *template function* in jinja2. + +### Engine Class + +`pyecharts.engine` module defines some engine class, which inherit from `jinja2.Environment`.Each class has different use case. + +**BaseEnvironment** + +`pyecharts.engine.BaseEnvironment` + +This class is the basic engine in pyecharts,and it inherits `jinja2.Environment` .It has the following extra features: + +- Add *pyecharts_config* attribute, it is a `PyEchartsConfig` object. +- Add `echarts_*` template functions + +This class can be used for integration with web framework. + +**EChartsEnvironment** + +`pyecharts.engine.EChartsEnvironment` + +EChartsEnvironment class inherits `BaseEnvironment` .And it use `pyecharts_config.echarts_template_dir` as the default value of template folder. + +This class should not be used in web integration because of overwriting the default behavior of template file loader. + +**ECHAERTS_TEMPLATE_FUNCTIONS** + +`pyecharts.engine.ECHAERTS_TEMPLATE_FUNCTIONS` + +The dictionary containing template functions.It can be used in web integration. + +### 模板函数 + + pyecharts contains some template functions, which receives a or some `Chart` / `Page` objects as its parameter.See the following table. + +| Function Name/Function Sign | F(chart) | F(page) | F(chart1,chart2,...)/F(*page) | +| ----------------------------- | -------- | ------- | ----------------------------- | +| echarts_js_dependencies | ✓ | ✓ | ✓ | +| echarts_js_dependencies_embed | ✓ | ✓ | ✓ | +| echarts_container | ✓ | | | +| echarts_js_content | ✓ | ✓ | ✓ | +| echarts_js_content_wrap | ✓ | ✓ | ✓ | + + + +**echarts_js_dependencies** + +`pyecharts.template.echarts_js_dependencies(*args)` + +Render script html nodes with internal embed mode or enternal link.The mode will follow this table. + +Internal Embed(IE) + +```html + +``` + +Enternal Link(EL) + +```html + +``` + +Which mode is used is determined by the `PyEchartsConfig.jshost` and `PyEchartsConfig.force_js_embed` .See this table. + +| Value | local/remote | script mode | Use Case | Remark | +| ---------------------------------------- | ------------ | ----------- | ------------------------- | --------------------- | +| `/template/js/echarts` | local | IE | Generate one file locally | Default value | +| `'https://chfw.github.io/jupyter-echarts/echarts'` | remote | IE | Generate on file | switch using `online` | +| Other Local Host (E.g. `/static/js`) | local | EL | Integrate with Web | | +| Other Remote Host(E.g. `hthttps://cdn.bootcss.com/echarts/3.7.2`) | remote | EL | Use remote JS | | + +Example + +``` +# Jinja2 Context function +{{ echarts_js_dependencies('echarts') }} +# Html Output + + +# Python +bar = Bar('Demo Bar') +# Jinja2 Context function +{{ echarts_js_dependencies(bar) }} +# Html Output + +``` + + + +**echarts_js_dependencies_embed** + +`pyecharts.template.echarts.js_dependencies_embed(*args)` + +Render script nodes in internal embed mode.Only support local host. + +**echarts_container** + +`pyecharts.template.echarts_container(chart)` + +Render the html node of container,output `
` element. + +Example + +``` +# Python Code +bar = Bar('Demo Bar') +# Jinjia2 Context Function +{{ echarts_container(bar) }} +# Html Output +
+``` + + + +**echarts_js_content** + +`pyecharts.template.echarts_container(*chart)` + +Render the js initial code fragment without the `` . + +**echarts_js_content_wrap** + +`pyecharts.template.echarts_js_content_wrap(*args)` + +Render the js initial code fragment with the `` . + +### Example + +This is a full example. + +The pythonfile:demo.py + +```python +from jinja2 import FileSystemLoader +from pyecharts import Bar +from pyecharts.engine import EchartsEnvironment +from pyecharts.utils import write_utf8_html_file + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +bar = Bar("柱状图数据堆叠示例", jshost=' https://cdn.bootcss.com/echarts/3.6.2') +bar.add("商家A", attr, v1, is_stack=True) +bar.add("商家B", attr, v2, is_stack=True) +env = EchartsEnvironment(loader=FileSystemLoader('.')) +tpl = env.get_template('demo.html') +html = tpl.render(bar=bar) +write_utf8_html_file('demo_gen.html', html) +``` + +The template file:demo.html + +```html + + + + + 自定义模板 + {{ echarts_js_dependencies(bar) }} + + +{{ echarts_container(bar) }} +{{ echarts_js_content(bar) }} + + +``` + diff --git a/docs/en-us/charts.md b/docs/en-us/charts.md new file mode 100644 index 000000000..4a5c24f9e --- /dev/null +++ b/docs/en-us/charts.md @@ -0,0 +1,2259 @@ +> Charts: pyecharts configurations + +* Chart initialization +* General options + * xyAxis:x, y axis in cartesian coordinate system(Line, Bar, Scatter, EffectScatter, Kline) + * dataZoom:dataZoom components for zoom-in and zoom-out. With them, it is possible to magnify a small area, to see the overall picture or to stay away from scattered points(Line, Bar, Scatter, EffectScatter, Kline) + * legend:legend component has different symbol, colour and name, and provide the interactive clicking functions to show or hide its associated data series. + * label:text string on the chart, for marking the charts with sensible details, such as value, name. + * lineStyle:line style for Line, Polar, Radar, Graph, Parallel. + * grid3D:gird3D components in cartesian coordinate system(Bar3D, Line3D, Scatter3D) + * visualMap:It is a type of component for visual encoding, which maps the data to visual channels +* Charts + * Bar + * Bar3D + * EffectScatter + * Funnel + * Gauge + * Geo + * Graph + * HeatMap + * Kline + * Line + * Line3D + * Liquid + * Map + * Parallel + * Pie + * Polar + * Radar + * Scatter + * Scatter3D + * WordCloud +* Customize + * Grid + * Overlap + * Page + * Timeline +* Style +* About + + +# Chart initialization +The parameter a chart type initialize accept(the same to all the chart type). + +* title -> str + default -> '' + The main title text, supporting for \n for newlines. +* subtitle -> str + defalut -> '' + Subtitle text, supporting for \n for newlines. +* width -> int + defalut -> 800(px) + Canvas width +* height -> int + defalut -> 400(px) + Canvas height +* title_pos -> str/int + defalut => 'left' + Distance between grid component and the left side of the container.title_pos value can be instant pixel value like 20; + it can also be percentage value relative to container width like '20%';it can also be 'left', 'center', or 'right'. + If the title_pos value is set to be 'left', 'center', or 'right',then the component will be aligned automatically based on position. +* title_top -> str/int + default -> 'top' + Distance between grid component and the top side of the container.top value can be instant pixel value like 20; + it can also be percentage value relative to container width like '20%';it can also be 'top', 'middle', or 'bottom'. + If the left value is set to be 'top', 'middle', or 'bottom',then the component will be aligned automatically based on position. +* title_color -> str + defalut -> '#000' + main title text color. +* subtitle_color -> str + defalut -> '#aaa' + subtitle text color. +* title_text_size -> int + defalut -> 18 + main title font size +* subtitle_text_size -> int + defalut -> 12 + subtitle text color. +* background_color -> str + defalut -> '#fff' + Background color of title, which is transparent by default. + Color can be represented in RGB, for example 'rgb(128, 128, 128)'.RGBA can be used when you need alpha channel, for example 'rgba(128, 128, 128, 0.5)'. + You may also use hexadecimal format, for example '#ccc'. +* page_title -> str + You can specify the title for render.html. Default is 'Echarts' + + +# General options + +**Sitting general configuration in```add()```** + +xyAxis:x, y axis in cartesian coordinate system(Line, Bar, Scatter, EffectScatter, Kline) + +* is_convert -> bool + It specifies whether to convert xAxis and yAxis. +* xy_text_size -> int + axis name font size +* namegap -> int + Gap between axis name and axis line. +* x_axis -> list + xAxis data +* xaxis_name -> str + Name of xAxis +* xaxis_name_pos -> str + Location of xAxis name.It can be 'start','middle','end' +* xaxis_rotate -> int + Rotation degree of xaxis label, which is especially useful when there is no enough space for category axis.Rotation degree is from -90 to 90. +* xaxis_min -> int/float + The minimun value of xaxis. +* xaxis_max -> int/float + The maximun value of xaxis. +* xaxis_type -> str + Type of xaxis + * 'value': Numerical axis, suitable for continuous data. + * 'category': Category axis, suitable for discrete category data. Data should only be set via data for this type. + * 'time': Time axis, suitable for continuous time series data. As compared to value axis,it has a better formatting for time and a different tick calculation method. For example,it decides to use month, week, day or hour for tick based on the range of span. + * 'log': Log axis, suitable for log data. +* y_axis -> list + yAxis data +* yaxis_formatter -> str + Formatter of axis label, which supports string template and callback function.example: '{value} kg' +* yaxis_name -> str + Name of yAxis +* yaxis_name_pos -> str + Location of yAxis name.It can be 'start','middle','end' +* yaxis_rotate -> int + Rotation degree of xaxis label, which is especially useful when there is no enough space for category axis.Rotation degree is from -90 to 90. +* yaxis_min -> int/float + The minimun value of yaxis. +* yaxis_max -> int/float + The maximun value of yaxis. +* yaxis_type -> str + Type of yaxis + * 'value': Numerical axis, suitable for continuous data. + * 'category': Category axis, suitable for discrete category data. Data should only be set via data for this type. + * 'time': Time axis, suitable for continuous time series data. As compared to value axis,it has a better formatting for time and a different tick calculation method. For example,it decides to use month, week, day or hour for tick based on the range of span. + * 'log': Log axis, suitable for log data. +* interval -> int + The display interval of the axis scale label is valid in the category axis.By default, labels are displayed using labels that do not overlap the labels. + Set to 0 to force all labels to be displayed and label is one by one if setting as 1; If 2, it will be one label separates from each other, and so on. + + +dataZoom:dataZoom components for zoom-in and zoom-out. With them, it is possible to magnify a small area, to see the overall picture or to stay away from scattered points(Line, Bar, Scatter, EffectScatter, Kline) + +* is_datazoom_show -> bool + defalut -> False + It specifies whether to use the datazoom component. +* datazoom_type -> str + defalut -> 'slider' + datazoom type, 'slider', 'inside', or 'both' +* datazoom_range -> list + defalut -> [50, 100] + The range percentage of the window out of the data extent, in the range of 0 ~ 100. +* datazoom_orient -> str + Specify whether the layout of dataZoom component is horizontal or vertical.'horizontal' or 'vertical' + What's more,it indicates whether the horizontal axis or vertical axis is controlled,by default in catesian coordinate system. + + +legend:legend component has different symbol, colour and name, and provide the interactive clicking functions to show or hide its associated data series. + +* is_legend_show -> bool + defalut -> True + It specifies whether to show the legend component. +* legend_orient -> str + defalut -> 'horizontal' + The layout orientation of legend.It can be 'horizontal', 'vertical' +* legend_pos -> str + defalut -> 'center' + Distance between legend component and the left side of the container. + legend_pos value can be instant pixel value like 20;it can also be percentage value relative to container width like '20%'; + and it can also be 'left', 'center', or 'right'. +* legend_top -> str + defalut -> 'top' + Distance between legend component and the top side of the container. + legend_top value can be instant pixel value like 20;it can also be percentage value relative to container width like '20%'; + and it can also be 'top', 'middle', or 'bottom'. +* legend_selectedmode -> str/bool + State table of selected legend. 'single' or 'multiple'.or use False to disable it. + + +label:text string on the chart, for marking the charts with sensible details, such as value, name. + +* is_label_show -> bool + defalut -> False + It specifies whether to show laebl in normal status. +* is_emphasis -> bool + defalut -> False + It specifies whether to show laebl in emphasis status. +* label_pos -> str + defalut -> 'top' + Label position.It can be 'top', 'left', 'right', 'bottom', 'inside','outside' +* label_text_color -> str + defalut -> '#000' + Label text color. +* label_text_size -> int + defalut -> 12 + Label font size. +* is_random -> bool + defalut -> False + It specifies whether to random global color list. +* label_color -> list + Customize the label color. It will modify Global color list, and all chart legend colors can be config here. Such as Bar's columnar color, Line's line color, and so on. +* formatter -> list + Data label formatter,it can be 'series', 'name', 'value', 'precent' + +**Tip:** is_random random disorganize legend colour and list,it's kind of switch style? try it. + + +lineStyle:line style for Line, Polar, Radar, Graph, Parallel. + +* line_width -> int + default -> 1 + Line width. +* line_opacity -> float + default -> 1 + Opacity of the component. Supports value from 0 to 1, and the component will not be drawn when set to 0. +* line_curve -> float + default -> 0 + Edge curvature, which supports value from 0 to 1. The larger the value, the greater the curvature. -> Graph +* line_type -> str + Line type,it can be 'solid', 'dashed', 'dotted' + +grid3D:gird3D components in cartesian coordinate system(Bar3D, Line3D, Scatter3D) + +* grid_width -> int + Width of grid component. Adaptive by default. +* grid_height -> int + Height of grid component. Adaptive by default. +* grid_top -> int/str + Distance between grid component and the top side of the container. + grid_top value can be instant pixel value like 20;it can also be percentage value relative to container width like '20%';and it can also be 'top', 'middle', or 'bottom'. + If the grid_top value is set to be 'top', 'middle', or 'bottom',then the component will be aligned automatically based on position. +* grid_bottom -> int/str + Distance between grid component and the bottom side of the container. + grid_bottom value can be instant pixel value like 20;it can also be percentage value relative to container width like '20%'. +* grid_left -> int/str + Distance between grid component and the left side of the container. + grid_left value can be instant pixel value like 20;it can also be percentage value relative to container width like '20%';and it can also be 'left', 'center', or 'right'. + If the grid_left value is set to be 'left', 'center', or 'right',then the component will be aligned automatically based on position. +* grid_right -> int/str + Distance between grid component and the right side of the container. + grid_right value can be instant pixel value like 20;it can also be percentage value relative to container width like '20%'. + +visualMap:It is a type of component for visual encoding, which maps the data to visual channels. + +* visual_type -> str + visual map type, 'color' or 'size' + color: For visual channel color, array is used, like: ['#333', '#78ab23', 'blue'],which means a color ribbon is formed based on the three color stops,and dataValues will be mapped to the ribbon. + size: For visual channel size, array is used, like: [20, 50],which means a size ribbon is formed based on the two value stops, and dataValues will be mapped to the ribbon. +* visual_range -> list + pecify the min and max dataValue for the visualMap component. +* visual_text_color -> str + visualMap text color. +* visual_range_text -> list + The label text on both ends, such as ['High', 'Low'] +* visual_range_size -> list + For visual channel size, array is used, like: [20, 50]. +* visual_range_color -> list + For visual channel color, array is used, like: ['#333', '#78ab23', 'blue']. +* visual_orient -> str + How to layout the visualMap component, 'horizontal' or 'vertical'. +* visual_pos -> str + Distance between visualMap component and the left side of the container. + visual_pos value can be instant pixel value like 20;it can also be percentage value relative to container width like '20%';and it can also be 'left', 'center', or 'right'. +* visual_top -> str + Distance between visualMap component and the top side of the container. + visual_top value can be instant pixel value like 20;it can also be percentage value relative to container width like '20%';and it can also be 'top', 'middle', or 'bottom'. +* is_calculable -> bool + Whether show handles, which can be dragged to adjust "selected range". + + +# Chart-types + +## Bar +> Bar chart shows different data through the height of a bar,which is used in rectangular coordinate with at least 1 category axis. + +Bar.add() signatures +```python +add(name, x_axis, y_axis, is_stack=False, **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* x_axis -> list + data of xAixs +* y_axis -> list + data of yAxis +* is_stack -> bool + defalut -> False + It specifies whether to stack category axis. + +```python +from pyecharts import Bar + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +bar = Bar("柱状图数据堆叠示例") +bar.add("商家A", attr, v1, is_stack=True) +bar.add("商家B", attr, v2, is_stack=True) +bar.render() +``` + +![bar-0](https://user-images.githubusercontent.com/19553554/35081597-0c3e7212-fc50-11e7-8f72-af6c552223e8.gif) + +**Tip:** Global configuration item needs set in the last ```add()``` or the setting will lose efficacy. + +```python +from pyecharts import Bar + +bar = Bar("标记线和标记点示例") +bar.add("商家A", attr, v1, mark_point=["average"]) +bar.add("商家B", attr, v2, mark_line=["min", "max"]) +bar.render() +``` +![bar-1](https://user-images.githubusercontent.com/19553554/35081600-0ea23f0c-fc50-11e7-894b-65ad0f611a01.gif) + +* mark_point -> list + mark point data, it can be 'min', 'max', 'average' +* mark_line -> list + mark line data, it can be 'min', 'max', 'average' +* mark_point_symbol -> str + default -> 'pin' + mark symbol, it cna be 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow' +* mark_point_symbolsize -> int + default -> 50 + mark symbol size +* mark_point_textcolor -> str + default -> '#fff' + mark point text color + +```python +from pyecharts import Bar + +bar = Bar("x 轴和 y 轴交换") +bar.add("商家A", attr, v1) +bar.add("商家B", attr, v2, is_convert=True) +bar.render() +``` +![bar-2](https://user-images.githubusercontent.com/19553554/35081605-151472ce-fc50-11e7-8627-66929309b08c.png) + +dataZoom effect,'slider' type +```python +import random + +attr = ["{}天".format(i) for i in range(30)] +v1 = [random.randint(1, 30) for _ in range(30)] +bar = Bar("Bar - datazoom - slider 示例") +bar.add("", attr, v1, is_label_show=True, is_datazoom_show=True) +bar.show_config() +bar.render() +``` +![bar-4](https://user-images.githubusercontent.com/19553554/35081742-ddcbf3e0-fc50-11e7-937e-f806fd12c83e.gif) + +'inside' type +```python +attr = ["{}天".format(i) for i in range(30)] +v1 = [random.randint(1, 30) for _ in range(30)] +bar = Bar("Bar - datazoom - inside 示例") +bar.add("", attr, v1, is_datazoom_show=True, datazoom_type='inside', datazoom_range=[10, 25]) +bar.show_config() +bar.render() +``` +![bar-5](https://user-images.githubusercontent.com/19553554/35081801-307b3d26-fc51-11e7-8ac7-eea2f2422402.gif) + +'both' type + +```python +attr = ["{}天".format(i) for i in range(30)] +v1 = [random.randint(1, 30) for _ in range(30)] +bar = Bar("Bar - datazoom - inside 示例") +bar.add("", attr, v1, is_datazoom_show=True, datazoom_type='both', + datazoom_range=[10, 25]) +bar.render() +``` +![bar-8](https://user-images.githubusercontent.com/19553554/35081813-37fc4072-fc51-11e7-9b5c-a3ca2f0d1fef.gif) + + +**Note:** datazoom can be used for Line、Bar、Scatter、EffectScatter、Kline + +if axis labels are too long, rotation is a good solution. + +```python +attr = ["{}天".format(i) for i in range(20)] +v1 = [random.randint(1, 20) for _ in range(20)] +bar = Bar("坐标轴标签旋转示例") +bar.add("", attr, v1, xaxis_interval=0, xaxis_rotate=30, yaxis_rotate=30) +bar.render() +``` +![bar-6](https://user-images.githubusercontent.com/19553554/35081805-3258a2be-fc51-11e7-9cb1-d99c1a707bc5.png) + +**Tip:** Datazoom fits all plane rectangular coordinate system figure,that's(Line, Bar, Scatter, EffectScatter, Kline) +**Tip:** Through label_color to set column's colour,like ['#eee', '#000'],any type of chart's legend colour can revise by label_color . + + +waterfall example + +```python +from pyecharts import Bar + +attr = ["{}月".format(i) for i in range(1, 8)] +v1 = [0, 100, 200, 300, 400, 220, 250] +v2 = [1000, 800, 600, 500, 450, 400, 300] +bar = Bar("瀑布图示例") +# 利用第一个 add() 图例的颜色为透明,即 'rgba(0,0,0,0)',并且设置 is_stack 标志为 True +bar.add("", attr, v1, label_color=['rgba(0,0,0,0)'], is_stack=True) +bar.add("月份", attr, v2, is_label_show=True, is_stack=True, label_pos='inside') +bar.render() +``` +![bar-7](https://user-images.githubusercontent.com/19553554/35081807-34a5568e-fc51-11e7-8199-3c3f8f43ba98.png) + +fat histogram example + +```python +from pyecharts import Bar + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +bar = Bar("直方图示例") +bar.add("", attr * 2, v1 + v2, bar_category_gap=0) +bar.render() +``` +![bar-9](https://user-images.githubusercontent.com/19553554/35081820-3c6f2ad4-fc51-11e7-8600-9212e7e8b519.png) + +Double histograms +```python +from pyecharts import Bar + +attr = ["{}月".format(i) for i in range(1, 13)] +v1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3] +v2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3] +bar = Bar("柱状图示例") +bar.add("蒸发量", attr, v1, mark_line=["average"], mark_point=["max", "min"]) +bar.add("降水量", attr, v2, mark_line=["average"], mark_point=["max", "min"]) +bar.render() +``` +![bar-10](https://user-images.githubusercontent.com/19553554/35081822-3e090748-fc51-11e7-8bba-b775d29671e4.png) + + +## Bar3D +Bar3D.add() signatures +``` +add(name, x_axis, y_axis, data, grid3D_opacity=1, grid3D_shading='color', **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* x_axis -> list + xAxis data +* y_axis -> list + yAxis data +* data -> [[], []] + zAxis data, it is represented by a two-dimension array. +* grid3D_opacity -> float + default -> 1 + opacity of gird3D item +* grid3D_shading -> str + 3D graphics coloring effect + * 'color': Only show color, not affected by lighting and other factors. + * 'lambert': Through the classic lambert coloring to show the light and shade. + * 'realistic': Realistic rendering. + +```python +from pyecharts import Bar3D + +bar3d = Bar3D("3D 柱状图示例", width=1200, height=600) +x_axis = ["12a", "1a", "2a", "3a", "4a", "5a", "6a", "7a", "8a", "9a", "10a", "11a", + "12p", "1p", "2p", "3p", "4p", "5p", "6p", "7p", "8p", "9p", "10p", "11p"] +y_aixs = ["Saturday", "Friday", "Thursday", "Wednesday", "Tuesday", "Monday", "Sunday"] +data = [[0, 0, 5], [0, 1, 1], [0, 2, 0], [0, 3, 0], [0, 4, 0], [0, 5, 0], [0, 6, 0], [0, 7, 0], + [0, 8, 0],[0, 9, 0], [0, 10, 0], [0, 11, 2], [0, 12, 4], [0, 13, 1], [0, 14, 1], [0, 15, 3], + [0, 16, 4], [0, 17, 6], [0, 18, 4], [0, 19, 4], [0, 20, 3], [0, 21, 3], [0, 22, 2], [0, 23, 5], + [1, 0, 7], [1, 1, 0], [1, 2, 0], [1, 3, 0], [1, 4, 0], [1, 5, 0], [1, 6, 0], [1, 7, 0], [1, 8, 0], + [1, 9, 0], [1, 10, 5], [1, 11, 2], [1, 12, 2], [1, 13, 6], [1, 14, 9], [1, 15, 11], [1, 16, 6], [1, 17, 7], + [1, 18, 8], [1, 19, 12], [1, 20, 5], [1, 21, 5], [1, 22, 7], [1, 23, 2], [2, 0, 1], [2, 1, 1], + [2, 2, 0], [2, 3, 0], [2, 4, 0], [2, 5, 0], [2, 6, 0], [2, 7, 0], [2, 8, 0], [2, 9, 0], [2, 10, 3], + [2, 11, 2], [2, 12, 1], [2, 13, 9], [2, 14, 8], [2, 15, 10], [2, 16, 6], [2, 17, 5], [2, 18, 5], + [2, 19, 5], [2, 20, 7], [2, 21, 4], [2, 22, 2], [2, 23, 4], [3, 0, 7], [3, 1, 3], [3, 2, 0], [3, 3, 0], + [3, 4, 0], [3, 5, 0], [3, 6, 0], [3, 7, 0], [3, 8, 1], [3, 9, 0], [3, 10, 5], [3, 11, 4], [3, 12, 7], + [3, 13, 14], [3, 14, 13], [3, 15, 12], [3, 16, 9], [3, 17, 5], [3, 18, 5], [3, 19, 10], [3, 20, 6], + [3, 21, 4], [3, 22, 4], [3, 23, 1], [4, 0, 1], [4, 1, 3], [4, 2, 0], [4, 3, 0], [4, 4, 0], [4, 5, 1], + [4, 6, 0], [4, 7, 0], [4, 8, 0], [4, 9, 2], [4, 10, 4], [4, 11, 4], [4, 12, 2], [4, 13, 4], [4, 14, 4], + [4, 15, 14], [4, 16, 12], [4, 17, 1], [4, 18, 8], [4, 19, 5], [4, 20, 3], [4, 21, 7], [4, 22, 3], + [4, 23, 0], [5, 0, 2], [5, 1, 1], [5, 2, 0], [5, 3, 3], [5, 4, 0], [5, 5, 0], [5, 6, 0], [5, 7, 0], + [5, 8, 2], [5, 9, 0], [5, 10, 4], [5, 11, 1], [5, 12, 5], [5, 13, 10], [5, 14, 5], [5, 15, 7], [5, 16, 11], + [5, 17, 6], [5, 18, 0], [5, 19, 5], [5, 20, 3], [5, 21, 4], [5, 22, 2], [5, 23, 0], [6, 0, 1], [6, 1, 0], + [6, 2, 0], [6, 3, 0], [6, 4, 0], [6, 5, 0], [6, 6, 0], [6, 7, 0], [6, 8, 0], [6, 9, 0], [6, 10, 1], + [6, 11, 0], [6, 12, 2], [6, 13, 1], [6, 14, 3], [6, 15, 4], [6, 16, 0], [6, 17, 0], [6, 18, 0], [6, 19, 0], + [6, 20, 1], [6, 21, 2], [6, 22, 2], [6, 23, 6]] +range_color = ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] +bar3d.add("", x_axis, y_aixs, [[d[1], d[0], d[2]] for d in data], is_visualmap=True, + visual_range=[0, 20], visual_range_color=range_color, grid3D_width=200, grid3D_depth=80) +bar3d.show_config() +bar3d.render() +``` +![bar3d-0](https://user-images.githubusercontent.com/19553554/35081629-36a8e046-fc50-11e7-8910-e02bf24008d9.gif) + +``` grid3D_shading``` could make bar look more real +```python +bar3d = Bar3D("3D 柱状图示例", width=1200, height=600) +bar3d.add("", x_axis, y_aixs, [[d[1], d[0], d[2]] for d in data], is_visualmap=True, + visual_range=[0, 20], visual_range_color=range_color, grid3D_width=200, grid3D_depth=80, + grid3D_shading='lambert') +bar3d.show_config() +bar3d.render() +``` + +![bar3d-1](https://user-images.githubusercontent.com/19553554/35081631-38a0cb02-fc50-11e7-9f74-3d487bd98a3a.gif) + +```is_grid3D_rotate``` could let it rotate automatically +```python +bar3d = Bar3D("3D 柱状图示例", width=1200, height=600) +bar3d.add("", x_axis, y_aixs, [[d[1], d[0], d[2]] for d in data], is_visualmap=True, + visual_range=[0, 20], visual_range_color=range_color, grid3D_width=200, grid3D_depth=80, + is_grid3D_rotate=True) +bar3d.show_config() +bar3d.render() +``` +![bar3d-2](https://user-images.githubusercontent.com/19553554/35081703-a70b544a-fc50-11e7-838a-53445cd8d203.gif) + +set ``` grid3D_rotate_speed``` to adjust the rotation speed +```python +bar3d = Bar3D("3D 柱状图示例", width=1200, height=600) +bar3d.add("", x_axis, y_aixs, [[d[1], d[0], d[2]] for d in data], is_visualmap=True, + visual_range=[0, 20], visual_range_color=range_color, grid3D_width=200, grid3D_depth=80, + is_grid3D_rotate=True, grid3D_rotate_speed=180) +bar3d.show_config() +bar3d.render() +``` +![bar3d-3](https://user-images.githubusercontent.com/19553554/35081705-a92a878c-fc50-11e7-8427-9066456db54c.gif) + +**Tip:** more details aboutt gird3D,please refer to [Global-options](https://github.com/chenjiandongx/pyecharts/blob/master/document/en-us/documentation.md#Global-options) + + +## EffectScatter +> The scatter graph with ripple animation. The special animation effect can visually highlights some data. + +EffectScatter.add() signatures +```python +add(name, x_value, y_value, symbol_size=10, **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* x_axis -> list + data of xAxis +* y_axis -> list + data of yAxis +* symbol_size -> int + default -> 10 + symbol size + +```python +from pyecharts import EffectScatter + +v1 = [10, 20, 30, 40, 50, 60] +v2 = [25, 20, 15, 10, 60, 33] +es = EffectScatter("动态散点图示例") +es.add("effectScatter", v1, v2) +es.render() +``` +![effectscatter-0](https://user-images.githubusercontent.com/19553554/35090528-e4c9a04c-fc74-11e7-938a-d348bb1fdbf8.gif) + +```python +es = EffectScatter("动态散点图各种图形示例") +es.add("", [10], [10], symbol_size=20, effect_scale=3.5, effect_period=3, symbol="pin") +es.add("", [20], [20], symbol_size=12, effect_scale=4.5, effect_period=4,symbol="rect") +es.add("", [30], [30], symbol_size=30, effect_scale=5.5, effect_period=5,symbol="roundRect") +es.add("", [40], [40], symbol_size=10, effect_scale=6.5, effect_brushtype='fill',symbol="diamond") +es.add("", [50], [50], symbol_size=16, effect_scale=5.5, effect_period=3,symbol="arrow") +es.add("", [60], [60], symbol_size=6, effect_scale=2.5, effect_period=3,symbol="triangle") +es.render() +``` +![effectscatter-1](https://user-images.githubusercontent.com/19553554/35090533-e7330076-fc74-11e7-9ba0-7cc4ff80e030.gif) + + +* symbol -> str + symbol shape, it can be 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow' +* effect_brushtype -> str + default -> 'stroke' + The brush type for ripples. options: 'stroke' and 'fill'. +* effect_scale -> float + default -> 2.5 + The maximum zooming scale of ripples in animation. +* effect_period -> float + default -> 4(s) + The duration of animation. + + +## Funnel +Funnel.add() signatures +```python +add(name, attr, value, **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* attr -> list + name of attribute +* value -> list + value of attribute + +```python +from pyecharts import Funnel + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +value = [20, 40, 60, 80, 100, 120] +funnel = Funnel("漏斗图示例") +funnel.add("商品", attr, value, is_label_show=True, label_pos="inside", label_text_color="#fff") +funnel.render() +``` +![funnel-0](https://user-images.githubusercontent.com/19553554/35090181-d6b0e886-fc73-11e7-8e00-dec8ac38c415.gif) + +```python +funnel = Funnel("漏斗图示例", width=600, height=400, title_pos='center') +funnel.add("商品", attr, value, is_label_show=True, label_pos="outside", legend_orient='vertical', + legend_pos='left') +funnel.show_config() +funnel.render() +``` +![funnel-1](https://raw.githubusercontent.com/pyecharts/pyecharts/master/images/funnel-1.png) + + +## Gauge +Gauge.add() signatures +```python +add(name, attr, value, scale_range=None, angle_range=None, **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* attr -> list + name of attribute +* value -> list + value of attribute +* scale_range -> list + default -> [0, 100] + data range of guage +* angle_range -> list + default -> [225, -45] + angle range of guage.The direct right side of circle center is 0 degree,the right above it is 90 degree, the direct left side of it is 180 degree. + +```python +from pyecharts import Gauge + +gauge = Gauge("仪表盘示例") +gauge.add("业务指标", "完成率", 66.66) +gauge.show_config() +gauge.render() +``` +![gauge-0](https://user-images.githubusercontent.com/19553554/35090190-daa33eee-fc73-11e7-9710-7844b12d3e6b.png) + +```python +gauge = Gauge("仪表盘示例") +gauge.add("业务指标", "完成率", 166.66, angle_range=[180, 0], scale_range=[0, 200], is_legend_show=False) +gauge.show_config() +gauge.render() +``` + +![gauge-1](https://user-images.githubusercontent.com/19553554/35090193-dc199d22-fc73-11e7-8f4d-22477a3a22be.png) + +## Geo +> Geographic coorinate system component.Geographic coorinate system component is used to draw maps, which also supports scatter series, and line series. + +Geo.add() signatures +```python +add(name, attr, value, type="scatter", maptype='china', symbol_size=12, border_color="#111", + geo_normal_color="#323c48", geo_emphasis_color="#2a333d", **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* attr -> list + name of attribute +* value -> list + value of attribute +* type -> str + default -> 'scatter' + chart type, it can be 'scatter', 'effectscatter', 'heatmap' +* maptype -> str + type of map, it only supports 'china' temporarily. +* symbol_size -> int + default -> 12 + symbol size +* border_color -> str + default -> '#111' + color of map border +* geo_normal_color -> str + default -> '#323c48' + The color of the map area in normal state +* geo_emphasis_color -> str + default -> '#2a333d' + The color of the map area in emphasis state + +Scatter type +```python +from pyecharts import Geo + +data = [ + ("海门", 9),("鄂尔多斯", 12),("招远", 12),("舟山", 12),("齐齐哈尔", 14),("盐城", 15), + ("赤峰", 16),("青岛", 18),("乳山", 18),("金昌", 19),("泉州", 21),("莱西", 21), + ("日照", 21),("胶南", 22),("南通", 23),("拉萨", 24),("云浮", 24),("梅州", 25), + ("文登", 25),("上海", 25),("攀枝花", 25),("威海", 25),("承德", 25),("厦门", 26), + ("汕尾", 26),("潮州", 26),("丹东", 27),("太仓", 27),("曲靖", 27),("烟台", 28), + ("福州", 29),("瓦房店", 30),("即墨", 30),("抚顺", 31),("玉溪", 31),("张家口", 31), + ("阳泉", 31),("莱州", 32),("湖州", 32),("汕头", 32),("昆山", 33),("宁波", 33), + ("湛江", 33),("揭阳", 34),("荣成", 34),("连云港", 35),("葫芦岛", 35),("常熟", 36), + ("东莞", 36),("河源", 36),("淮安", 36),("泰州", 36),("南宁", 37),("营口", 37), + ("惠州", 37),("江阴", 37),("蓬莱", 37),("韶关", 38),("嘉峪关", 38),("广州", 38), + ("延安", 38),("太原", 39),("清远", 39),("中山", 39),("昆明", 39),("寿光", 40), + ("盘锦", 40),("长治", 41),("深圳", 41),("珠海", 42),("宿迁", 43),("咸阳", 43), + ("铜川", 44),("平度", 44),("佛山", 44),("海口", 44),("江门", 45),("章丘", 45), + ("肇庆", 46),("大连", 47),("临汾", 47),("吴江", 47),("石嘴山", 49),("沈阳", 50), + ("苏州", 50),("茂名", 50),("嘉兴", 51),("长春", 51),("胶州", 52),("银川", 52), + ("张家港", 52),("三门峡", 53),("锦州", 54),("南昌", 54),("柳州", 54),("三亚", 54), + ("自贡", 56),("吉林", 56),("阳江", 57),("泸州", 57),("西宁", 57),("宜宾", 58), + ("呼和浩特", 58),("成都", 58),("大同", 58),("镇江", 59),("桂林", 59),("张家界", 59), + ("宜兴", 59),("北海", 60),("西安", 61),("金坛", 62),("东营", 62),("牡丹江", 63), + ("遵义", 63),("绍兴", 63),("扬州", 64),("常州", 64),("潍坊", 65),("重庆", 66), + ("台州", 67),("南京", 67),("滨州", 70),("贵阳", 71),("无锡", 71),("本溪", 71), + ("克拉玛依", 72),("渭南", 72),("马鞍山", 72),("宝鸡", 72),("焦作", 75),("句容", 75), + ("北京", 79),("徐州", 79),("衡水", 80),("包头", 80),("绵阳", 80),("乌鲁木齐", 84), + ("枣庄", 84),("杭州", 84),("淄博", 85),("鞍山", 86),("溧阳", 86),("库尔勒", 86), + ("安阳", 90),("开封", 90),("济南", 92),("德阳", 93),("温州", 95),("九江", 96), + ("邯郸", 98),("临安", 99),("兰州", 99),("沧州", 100),("临沂", 103),("南充", 104), + ("天津", 105),("富阳", 106),("泰安", 112),("诸暨", 112),("郑州", 113),("哈尔滨", 114), + ("聊城", 116),("芜湖", 117),("唐山", 119),("平顶山", 119),("邢台", 119),("德州", 120), + ("济宁", 120),("荆州", 127),("宜昌", 130),("义乌", 132),("丽水", 133),("洛阳", 134), + ("秦皇岛", 136),("株洲", 143),("石家庄", 147),("莱芜", 148),("常德", 152),("保定", 153), + ("湘潭", 154),("金华", 157),("岳阳", 169),("长沙", 175),("衢州", 177),("廊坊", 193), + ("菏泽", 194),("合肥", 229),("武汉", 273),("大庆", 279)] + +geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff", title_pos="center", +width=1200, height=600, background_color='#404a59') +attr, value = geo.cast(data) +geo.add("", attr, value, visual_range=[0, 200], visual_text_color="#fff", symbol_size=15, is_visualmap=True) +geo.show_config() +geo.render() +``` +![geo-0](https://user-images.githubusercontent.com/19553554/35089650-7f06172e-fc72-11e7-9d4b-14437fb0d8fe.gif) + +**Note:** Please use it with Visualmap + +With Scatter +```python +geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff", + title_pos="center", width=1200, + height=600, background_color='#404a59') +attr, value = geo.cast(data) +geo.add("", attr, value, visual_range=[0, 200], visual_text_color="#fff", + symbol_size=15, is_visualmap=True, is_piecewise=True, visual_split_number=6) +geo.render() +``` +![geo-0-0](https://user-images.githubusercontent.com/19553554/35089651-80d259a0-fc72-11e7-8af9-d96df53c0d49.gif) + +With HeatMap +```python +geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff", + title_pos="center", width=1200, + height=600, background_color='#404a59') +attr, value = geo.cast(data) +geo.add("", attr, value, type="heatmap", is_visualmap=True, visual_range=[0, 300], + visual_text_color='#fff') +geo.render() +``` +![geo-0-1](https://user-images.githubusercontent.com/19553554/35089653-82498f88-fc72-11e7-9811-2aceccd4ed68.gif) + + +With EffectScatter on China map +```python +from pyecharts import Geo + +data = [ + ("海门", 9), ("鄂尔多斯", 12), ("招远", 12), + ("舟山", 12), ("齐齐哈尔", 14), ("盐城", 15) + ] +geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff", + title_pos="center", width=1200, + height=600, background_color='#404a59') +attr, value = geo.cast(data) +geo.add("", attr, value, type="effectScatter", is_random=True, effect_scale=5) +geo.render() +``` +![geo-1](https://user-images.githubusercontent.com/19553554/35089655-844c8902-fc72-11e7-8d1b-a0920ad5baa8.gif) + +With effectScatter on my home province, Canton +```python +from pyecharts import Geo + +data =[ + ('汕头市', 50), ('汕尾市', 60), ('揭阳市', 35), + ('阳江市', 44), ('肇庆市', 72) + ] +geo = Geo("广东城市空气质量", "data from pm2.5", title_color="#fff", + title_pos="center", width=1200, + height=600, background_color='#404a59') +attr, value = geo.cast(data) +geo.add("", attr, value, maptype='广东', type="effectScatter", + is_random=True, effect_scale=5, is_legend_show=False) +geo.render() +``` +![geo-2](https://user-images.githubusercontent.com/19553554/35089657-85d0b7bc-fc72-11e7-8b3d-8127dbe8f780.gif) + + +visualMap:visualMap is a type of component for visual encoding, which maps the data to visual channels +* is_visualmap -> bool + It specifies whether to use the datazoom component. +* visual_range -> list + default -> [0, 100] + pecify the min and max dataValue for the visualMap component. +* visual_text_color -> list + visualMap text color. +* visual_range_text -> list + The label text on both ends, such as ['High', 'Low'] +* visual_range_color -> list + default -> ['#50a3ba', '#eac763', '#d94e5d'] + For visual channel color, array is used, like: ['#333', '#78ab23', 'blue'],which means a color ribbon is formed based on the three color stops,and dataValues will be mapped to the ribbon. + Specifically,the dataValue that equals to visualMap.min will be mapped onto '#333',the dataValue that equals to visualMap.max will be mapped onto 'blue',and other dataValues will be piecewisely interpolated to get the final color. +* visual_orient -> str + default -> 'vertical' + How to layout the visualMap component, 'horizontal' or 'vertical'. +* visual_pos -> str/int + default -> 'left' + Distance between visualMap component and the left side of the container. + visual_pos value can be instant pixel value like 20;it can also be percentage value relative to container width like '20%';and it can also be 'left', 'center', or 'right'. +* visual_top -> str/int + default -> 'top' + Distance between visualMap component and the top side of the container. + visual_top value can be instant pixel value like 20;it can also be percentage value relative to container width like '20%';and it can also be 'top', 'middle', or 'bottom'. +* is_calculable -> bool + default -> True + Whether show handles, which can be dragged to adjust "selected range". + +HeatMap type +```python +geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff", title_pos="center", width=1200, height=600, + background_color='#404a59') +attr, value = geo.cast(data) +geo.add("", attr, value, type="heatmap", is_visualmap=True, visual_range=[0, 300], visual_text_color='#fff') +geo.show_config() +geo.render() +``` +![geo-0-1](https://raw.githubusercontent.com/pyecharts/pyecharts/master/images/geo-0-1.gif) + +EffectScatter type +```python +from pyecharts import Geo + +data = [("海门", 9), ("鄂尔多斯", 12), ("招远", 12), ("舟山", 12), ("齐齐哈尔", 14), ("盐城", 15)] +geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff", title_pos="center", + width=1200, height=600, background_color='#404a59') +attr, value = geo.cast(data) +geo.add("", attr, value, type="effectScatter", is_random=True, effect_scale=5) +geo.show_config() +geo.render() +``` +![geo-1](https://raw.githubusercontent.com/pyecharts/pyecharts/master/images/geo-1.gif) + + +## Graph +> Graph is a diagram to represent nodes and the links connecting nodes. + +Graph.add() signatures +```python +add(name, nodes, links, categories=None, is_focusnode=True, is_roam=True, is_rotatelabel=False, + layout="force", edge_length=50, gravity=0.2, repulsion=50, **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* nodes -> dict + Relational nodes data + * name:Name of data item. # required!! + * x:x value of node position. + * y:y value of node position. + * value:value of data item. + * category:Index of category which the data item belongs to. + * symbol:Symbol of node of this category.Includes 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow' + * symbolSize:symbol size +* links -> dict + Relational data between nodes + * source:name of source node on edge # required!! + * target:name of target node on edge # required!! + * vaule:value of edge,It can be used in the force layout to map to the length of the edge +* categories -> list + Name of category, which is used to correspond with legend and the content of tooltip. +* is_focusnode -> bool + defalut -> True + Whether to focus/highlight the hover node and it's adjacencies. +* is_roam -> bool/str + default -> True + Whether to enable mouse zooming and translating. + If either zooming or translating is wanted,it can be set to 'scale' or 'move'. Otherwise, set it to be true to enable both. +* is_rotatelabel -> bool + default -> False + Whether to rotate the label automatically. +* layout -> str + Graph layout. + default -> 'force' + * none:No any layout, use x, y provided in node as the position of node. + * circular:Adopt circular layout, see the example Les Miserables. + * force:Adopt force-directed layout, see the example Force,the detail about configrations of layout are in graph.force +* edge_length -> int + default -> 50 + The distance between 2 nodes on edge. This distance is also affected by repulsion. + It can be an array to represent the range of edge length.In this case edge with larger value will be shorter, which means two nodes are closer. And edge with smaller value will be longer. +* gravity -> int/float + default -> 0.2 + The gravity factor enforcing nodes approach to the center.The nodes will be closer to the center as the value becomes larger. +* repulsion -> int + default -> 50 + The repulsion factor between nodes. The repulsion will be stronger and the distance between 2 nodes becomes further as this value becomes larger. + It can be an array to represent the range of repulsion. + In this case larger value have larger repulsion and smaller value will have smaller repulsion. + +```python +from pyecharts import Graph + +nodes = [{"name": "结点1", "symbolSize": 10}, + {"name": "结点2", "symbolSize": 20}, + {"name": "结点3", "symbolSize": 30}, + {"name": "结点4", "symbolSize": 40}, + {"name": "结点5", "symbolSize": 50}, + {"name": "结点6", "symbolSize": 40}, + {"name": "结点7", "symbolSize": 30}, + {"name": "结点8", "symbolSize": 20}] +links = [] +for i in nodes: + for j in nodes: + links.append({"source": i.get('name'), "target": j.get('name')}) +graph = Graph("关系图-力引导布局示例") +graph.add("", nodes, links, repulsion=8000) +graph.show_config() +graph.render() + +``` +![graph-0](https://user-images.githubusercontent.com/19553554/35082109-05240854-fc53-11e7-9e92-dd9437c55383.png) + + +```python +graph = Graph("关系图-环形布局示例") +graph.add("", nodes, links, is_label_show=True, repulsion=8000, layout='circular', label_text_color=None) +graph.show_config() +graph.render() +``` +![graph-1](https://user-images.githubusercontent.com/19553554/35082112-07074726-fc53-11e7-9f28-2d3b39c5e162.png) + +```python +from pyecharts import Graph + +import json +with open("data\weibo.json", "r", encoding="utf-8") as f: + j = json.load(f) + nodes, links, categories, cont, mid, userl = j +graph = Graph("微博转发关系图", width=1200, height=600) +graph.add("", nodes, links, categories, label_pos="right", repulsion=50, is_legend_show=False, + line_curve=0.2, label_text_color=None) +graph.show_config() +graph.render() +``` +![graph-2](https://user-images.githubusercontent.com/19553554/35081908-bb313aba-fc51-11e7-8ef5-df20be445d72.gif) + +**Tip:** **lineStyle** parameter is configurable + + +## HeatMap +> Heat map mainly use colors to represent values, which must be used along with visualMap component. +> It can be used in either rectangular coordinate or geographic coordinate.But the behaviour on them are quite different. Rectangular coordinate must have two catagories to use it. + +HeatMap.add() signatures +```python +add(name, x_axis, y_axis, data, **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* x_axis -> str + data of xAxis, it must be catagory axis. +* y_axis -> str + data of yAxis, it must be catagory axis. +* data -> [[],[]] + data array of series, it is represented by a two-dimension array +* is_date_heatmap -> bool + default -> False + Whether it is a date heatmap +* date_range -> str/list + date range of date heatmap, "2016" is year 2016, ["2016-5-5", "2017-5-5"] is 2016/5/5-2017/5/5 + +```python +import random +from pyecharts import HeatMap + +x_axis = ["12a", "1a", "2a", "3a", "4a", "5a", "6a", "7a", "8a", "9a", "10a", "11a", + "12p", "1p", "2p", "3p", "4p", "5p", "6p", "7p", "8p", "9p", "10p", "11p"] +y_aixs = ["Saturday", "Friday", "Thursday", "Wednesday", "Tuesday", "Monday", "Sunday"] +data = [[i, j, random.randint(0, 50)] for i in range(24) for j in range(7)] +heatmap = HeatMap() +heatmap.add("热力图直角坐标系", x_axis, y_aixs, data, is_visualmap=True, + visual_text_color="#000", visual_orient='horizontal') +heatmap.show_config() +heatmap.render() +``` +![heatmap-0](https://user-images.githubusercontent.com/19553554/35090544-f306fcb8-fc74-11e7-8b0a-0284632c3c4d.gif) + +```python +import datetime +import random +from pyecharts import HeatMap + +begin = datetime.date(2017, 1, 1) +end = datetime.date(2017, 12, 31) +data = [[str(begin + datetime.timedelta(days=i)), + random.randint(0, 100)] for i in range((end - begin).days+1)] +heatmap = HeatMap("日历热力图示例") +heatmap.add("日历热力图", data, date_range=["2017"], is_visualmap=True, + is_legend_show=False, is_date_heatmap=True, visual_orient="horizontal", + visual_pos="center", visual_top="top") +heatmap.render() +``` +![heatmap-1](https://user-images.githubusercontent.com/19553554/35090548-f51dfe0c-fc74-11e7-8a97-012fec231b85.gif) + +**Tip:** Thermodynamic chart have to cooperate with VisualMap in use. + + +## Kline +> Kline chart use red to imply increasing with red and decreasing with blue + +Kline.add() signatures +```python +add(name, x_axis, y_axis, **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* x_axis -> list + data of xAxis +* y_axis -> [[], []] + data pf yAxis.Data should be the two-dimensional array shown as follow. + Every data item (each line in the example above) represents a box, which contains 4 values. They are: [open, close, lowest, highest] (namely: [opening value, closing value, lowest value, highest value]) +```python +from pyecharts import Kline + +v1 = [[2320.26, 2320.26, 2287.3, 2362.94], [2300, 2291.3, 2288.26, 2308.38], + [2295.35, 2346.5, 2295.35, 2345.92], [2347.22, 2358.98, 2337.35, 2363.8], + [2360.75, 2382.48, 2347.89, 2383.76], [2383.43, 2385.42, 2371.23, 2391.82], + [2377.41, 2419.02, 2369.57, 2421.15], [2425.92, 2428.15, 2417.58, 2440.38], + [2411, 2433.13, 2403.3, 2437.42], [2432.68, 2334.48, 2427.7, 2441.73], + [2430.69, 2418.53, 2394.22, 2433.89], [2416.62, 2432.4, 2414.4, 2443.03], + [2441.91, 2421.56, 2418.43, 2444.8], [2420.26, 2382.91, 2373.53, 2427.07], + [2383.49, 2397.18, 2370.61, 2397.94], [2378.82, 2325.95, 2309.17, 2378.82], + [2322.94, 2314.16, 2308.76, 2330.88], [2320.62, 2325.82, 2315.01, 2338.78], + [2313.74, 2293.34, 2289.89, 2340.71], [2297.77, 2313.22, 2292.03, 2324.63], + [2322.32, 2365.59, 2308.92, 2366.16], [2364.54, 2359.51, 2330.86, 2369.65], + [2332.08, 2273.4, 2259.25, 2333.54], [2274.81, 2326.31, 2270.1, 2328.14], + [2333.61, 2347.18, 2321.6, 2351.44], [2340.44, 2324.29, 2304.27, 2352.02], + [2326.42, 2318.61, 2314.59, 2333.67], [2314.68, 2310.59, 2296.58, 2320.96], + [2309.16, 2286.6, 2264.83, 2333.29], [2282.17, 2263.97, 2253.25, 2286.33], + [2255.77, 2270.28, 2253.31, 2276.22]] +kline = Kline("K 线图示例") +kline.add("日K", ["2017/7/{}".format(i + 1) for i in range(31)], v1) +kline.show_config() +kline.render() +``` +![kline-0](https://user-images.githubusercontent.com/19553554/35090067-9a247694-fc73-11e7-88bb-3b0f019a5e90.png) + +Kline + dataZoom +```python +kline = Kline("K 线图示例") +kline.add("日K", ["2017/7/{}".format(i + 1) for i in range(31)], v1, mark_point=["max"], is_datazoom_show=True) +kline.show_config() +kline.render() +``` +![kline-1](https://user-images.githubusercontent.com/19553554/35090072-9b6ca404-fc73-11e7-8abe-e5576d35c57a.gif) + + +## Line +> Broken line chart relates all the data points symbol by broken lines, +> which is used to show the trend of data changing.It could be used in both rectangular coordinate and polar coordinate. + +Line.add() signatures +```python +add(name, x_axis, y_axis, is_symbol_show=True, is_smooth=False, is_stack=False, + is_step=False, is_fill=False, **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* x_axis -> list + data of xAxis +* y_axis -> list + data of yAxis +* is_symbol_show -> bool + default -> True + It specifies whether to show the symbol. +* is_smooth -> bool + default -> False + Whether to show as smooth curve. +* is_stack -> bool + default -> Flase + It specifies whether to stack category axis. +* is_step -> bool/str + default -> False + Whether to show as a step line.It can be true, false. Or 'start', 'middle', 'end'.Which will configure the turn point of step line. +* is_fill -> bool + default -> False + Whether to fill area. + +```python +from pyecharts import Line + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 10, 100] +v2 = [55, 60, 16, 20, 15, 80] +line = Line("折线图示例") +line.add("商家A", attr, v1, mark_point=["average"]) +line.add("商家B", attr, v2, is_smooth=True, mark_line=["max", "average"]) +line.show_config() +line.render() +``` +![line-0](https://user-images.githubusercontent.com/19553554/35089953-4865fe2c-fc73-11e7-8c47-e917332d061c.gif) + +* mark_point -> list + mark point data, it can be 'min', 'max', 'average' +* mark_line -> list + mark line data, it can be 'min', 'max', 'average' +* mark_point_symbol -> str + default -> 'pin' + mark symbol, it cna be 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow' +* mark_point_symbolsize -> int + default -> 50 + mark symbol size +* mark_point_textcolor -> str + default -> '#fff' + mark point text color + +Other Configurations Of Marker Point +```python +line = Line("折线图示例") +line.add("商家A", attr, v1, mark_point=["average", "max", "min"], + mark_point_symbol='diamond', mark_point_textcolor='#40ff27') +line.add("商家B", attr, v2, mark_point=["average", "max", "min"], + mark_point_symbol='arrow', mark_point_symbolsize=40) +line.show_config() +line.render() +``` +![line-0-1](https://user-images.githubusercontent.com/19553554/35089954-49784dd8-fc73-11e7-8a5b-d9163857c4b1.png) + +```python +line = Line("折线图-数据堆叠示例") +line.add("商家A", attr, v1, is_stack=True, is_label_show=True) +line.add("商家B", attr, v2, is_stack=True, is_label_show=True) +line.show_config() +line.render() +``` +![line-1](https://user-images.githubusercontent.com/19553554/35089965-4f880100-fc73-11e7-9861-c43bd4d4bbe1.gif) + +```python +line = Line("折线图-阶梯图示例") +line.add("商家A", attr, v1, is_step=True, is_label_show=True) +line.show_config() +line.render() +``` +![line-2](https://user-images.githubusercontent.com/19553554/35089968-510f3304-fc73-11e7-9159-67ce6ace9fa3.png) + +```python +line = Line("折线图-面积图示例") +line.add("商家A", attr, v1, is_fill=True, line_opacity=0.2, area_opacity=0.4, symbol=None) +line.add("商家B", attr, v2, is_fill=True, area_color='#000', area_opacity=0.3, is_smooth=True) +line.show_config() +line.render() +``` +![line-3](https://user-images.githubusercontent.com/19553554/35089973-53868fd8-fc73-11e7-8ff6-bfb452954267.png) + +* area_opacity -> float + Opacity of the component. Supports value from 0 to 1, and the component will not be drawn when set to 0. +* area_color -> str + Fill color. + +**Tip:** **lineStyle** Parameter is Configurable +**Tip:** Setting line colour by label_color,like ['#eee', '#000'],all type of chart can revise label colour by label_color. + + +## Line3D +Line3D.add() signatures +```python +add(name, data, grid3D_opacity=1, **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* data -> [[], []] + data of line3D +* grid3D_opacity -> float + default -> 1 + opacity of gird3D item + +draw a spring +```python +from pyecharts import Line3D + +import math +_data = [] +for t in range(0, 25000): + _t = t / 1000 + x = (1 + 0.25 * math.cos(75 * _t)) * math.cos(_t) + y = (1 + 0.25 * math.cos(75 * _t)) * math.sin(_t) + z = _t + 2.0 * math.sin(75 * _t) + _data.append([x, y, z]) +range_color = ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] +line3d = Line3D("3D 折线图示例", width=1200, height=600) +line3d.add("", _data, is_visualmap=True, visual_range_color=range_color, visual_range=[0, 30], + grid3D_rotate_sensitivity=5) +line3d.render() +``` +![line3d-0](https://user-images.githubusercontent.com/19553554/35081902-b0bed8c6-fc51-11e7-9b3a-1d138c4eba13.gif) + + +rotating spring +```python +from pyecharts import Line3D + +import math +_data = [] +for t in range(0, 25000): + _t = t / 1000 + x = (1 + 0.25 * math.cos(75 * _t)) * math.cos(_t) + y = (1 + 0.25 * math.cos(75 * _t)) * math.sin(_t) + z = _t + 2.0 * math.sin(75 * _t) + _data.append([x, y, z]) +range_color = ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] +line3d = Line3D("3D 折线图示例", width=1200, height=600) +line3d.add("", _data, is_visualmap=True, visual_range_color=range_color, visual_range=[0, 30], + is_grid3D_rotate=True, grid3D_rotate_speed=180) +line3d.render() +``` +![line3d-1](https://user-images.githubusercontent.com/19553554/35081903-b3a4eada-fc51-11e7-97b1-33f1dd6ed79e.gif) + +**Tip:** more details aboutt gird3D,please refer to [Global-options](https://github.com/chenjiandongx/pyecharts/blob/master/document/en-us/documentation.md#Global-options) + +## Liquid +> Liquid chart is usually used to represent data in percentage. + +Liquid.add() signatures +```python +add(name, data, shape='circle', liquid_color=None, is_liquid_animation=True, + is_liquid_outline_show=True, **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* data -> list + data of liquid,[0.6, 0.5, 0.4, 0.3] -> This creates a chart wit waves at position of 60%, 50%, 40%, and 30%. +* shape -> str + Shape of water fill chart.It can be one of the default symbols: 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow' +* liquid_color -> list + default -> ['#294D99', '#156ACF', '#1598ED', '#45BDFF'] + To set colors for liquid fill chart series, set color to be an array of colors. +* is_liquid_animation -> bool + default -> True + Whether disable animation. +* is_liquid_outline_show -> bool + default -> True + whether hide the outline + +```python +from pyecharts import Liquid + +liquid = Liquid("水球图示例") +liquid.add("Liquid", [0.6]) +liquid.show_config() +liquid.render() +``` +![liquid-0](https://user-images.githubusercontent.com/19553554/35082172-536178a8-fc53-11e7-8c8b-1fa1312c8854.gif) + +```python +from pyecharts import Liquid + +liquid = Liquid("水球图示例") +liquid.add("Liquid", [0.6, 0.5, 0.4, 0.3], is_liquid_outline_show=False) +liquid.show_config() +liquid.render() +``` +![liquid-1](https://user-images.githubusercontent.com/19553554/35082175-55337000-fc53-11e7-9e5b-24cd47288e8d.gif) + +```python +from pyecharts import Liquid + +liquid = Liquid("水球图示例") +liquid.add("Liquid", [0.6, 0.5, 0.4, 0.3], is_liquid_animation=False, shape='diamond') +liquid.show_config() +liquid.render() +``` +![liquid-2](https://user-images.githubusercontent.com/19553554/35082178-567d2db6-fc53-11e7-965a-d60e72ab6bf4.png) + +## Map +> Map is maily used in the visulization of geographic area data,which can be used with visualMap component to visualize the datas such as population distribution density in diffrent areas. + +Map.add() signatures +```python +add(name, attr, value, is_roam=True, maptype='china', **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* attr -> list + name of attribute +* value -> list + value of attribute +* is_roam -> bool/str + default -> True + Whether to enable mouse zooming and translating.If either zooming or translating is wanted,it can be set to 'scale' or 'move'. Otherwise, set it to be true to enable both. +* maptype -> str + type of map, it supports chinese geographical names, such as "安徽, 澳门, 北京, 重庆, 福建, 福建, 甘肃, 广东,广西, 广州, 海南, 河北, 黑龙江, 河南, 湖北, 湖南, 江苏, 江西, 吉林, 辽宁, 内蒙古, 宁夏, 青海, 山东, 上海, 陕西, 四川, 台湾, 天津, 香港, 新疆, 西藏, 云南, 浙江" and [363 provincial cities](https://github.com/chfw/echarts-china-cities-js#featuring-citiesor-for-single-download). + +```python +from pyecharts import Map + +value = [155, 10, 66, 78] +attr = ["福建", "山东", "北京", "上海"] +map = Map("全国地图示例", width=1200, height=600) +map.add("", attr, value, maptype='china') +map.show_config() +map.render() +``` +![map-0](https://user-images.githubusercontent.com/19553554/35082377-718385f0-fc54-11e7-88c2-bd1df8bf112b.gif) + +```python +from pyecharts import Map + +value = [155, 10, 66, 78, 33, 80, 190, 53, 49.6] +attr = ["福建", "山东", "北京", "上海", "甘肃", "新疆", "河南", "广西", "西藏"] +map = Map("Map 结合 VisualMap 示例", width=1200, height=600) +map.add("", attr, value, maptype='china', is_visualmap=True, visual_text_color='#000') +map.show_config() +map.render() +``` +![map-1](https://user-images.githubusercontent.com/19553554/35082380-75e1b89c-fc54-11e7-8169-75884ffb67fb.gif) + +**Tip:** Settings can combine with visualMap component. + +```python +from pyecharts import Map + +value = [20, 190, 253, 77, 65] +attr = ['汕头市', '汕尾市', '揭阳市', '阳江市', '肇庆市'] +map = Map("广东地图示例", width=1200, height=600) +map.add("", attr, value, maptype='广东', is_visualmap=True, visual_text_color='#000') +map.show_config() +map.render() +``` +![map-2](https://user-images.githubusercontent.com/19553554/35082381-786c8542-fc54-11e7-8886-5e4047fbeefd.gif) + +### About Customized Map +Because map contain large area,this program can't cover all the map,but don't worry about it.Echarts officially provide your own custom map [echart-map](http://echarts.baidu.com/download-map.html),this function allow you make map that you need,just download in JS file form. + +open file pyecharts/temple.py under the installation directory,add the same line under the corresponding of _temple variable. + `````` +correspond under Jupyter Notebook add the same lineunder _mapindex variable. +```"北京": "beijing: '//oog4yfyu0.bkt.clouddn.com/beijing'"``` +Then use customized map in the program!The way import Js decide by yourself,only if it can be found by the program! + + +## Parallel +> Parallel Coordinates is a common way of visualizing high-dimensional geometry and analyzing multivariate data. + +Parallel.add() signatures +```python +add(name, data, **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* data -> [[],[]] + data array of series, it is represented by a two-dimension array. + +Parallel.config() signatures +```python +config(schema=None, c_schema=None) +``` +* schema + Dimension index of coordinate axis. + a axis name list, like ['apple', 'orange', 'watermelon'] +* c_schema + User customize coordinate axis for parallel coordinate. + * dim -> int + Dimension index of coordinate axis. + * name > str + Name of axis. + * type -> str + Type of axis + value:Numerical axis, suitable for continuous data. + category:Category axis, suitable for discrete category data.Data should only be set via data for this type. + * min -> int + The minimun value of axis. + * max -> int + The maximum value of axis. + * inverse - bool + default -> False + Whether axis is inversed. + * nameLocation -> str + Location of axis name. it can be 'start', 'middle', 'end'. + +```python +from pyecharts import Parallel + +schema = ["data", "AQI", "PM2.5", "PM10", "CO", "NO2"] +data = [ + [1, 91, 45, 125, 0.82, 34], + [2, 65, 27, 78, 0.86, 45,], + [3, 83, 60, 84, 1.09, 73], + [4, 109, 81, 121, 1.28, 68], + [5, 106, 77, 114, 1.07, 55], + [6, 109, 81, 121, 1.28, 68], + [7, 106, 77, 114, 1.07, 55], + [8, 89, 65, 78, 0.86, 51, 26], + [9, 53, 33, 47, 0.64, 50, 17], + [10, 80, 55, 80, 1.01, 75, 24], + [11, 117, 81, 124, 1.03, 45] +] +parallel = Parallel("平行坐标系-默认指示器") +parallel.config(schema) +parallel.add("parallel", data, is_random=True) +parallel.show_config() +parallel.render() +``` +![parallel-0](https://user-images.githubusercontent.com/19553554/35090275-17c3dcde-fc74-11e7-94d6-e497668dba0c.png) + +```python +from pyecharts import Parallel + +c_schema = [ + {"dim": 0, "name": "data"}, + {"dim": 1, "name": "AQI"}, + {"dim": 2, "name": "PM2.5"}, + {"dim": 3, "name": "PM10"}, + {"dim": 4, "name": "CO"}, + {"dim": 5, "name": "NO2"}, + {"dim": 6, "name": "CO2"}, + {"dim": 7, "name": "等级", + "type": "category", "data": ['优', '良', '轻度污染', '中度污染', '重度污染', '严重污染']} +] +data = [ + [1, 91, 45, 125, 0.82, 34, 23, "良"], + [2, 65, 27, 78, 0.86, 45, 29, "良"], + [3, 83, 60, 84, 1.09, 73, 27, "良"], + [4, 109, 81, 121, 1.28, 68, 51, "轻度污染"], + [5, 106, 77, 114, 1.07, 55, 51, "轻度污染"], + [6, 109, 81, 121, 1.28, 68, 51, "轻度污染"], + [7, 106, 77, 114, 1.07, 55, 51, "轻度污染"], + [8, 89, 65, 78, 0.86, 51, 26, "良"], + [9, 53, 33, 47, 0.64, 50, 17, "良"], + [10, 80, 55, 80, 1.01, 75, 24, "良"], + [11, 117, 81, 124, 1.03, 45, 24, "轻度污染"], + [12, 99, 71, 142, 1.1, 62, 42, "良"], + [13, 95, 69, 130, 1.28, 74, 50, "良"], + [14, 116, 87, 131, 1.47, 84, 40, "轻度污染"] +] +parallel = Parallel("平行坐标系-用户自定义指示器") +parallel.config(c_schema=c_schema) +parallel.add("parallel", data) +parallel.show_config() +parallel.render() +``` +![parallel-1](https://user-images.githubusercontent.com/19553554/35090278-19ac1674-fc74-11e7-9aa1-2662296d3e22.png) + +**Tip:** **lineStyle** Parameter is Configurable + + +## Pie +> The pie chart is mainly used for showing proportion of different categories.Each arc length represents the proportion of data quantity. + +Pie.add() signatures +```python +add(name, attr, value, radius=None, center=None, rosetype=None, **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* attr -> list + name of attribute +* value -> list + value of attribute +* radius -> list + default -> [0, 75] + Radius of Pie chart, the first of which is inner radius, and the second is outer radius. + Percentage is supported. When set in percentage,it's relative to the smaller size between height and width of the container. +* center -> list + default -> [50, 50] + Center position of Pie chart, the first of which is the horizontal position,and the second is the vertical position. + Percentage is supported. When set in percentage, the item is relative to the container width,and the second item to the height. +* rosetype -> str + default -> 'radius' + Whether to show as Nightingale chart, which distinguishs data through radius. There are 2 optional modes: + * radius:Use central angle to show the percentage of data, radius to show data size. + * area:All the sectors will share the same central angle, the data size is shown only through radiuses. + +```python +from pyecharts import Pie + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [11, 12, 13, 10, 10, 10] +pie = Pie("饼图示例") +pie.add("", attr, v1, is_label_show=True) +pie.show_config() +pie.render() +``` +![pie-0](https://user-images.githubusercontent.com/19553554/35089599-5eed1ef6-fc72-11e7-8740-601880be9e16.gif) + +```python +from pyecharts import Pie + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [11, 12, 13, 10, 10, 10] +pie = Pie("饼图-圆环图示例", title_pos='center') +pie.add("", attr, v1, radius=[40, 75], label_text_color=None, is_label_show=True, + legend_orient='vertical', legend_pos='left') +pie.show_config() +pie.render() +``` +![pie-1](https://user-images.githubusercontent.com/19553554/35089631-70b6e7de-fc72-11e7-838d-f8b238bbc03f.png) + +```python +from pyecharts import Pie + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [11, 12, 13, 10, 10, 10] +v2 = [19, 21, 32, 20, 20, 33] +pie = Pie("饼图-玫瑰图示例", title_pos='center', width=900) +pie.add("商品A", attr, v1, center=[25, 50], is_random=True, radius=[30, 75], rosetype='radius') +pie.add("商品B", attr, v2, center=[75, 50], is_random=True, radius=[30, 75], rosetype='area', + is_legend_show=False, is_label_show=True) +pie.show_config() +pie.render() +``` +![pie-2](https://user-images.githubusercontent.com/19553554/35089635-72585da2-fc72-11e7-835d-c9b64750d19d.png) + + +## Polar +> Polar coordinate can be used in scatter and line chart. Every polar coordinate has an angleAxis and a radiusAxis. + +Polar.add() signatures +```python +add(name, data, angle_data=None, radius_data=None, type='line', symbol_size=4, start_angle=90, + rotate_step=0, boundary_gap=True, clockwise=True, **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* data -> [[],[]] + data of polar, [Polar radius, Polar angle,it is represented by a two-dimension array. +* angle_data -> list + Category data for angle, available in type: 'category' axis. +* radius_data -> list + Category data for radius, available in type: 'category' axis. +* type -> str + default -> 'line' + chart type,it can be 'scatter', 'effectScatter', 'barAngle', 'barRadius' +* symbol_size -> int + default -> 4 + symbol size +* start_angle -> int + default -> 90 + Starting angle of axis.standing for top position of center.0 degree stands for right position of center. +* rotate_step -> int + default -> 0 + Rotation degree of axis label, which is especially useful when there is no enough space for category axis. + Rotation degree is from -90 to 90. +* boundary_gap -> bool + default -> True + The boundary gap on both sides of a coordinate axis. + The setting and behavior of category axes and non-category axes are different. + The boundaryGap of category axis can be set to either true or false. + Default value is set to be true, in which case axisTick is served only as a separation line,and labels and data appear only in the center part of two axis ticks, which is called band. +* clockwise -> bool + default -> True + Whether the positive position of axis is in clockwise. True for clockwise by default. +* is_stack -> bool + It specifies whether to stack category axis. +* axis_range -> list + default -> [None, None] + axis scale range +* is_angleaxis_show -> bool + default -> True + whether show angle axis. +* is_radiusaxis_show -> bool + default -> True + whether show radius axis. + +```python +from pyecharts import Polar + +import random +data = [(i, random.randint(1, 100)) for i in range(101)] +polar = Polar("极坐标系-散点图示例") +polar.add("", data, boundary_gap=False, type='scatter', is_splitline_show=False, + area_color=None, is_axisline_show=True) +polar.show_config() +polar.render() +``` +![polar-0](https://user-images.githubusercontent.com/19553554/35090448-aaf0d5a2-fc74-11e7-83c4-7b2f55090e98.png) + +* is_splitline_show -> bool + default -> True + It specifies whether to show split line. +* is_axisline_show -> bool + default -> True + It specifies whether to show axis line. +* area_opacity -> float + Opacity of the component. Supports value from 0 to 1, and the component will not be drawn when set to 0. +* area_color -> str + Fill color. + +**Tip:** **lineStyle** Parameter is Configurable + +```python +from pyecharts import Polar + +import random +data_1 = [(10, random.randint(1, 100)) for i in range(300)] +data_2 = [(11, random.randint(1, 100)) for i in range(300)] +polar = Polar("极坐标系-散点图示例", width=1200, height=600) +polar.add("", data_1, type='scatter') +polar.add("", data_2, type='scatter') +polar.show_config() +polar.render() +``` +![polar-1](https://user-images.githubusercontent.com/19553554/35090451-abf708e0-fc74-11e7-8814-25ba5e72f542.png) + +```python +from pyecharts import Polar + +import random +data = [(i, random.randint(1, 100)) for i in range(10)] +polar = Polar("极坐标系-动态散点图示例", width=1200, height=600) +polar.add("", data, type='effectScatter', effect_scale=10, effect_period=5) +polar.show_config() +polar.render() +``` +![polar-2](https://user-images.githubusercontent.com/19553554/35090453-ad2b4d52-fc74-11e7-8ecd-cb64546d0d40.gif) + +```python +from pyecharts import Polar + +radius = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] +polar = Polar("极坐标系-堆叠柱状图示例", width=1200, height=600) +polar.add("A", [1, 2, 3, 4, 3, 5, 1], radius_data=radius, type='barRadius', is_stack=True) +polar.add("B", [2, 4, 6, 1, 2, 3, 1], radius_data=radius, type='barRadius', is_stack=True) +polar.add("C", [1, 2, 3, 4, 1, 2, 5], radius_data=radius, type='barRadius', is_stack=True) +polar.show_config() +polar.render() +``` +![polar-3](https://user-images.githubusercontent.com/19553554/35090457-afc0658e-fc74-11e7-9c58-24c780436287.gif) + +```python +from pyecharts import Polar + +radius = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] +polar = Polar("极坐标系-堆叠柱状图示例", width=1200, height=600) +polar.add("", [1, 2, 3, 4, 3, 5, 1], radius_data=radius, type='barAngle', is_stack=True) +polar.add("", [2, 4, 6, 1, 2, 3, 1], radius_data=radius, type='barAngle', is_stack=True) +polar.add("", [1, 2, 3, 4, 1, 2, 5], radius_data=radius, type='barAngle', is_stack=True) +polar.show_config() +polar.render() +``` +![polar-4](https://user-images.githubusercontent.com/19553554/35090460-b11ab380-fc74-11e7-836c-2e8197e32723.png) + +## Radar +> Radar chart is mainly used to show multi-variable data,such as the analysis of a football player's varied attributes. It relies radar component. + +Radar.add() signatures +```python +add(name, value, item_color=None, **kwargs) +``` +* name -> list + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* value -> [[],[]] + data array of series, it is represented by a two-dimension array. +* item_color -> str + Specify a single legend color + +Radar.config() signatures +```python +config(schema=None, c_schema=None, shape="", rader_text_color="#000", **kwargs): +``` +* schema -> list + The default radar map indicator, used to specify multiple dimensions in the radar map,will process the data into a dictionary of {name: xx, value: xx} +* c_schema -> dict + Indicator of radar chart, which is used to assign multiple variables(dimensions) in radar chart. + * name: Indicator's name. + * min: The maximum value of indicator. It is an optional configuration, but we recommend to set it manually. + * max: The maximum value of indicator. It is an optional configuration, but we recommend to set it manually. +* shape -> str + Radar render type, in which 'polygon' and 'circle' are supported. +* rader_text_color -> str + default -> '#000' + Radar chart data item font color + +```python +from pyecharts import Radar + +schema = [ + ("销售", 6500), ("管理", 16000), ("信息技术", 30000), ("客服", 38000), ("研发", 52000), ("市场", 25000)] +v1 = [[4300, 10000, 28000, 35000, 50000, 19000]] +v2 = [[5000, 14000, 28000, 31000, 42000, 21000]] +radar = Radar() +radar.config(schema) +radar.add("预算分配", v1, is_splitline=True, is_axisline_show=True) +radar.add("实际开销", v2, label_color=["#4e79a7"], is_area_show=False) +radar.show_config() +radar.render() +``` +![radar-0](https://user-images.githubusercontent.com/19553554/35082333-20046172-fc54-11e7-944a-b6e25bf5dd2a.gif) + +* is_area_show -> bool + It specifies whether to show split area. +* area_opacity -> float + Opacity of the component. Supports value from 0 to 1, and the component will not be drawn when set to 0. +* area_color -> str + Fill color. +* is_splitline_show -> bool + default -> True + It specifies whether to show split line. +* is_axisline_show -> bool + default -> True + It specifies whether to show axis line. + +**Tip:** **lineStyle** Parameter is Configurable + +```python +value_bj = [ + [55, 9, 56, 0.46, 18, 6, 1], [25, 11, 21, 0.65, 34, 9, 2], + [56, 7, 63, 0.3, 14, 5, 3], [33, 7, 29, 0.33, 16, 6, 4], + [42, 24, 44, 0.76, 40, 16, 5], [82, 58, 90, 1.77, 68, 33, 6], + [74, 49, 77, 1.46, 48, 27, 7], [78, 55, 80, 1.29, 59, 29, 8], + [267, 216, 280, 4.8, 108, 64, 9], [185, 127, 216, 2.52, 61, 27, 10], + [39, 19, 38, 0.57, 31, 15, 11], [41, 11, 40, 0.43, 21, 7, 12], + [64, 38, 74, 1.04, 46, 22, 13], [108, 79, 120, 1.7, 75, 41, 14], + [108, 63, 116, 1.48, 44, 26, 15], [33, 6, 29, 0.34, 13, 5, 16], + [94, 66, 110, 1.54, 62, 31, 17], [186, 142, 192, 3.88, 93, 79, 18], + [57, 31, 54, 0.96, 32, 14, 19], [22, 8, 17, 0.48, 23, 10, 20], + [39, 15, 36, 0.61, 29, 13, 21], [94, 69, 114, 2.08, 73, 39, 22], + [99, 73, 110, 2.43, 76, 48, 23], [31, 12, 30, 0.5, 32, 16, 24], + [42, 27, 43, 1, 53, 22, 25], [154, 117, 157, 3.05, 92, 58, 26], + [234, 185, 230, 4.09, 123, 69, 27],[160, 120, 186, 2.77, 91, 50, 28], + [134, 96, 165, 2.76, 83, 41, 29], [52, 24, 60, 1.03, 50, 21, 30], +] +value_sh = [ + [91, 45, 125, 0.82, 34, 23, 1], [65, 27, 78, 0.86, 45, 29, 2], + [83, 60, 84, 1.09, 73, 27, 3], [109, 81, 121, 1.28, 68, 51, 4], + [106, 77, 114, 1.07, 55, 51, 5], [109, 81, 121, 1.28, 68, 51, 6], + [106, 77, 114, 1.07, 55, 51, 7], [89, 65, 78, 0.86, 51, 26, 8], + [53, 33, 47, 0.64, 50, 17, 9], [80, 55, 80, 1.01, 75, 24, 10], + [117, 81, 124, 1.03, 45, 24, 11], [99, 71, 142, 1.1, 62, 42, 12], + [95, 69, 130, 1.28, 74, 50, 13], [116, 87, 131, 1.47, 84, 40, 14], + [108, 80, 121, 1.3, 85, 37, 15], [134, 83, 167, 1.16, 57, 43, 16], + [79, 43, 107, 1.05, 59, 37, 17], [71, 46, 89, 0.86, 64, 25, 18], + [97, 71, 113, 1.17, 88, 31, 19], [84, 57, 91, 0.85, 55, 31, 20], + [87, 63, 101, 0.9, 56, 41, 21], [104, 77, 119, 1.09, 73, 48, 22], + [87, 62, 100, 1, 72, 28, 23], [168, 128, 172, 1.49, 97, 56, 24], + [65, 45, 51, 0.74, 39, 17, 25], [39, 24, 38, 0.61, 47, 17, 26], + [39, 24, 39, 0.59, 50, 19, 27], [93, 68, 96, 1.05, 79, 29, 28], + [188, 143, 197, 1.66, 99, 51, 29], [174, 131, 174, 1.55, 108, 50, 30], +] +c_schema= [{"name": "AQI", "max": 300, "min": 5}, + {"name": "PM2.5", "max": 250, "min": 20}, + {"name": "PM10", "max": 300, "min": 5}, + {"name": "CO", "max": 5}, + {"name": "NO2", "max": 200}, + {"name": "SO2", "max": 100}] +radar = Radar() +radar.config(c_schema=c_schema, shape='circle') +radar.add("北京", value_bj, item_color="#f9713c", symbol=None) +radar.add("上海", value_sh, item_color="#b3e4a1", symbol=None) +radar.show_config() +radar.render() +``` +![radar-1](https://user-images.githubusercontent.com/19553554/35082335-224c23ca-fc54-11e7-910a-0914699ac06e.gif) + +**Tip:** symblo=None make marked graphic hiden(small circle) + + +## Scatter +> The scatter chart in rectangular coordinate could be used to present the relation between x and y. +> If data have multiple dimensions, the values of the other dimensions can be visualized through symbol with various sizes and colors, which becomes a bubble chart. These can be done by using with visualMap component. + +Scatter.add() signatures +```python +add(name, x_axis, y_axis, symbol_size=10, **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* x_axis -> list + data of xAxis +* y_axis -> list + data of yAxis +* symbol_size -> int + default -> 10 + symbol size + +```python +from pyecharts import Scatter + +v1 = [10, 20, 30, 40, 50, 60] +v2 = [10, 20, 30, 40, 50, 60] +scatter = Scatter("散点图示例") +scatter.add("A", v1, v2) +scatter.add("B", v1[::-1], v2) +scatter.show_config() +scatter.render() +``` +![scatter-0](https://user-images.githubusercontent.com/19553554/35090352-5f4bae42-fc74-11e7-9158-6fa70e5abf5d.png) + +Scatter also built-in draw method. +```python +draw(path, color=None) +``` +convert pixels on the image into array ,when colour is (255,255,255)only retain non white pixels' coordinate information. output two k_lst, v_lst list can just as the data item of scatter plot. + +``` +* path -> str + path of Image that want to draw +* color -> str + select a color to exclude, (225, 225, 225) means Keep only white pixel information. + +First of all ,you need to prepare a picture,like + +![pyecharts-0](https://user-images.githubusercontent.com/19553554/35104421-c25a02f2-fca3-11e7-868d-d70bd86fdd76.png) + +```python +from pyecharts import Scatter + +scatter = Scatter("散点图示例") +v1, v2 = scatter.draw("../images/pyecharts-0.png") +scatter.add("pyecharts", v1, v2, is_random=True) +scatter.show_config() +scatter.render() +``` +![pyecharts-1](https://user-images.githubusercontent.com/19553554/35104426-c4ac81ce-fca3-11e7-9b46-7fd729ec3ece.png) + + +## Scatter3D +Scatter3D.add() signatures +```python +add(name, data, grid3D_opacity=1, **kwargs) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* data -> [[], []] + data of line3D +* grid3D_opacity -> float + default -> 1 + opacity of gird3D item + +```python +from pyecharts import Scatter3D + +import random +data = [[random.randint(0, 100), random.randint(0, 100), random.randint(0, 100)] for _ in range(80)] +range_color = ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] +scatter3D = Scatter3D("3D 散点图示例", width=1200, height=600) +scatter3D.add("", data, is_visualmap=True, visual_range_color=range_color) +scatter3D.render() +``` +![scatter3d-0](https://user-images.githubusercontent.com/19553554/35081974-1ece83ca-fc52-11e7-86d7-bec5c4d3e2c8.gif) + +**Tip:** more details aboutt gird3D,please refer to [Global-options](https://github.com/chenjiandongx/pyecharts/blob/master/document/en-us/documentation.md#Global-options) + +## WordCloud +WordCloud.add() signatures +```python +add(name, attr, value, shape="circle", word_gap=20, word_size_range=None, rotate_step=45) +``` +* name -> str + Series name used for displaying in tooltip and filtering with legend,or updaing data and configuration with setOption. +* attr -> list + name of attribute +* value -> list + value of attribute +* shape -> list + shape of wordcloud.It can be 'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon', 'star' +* word_gap -> int + default -> 20 + Gap of word.size of the grid in pixels for marking the availability of the canvas,the larger the grid size, the bigger the gap between words. +* word_size_range -> list + default -> [12, 60] + Text size range which the value in data will be mapped to. +* rotate_step -> int + default -> 45 + Text rotation range and step in degree. Text will be rotated randomly in range [-90, 90]. + +```python +from pyecharts import WordCloud + +name = ['Sam S Club', 'Macys', 'Amy Schumer', 'Jurassic World', 'Charter Communications', + 'Chick Fil A', 'Planet Fitness', 'Pitch Perfect', 'Express', 'Home', 'Johnny Depp', + 'Lena Dunham', 'Lewis Hamilton', 'KXAN', 'Mary Ellen Mark', 'Farrah Abraham', + 'Rita Ora', 'Serena Williams', 'NCAA baseball tournament', 'Point Break'] +value = [10000, 6181, 4386, 4055, 2467, 2244, 1898, 1484, 1112, 965, 847, 582, 555, + 550, 462, 366, 360, 282, 273, 265] +wordcloud = WordCloud(width=1300, height=620) +wordcloud.add("", name, value, word_size_range=[20, 100]) +wordcloud.show_config() +wordcloud.render() +``` +![wordcloud-0](https://user-images.githubusercontent.com/19553554/35081546-cfe57770-fc4f-11e7-878a-e76d274afcbd.png) + +```python +wordcloud = WordCloud(width=1300, height=620) +wordcloud.add("", name, value, word_size_range=[30, 100], shape='diamond') +wordcloud.show_config() +wordcloud.render() +``` +![wordcloud-1](https://user-images.githubusercontent.com/19553554/35081549-d2bde37e-fc4f-11e7-98b2-4cdc019433b1.png) + +**Tip:** if and only if shape is default'circle' the rotate_step parameter will take effect. + + +# User Custom + +## Combination different types of chart and draw they on same picture. +User Can Combination Custom Line/Bar/Kline, Scatter/EffectScatter chart,draw different types of chart on one image.Using the first chart as basement,data after that will draw on the first chart. +Need use the method ```get_series()``` and ```custom()```. + +```python +get_series() +""" Get chart's series data """ +``` +```python +custom(series) +''' Add to custom chart type ''' +``` +* series -> dict + add to chart type series data + +irst use ```get_series()``` to get the data,then use ```custom()``` combine the charts together + +Line + Bar +```python +from pyecharts import Bar, Line + +attr = ['A', 'B', 'C', 'D', 'E', 'F'] +v1 = [10, 20, 30, 40, 50, 60] +v2 = [15, 25, 35, 45, 55, 65] +v3 = [38, 28, 58, 48, 78, 68] +bar = Bar("Line - Bar 示例") +bar.add("bar", attr, v1) +line = Line() +line.add("line", v2, v3) +bar.custom(line.get_series()) +bar.show_config() +bar.render() +``` +![custom-0](https://raw.githubusercontent.com/pyecharts/pyecharts/master/images/custom-0.gif) + +Specific procedure are as follows: +1. initialize the chart,add normal configuration item. +2. call the first chart's custom(type.get_series()) method and one by one. +3. call the first chart's render() method. + +**Tip:** ```bar.custom(line.get_series())``` this one have to be careful,use the first one chart as basement.remember do not write ```bar.custom(bar.get_series())``` or the program will get into endless self call state,infinite recursion,finally may cause your computer to crash. + +Scatter + EffectScatter +```python +from pyecharts import Scatter, EffectScatter + +v1 = [10, 20, 30, 40, 50, 60] +v2 = [30, 30, 30, 30, 30, 30] +v3 = [50, 50, 50, 50, 50, 50] +v4 = [10, 10, 10, 10, 10, 10] +es = EffectScatter("Scatter - EffectScatter 示例") +es.add("es", v1, v2) +scatter = Scatter() +scatter.add("scatter", v1, v3) +es.custom(scatter.get_series()) +es_1 = EffectScatter() +es_1.add("es_1", v1, v4, symbol='pin', effect_scale=5) +es.custom(es_1.get_series()) +es.show_config() +es.render() +``` +![custom-1](https://raw.githubusercontent.com/pyecharts/pyecharts/master/images/custom-1.gif) + +Kline + Line +```python +import random +from pyecharts import Line, Kline + +v1 = [[2320.26, 2320.26, 2287.3, 2362.94], [2300, 2291.3, 2288.26, 2308.38], + [2295.35, 2346.5, 2295.35, 2345.92], [2347.22, 2358.98, 2337.35, 2363.8], + [2360.75, 2382.48, 2347.89, 2383.76], [2383.43, 2385.42, 2371.23, 2391.82], + [2377.41, 2419.02, 2369.57, 2421.15], [2425.92, 2428.15, 2417.58, 2440.38], + [2411, 2433.13, 2403.3, 2437.42], [2432.68, 2334.48, 2427.7, 2441.73], + [2430.69, 2418.53, 2394.22, 2433.89], [2416.62, 2432.4, 2414.4, 2443.03], + [2441.91, 2421.56, 2418.43, 2444.8], [2420.26, 2382.91, 2373.53, 2427.07], + [2383.49, 2397.18, 2370.61, 2397.94], [2378.82, 2325.95, 2309.17, 2378.82], + [2322.94, 2314.16, 2308.76, 2330.88], [2320.62, 2325.82, 2315.01, 2338.78], + [2313.74, 2293.34, 2289.89, 2340.71], [2297.77, 2313.22, 2292.03, 2324.63], + [2322.32, 2365.59, 2308.92, 2366.16], [2364.54, 2359.51, 2330.86, 2369.65], + [2332.08, 2273.4, 2259.25, 2333.54], [2274.81, 2326.31, 2270.1, 2328.14], + [2333.61, 2347.18, 2321.6, 2351.44], [2340.44, 2324.29, 2304.27, 2352.02], + [2326.42, 2318.61, 2314.59, 2333.67], [2314.68, 2310.59, 2296.58, 2320.96], + [2309.16, 2286.6, 2264.83, 2333.29], [2282.17, 2263.97, 2253.25, 2286.33], + [2255.77, 2270.28, 2253.31, 2276.22]] +attr = ["2017/7/{}".format(i + 1) for i in range(31)] +kline = Kline("Kline - Line 示例") +kline.add("日K", attr, v1) +line_1 = Line() +line_1.add("line-1", attr, [random.randint(2400, 2500) for _ in range(31)]) +line_2 = Line() +line_2.add("line-2", attr, [random.randint(2400, 2500) for _ in range(31)]) +kline.custom(line_1.get_series()) +kline.custom(line_2.get_series()) +kline.show_config() +kline.render() +``` +![custom-2](https://raw.githubusercontent.com/pyecharts/pyecharts/master/images/custom-2.png) + +## Combination different types of chart and draw on multiple picture,the chart parallel disply. +User Can Combination Custom Line/Bar/Kline/Scatter/EffectScatter/Pie/HeatMap chart,draw different types of chart on multiple image.Using the first chart as basement +Need use the method ```get_series()``` and ```grid()```. + +```python +get_series() +""" get chart's series data """ +``` +```python +grid(series,grid_width, grid_height, grid_top, grid_bottom, grid_left, grid_right) +''' Concurrently show charts ''' +``` +* series -> dict + other chart series data +* grid_width -> str/int + Width of grid component. Adaptive by default. +* grid_height -> str/int + Height of grid component. Adaptive by default. +* grid_top -> str/int + Distance between grid component and the top side of the container. + grid_top value can be instant pixel value like 20;it can also be percentage value relative to container width like '20%';and it can also be 'top', 'middle', or 'bottom'. + If the grid_top value is set to be 'top', 'middle', or 'bottom',then the component will be aligned automatically based on position. +* grid_bottom -> str/int + Distance between grid component and the bottom side of the container. + grid_bottom value can be instant pixel value like 20;it can also be percentage value relative to container width like '20%'. +* grid_left -> str/int + Distance between grid component and the left side of the container. + grid_left value can be instant pixel value like 20;it can also be percentage value relative to container width like '20%';and it can also be 'left', 'center', or 'right'. + If the grid_left value is set to be 'left', 'center', or 'right',then the component will be aligned automatically based on position. +* grid_right -> str/int + Distance between grid component and the right side of the container. + grid_right value can be instant pixel value like 20;it can also be percentage value relative to container width like '20%'. + +irst use ```get_series()``` get data,then use ```grid()``` combine the charts + +up and down type,Bar + Line +```python +from pyecharts import Bar, Line + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +bar = Bar("柱状图示例", height=720, is_grid=True) +bar.add("商家A", attr, v1, is_stack=True, grid_bottom="60%") +bar.add("商家B", attr, v2, is_stack=True, grid_bottom="60%") +line = Line("折线图示例", title_top="50%") +attr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] +line.add("最高气温", attr, [11, 11, 15, 13, 12, 13, 10], mark_point=["max", "min"], mark_line=["average"]) +line.add("最低气温", attr, [1, -2, 2, 5, 3, 2, 0], mark_point=["max", "min"], + mark_line=["average"], legend_top="50%") +bar.grid(line.get_series(), grid_top="60%") +bar.show_config() +bar.render() +``` +![grid-0](https://user-images.githubusercontent.com/19553554/35089722-c80f84fa-fc72-11e7-93b0-4fff14a371a5.gif) + +**once more Tip:** ```bar.grid(line.get_series(), grid_top="60%")``` do not write ```bar.grid(bar.get_series())``` or get into edless recursion + +The specific process is as follows: +1. Make is_grid=True when the first chart initialize,declare using grid assembly. +2. The first form's add() method have to make grid_* parameter,it has to be done,because grid_* default value is None,and won't add to configuration item.Appoint one at least. +3. Initialize other type(so do the same type),not need appoint grid_* parameter. +4. Call the first chart's grid() method and add one by one,and set grid_* parameter,it has to be done,at least one. +5. Call the first chart's render() method. + +left and right type,Scatter + EffectScatter +```python +from pyecharts import Scatter, EffectScatter + +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +scatter = Scatter(width=1200, is_grid=True) +scatter.add("散点图示例", v1, v2, grid_left="60%", legend_pos="70%") +es = EffectScatter() +es.add("动态散点图示例", [11, 11, 15, 13, 12, 13, 10], [1, -2, 2, 5, 3, 2, 0], + effect_scale=6, legend_pos="20%") +scatter.grid(es.get_series(), grid_right="60%") +scatter.show_config() +scatter.render() +``` +![grid-1](https://user-images.githubusercontent.com/19553554/35089730-ca173c70-fc72-11e7-915e-34ce5c79ead7.gif) + +up,down,left and right type,Bar + Line + Scatter + EffectScatter +```python +from pyecharts import Bar, Line, Scatter, EffectScatter + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +bar = Bar("柱状图示例", height=720, width=1200, title_pos="65%", is_grid=True) +bar.add("商家A", attr, v1, is_stack=True, grid_bottom="60%", grid_left="60%") +bar.add("商家B", attr, v2, is_stack=True, grid_bottom="60%", grid_left="60%", legend_pos="80%") +line = Line("折线图示例") +attr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] +line.add("最高气温", attr, [11, 11, 15, 13, 12, 13, 10], mark_point=["max", "min"], mark_line=["average"]) +line.add("最低气温", attr, [1, -2, 2, 5, 3, 2, 0], mark_point=["max", "min"], + mark_line=["average"], legend_pos="20%") +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +scatter = Scatter("散点图示例", title_top="50%", title_pos="65%") +scatter.add("scatter", v1, v2, legend_top="50%", legend_pos="80%") +es = EffectScatter("动态散点图示例", title_top="50%") +es.add("es", [11, 11, 15, 13, 12, 13, 10], [1, -2, 2, 5, 3, 2, 0], effect_scale=6, + legend_top="50%", legend_pos="20%") +bar.grid(line.get_series(), grid_bottom="60%", grid_right="60%") +bar.grid(scatter.get_series(), grid_top="60%", grid_left="60%") +bar.grid(es.get_series(), grid_top="60%", grid_right="60%") +bar.show_config() +bar.render() +``` +![grid-2](https://user-images.githubusercontent.com/19553554/35089731-cb044614-fc72-11e7-930c-be269b1f1589.gif) + +Line + Pie +```python +from pyecharts import Line, Pie + +line = Line("折线图示例", width=1200, is_grid=True) +attr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] +line.add("最高气温", attr, [11, 11, 15, 13, 12, 13, 10], mark_point=["max", "min"], + mark_line=["average"], grid_right="65%") +line.add("最低气温", attr, [1, -2, 2, 5, 3, 2, 0], mark_point=["max", "min"], + mark_line=["average"], legend_pos="20%") +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [11, 12, 13, 10, 10, 10] +pie = Pie("饼图示例", title_pos="45%") +pie.add("", attr, v1, radius=[30, 55], legend_pos="65%", legend_orient='vertical') +line.grid(pie.get_series(), grid_left="60%") +line.show_config() +line.render() +``` +![grid-3](https://user-images.githubusercontent.com/19553554/35089737-ccc1c01c-fc72-11e7-874d-8ba8b89572eb.png) + +Line + Kline +```python +from pyecharts import Line, Kline + +line = Line("折线图示例", width=1200, is_grid=True) +attr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] +line.add("最高气温", attr, [11, 11, 15, 13, 12, 13, 10], mark_point=["max", "min"], + mark_line=["average"], grid_right="60%") +line.add("最低气温", attr, [1, -2, 2, 5, 3, 2, 0], mark_point=["max", "min"], + mark_line=["average"], legend_pos="20%", grid_right="60%") +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +value = [20, 40, 60, 80, 100, 120] +v1 = [[2320.26, 2320.26, 2287.3, 2362.94], [2300, 2291.3, 2288.26, 2308.38], + [2295.35, 2346.5, 2295.35, 2345.92], [2347.22, 2358.98, 2337.35, 2363.8], + [2360.75, 2382.48, 2347.89, 2383.76], [2383.43, 2385.42, 2371.23, 2391.82], + [2377.41, 2419.02, 2369.57, 2421.15], [2425.92, 2428.15, 2417.58, 2440.38], + [2411, 2433.13, 2403.3, 2437.42], [2432.68, 2334.48, 2427.7, 2441.73], + [2430.69, 2418.53, 2394.22, 2433.89], [2416.62, 2432.4, 2414.4, 2443.03], + [2441.91, 2421.56, 2418.43, 2444.8], [2420.26, 2382.91, 2373.53, 2427.07], + [2383.49, 2397.18, 2370.61, 2397.94], [2378.82, 2325.95, 2309.17, 2378.82], + [2322.94, 2314.16, 2308.76, 2330.88], [2320.62, 2325.82, 2315.01, 2338.78], + [2313.74, 2293.34, 2289.89, 2340.71], [2297.77, 2313.22, 2292.03, 2324.63], + [2322.32, 2365.59, 2308.92, 2366.16], [2364.54, 2359.51, 2330.86, 2369.65], + [2332.08, 2273.4, 2259.25, 2333.54], [2274.81, 2326.31, 2270.1, 2328.14], + [2333.61, 2347.18, 2321.6, 2351.44], [2340.44, 2324.29, 2304.27, 2352.02], + [2326.42, 2318.61, 2314.59, 2333.67], [2314.68, 2310.59, 2296.58, 2320.96], + [2309.16, 2286.6, 2264.83, 2333.29], [2282.17, 2263.97, 2253.25, 2286.33], + [2255.77, 2270.28, 2253.31, 2276.22]] +kline = Kline("K 线图示例", title_pos="60%") +kline.add("日K", ["2017/7/{}".format(i + 1) for i in range(31)], v1, legend_pos="80%") +line.grid(kline.get_series(), grid_left="55%") +line.show_config() +line.render() +``` +![grid-4](https://user-images.githubusercontent.com/19553554/35089740-ce510c6c-fc72-11e7-84eb-6ae3dddece76.png) + +HeatMap + Bar +```python +import random + +from pyecharts import HeatMap, Bar + +x_axis = ["12a", "1a", "2a", "3a", "4a", "5a", "6a", "7a", "8a", "9a", "10a", "11a", + "12p", "1p", "2p", "3p", "4p", "5p", "6p", "7p", "8p", "9p", "10p", "11p"] +y_aixs = ["Saturday", "Friday", "Thursday", "Wednesday", "Tuesday", "Monday", "Sunday"] +data = [[i, j, random.randint(0, 50)] for i in range(24) for j in range(7)] +heatmap = HeatMap("热力图示例", height=700, is_grid=True) +heatmap.add("热力图直角坐标系", x_axis, y_aixs, data, is_visualmap=True, visual_top="45%", + visual_text_color="#000", visual_orient='horizontal', grid_bottom="60%") +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +bar = Bar("柱状图示例", title_top="52%") +bar.add("商家A", attr, v1, is_stack=True) +bar.add("商家B", attr, v2, is_stack=True, legend_top="50%") +heatmap.grid(bar.get_series(), grid_top="60%") +heatmap.show_config() +heatmap.render() +``` +![grid-5](https://user-images.githubusercontent.com/19553554/35089741-cfca19bc-fc72-11e7-8c3b-2f20d054d3fc.gif) +Bar will influenced by HeatMap,it's funy. + +# Multiple charts in one html page + +You will need use `Page` class and its api is simple, call `add()` charts to and then call `render()` in +the end. However, wordcloud and liquid charts cannot be mixed in. + + +Here is an example code:: + +```python +#coding=utf-8 +from __future__ import unicode_literals + +from pyecharts import Bar, Scatter3D +from pyecharts import Page + + +page = Page() # step 1 + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +bar = Bar("柱状图数据堆叠示例") +bar.add("商家A", attr, v1, is_stack=True) +bar.add("商家B", attr, v2, is_stack=True) +page.add(bar) # step 2 + +# scatter3D_0 +import random +data = [[random.randint(0, 100), random.randint(0, 100), random.randint(0, 100)] for _ in range(80)] +range_color = ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] +scatter3D = Scatter3D("3D 散点图示例", width=1200, height=600) +scatter3D.add("", data, is_visualmap=True, visual_range_color=range_color) +page.add(scatter3D) # step 2 + +page.render() # step 3 +``` + +After executing above code, you will find two charts in render.html: + +![multiple-charts-0](https://raw.githubusercontent.com/pyecharts/pyecharts/master/images/multiple-charts-0.gif) + +# Flask and Django Integration Documentation + +* [pyecharts + Flask](https://github.com/chenjiandongx/pyecharts/blob/master/document/en-us/doc_flask.md) +* [pyecharts + Django](https://github.com/chenjiandongx/pyecharts/blob/master/document/en-us/doc_django.md) + + +# More Examples + +* More examples refer to [example.md](https://github.com/chenjiandongx/pyecharts/blob/master/example.md) +* Welcome to provide more examples. + +# About The Project + +* Enjoy pyecharts! +* If you have any question or want to improve this repository, welcome to create an issue or pull requests . +* If you want to discuss with me alone, use the emali -> chenjiandongx@qq.com +* Show solicitude for [changelog.md](https://github.com/chenjiandongx/pyecharts/blob/master/changelog.md) diff --git a/docs/en-us/customize_map.md b/docs/en-us/customize_map.md new file mode 100644 index 000000000..183587aa3 --- /dev/null +++ b/docs/en-us/customize_map.md @@ -0,0 +1,168 @@ +> Map extensions + +## How to get map extensions + +Since 0.3.2, the map extensions become independent and optional python packages. No longer pyecharts carries any javascript libraries. Developer should cherry-pick the map extension of their need. + +1. [Maps of All countries](https://echarts-maps.github.io/echarts-countries-js/): [echarts-countries-pypkg](https://github.com/pyecharts/echarts-countries-pypkg) (1.9MB): Map of world, 213 countries including China. +2. [Maps of Chinese provinces](https://echarts-maps.github.io/echarts-china-provinces-js/): [echarts-china-provinces-pypkg](https://github.com/pyecharts/echarts-china-provinces-pypkg) (730KB):23 provinces, 5 autonomous regions +3. [Maps of Chinese cities](https://echarts-maps.github.io/echarts-china-cities-js/): [echarts-china-cities-pypkg](https://github.com/pyecharts/echarts-china-cities-pypkg) (3.8MB):370 Chinese cities + +The following pip commands will install the maps for you: + +``` +pip install echarts-countries-pypkg +pip install echarts-china-provinces-pypkg +pip install echarts-china-cities-pypkg +``` + +Please note China map exists in echarts-countries-pypkg. + +## How to make a map extension + +You will need to create two github projects: one is a npm project,providing javascript libraries;the other is a python project,package previous project as a python package. + +### npm project + +It must be a npm project on github, and has gh-pages enabled to host all javascript librraries. +With gh-pages, your jupyter user cannot see the maps when they export ipynb as html. + +Now, first, you need to get the following utilities: + +``` +pip install yehua +git clone https://github.com/echarts-maps/echarts-js-mobans.git +export YEHUA_FILE=/ABSOLUTE/PATH/TO/echarts-js-mobans/yehua.yml +``` + +Then you can create your own work folder and change into it. Take echarts-united-kingdom-js as an example: + +``` +$ yh +Yehua will walk you through creating a echarts-maps js package. +Press ^C to quit at any time. + +project name: echarts-united-kingdom-js +description: UK maps for echarts +license: MIT +author: C.W. +All done!! project echarts-united-kingdom-js is created +``` + +All is done. Let's see what was the output: + +``` +pyecharts-host:tmp chfw$ cd echarts-united-kingdom-js/ +pyecharts-host:echarts-united-kingdom-js chfw$ ls +echarts-united-kingdom-js package.json registry.json +``` + +Now, let's talk about the folder structure of an echarts js project: + + +``` ++ echarts-united-kingdom-js + + registry.json + + package.json + + echarts-united-kingdom-js + + london.js + + manchester.js + + index.js + + other files +``` + +In registry.json ,the following dictionary should be filled by yourself, in order to work with pyecharts in all situations: +``` +{ + "JUPYTER_URL": "/nbextensions/echarts-united-kingdom-js", + "GITHUB_URL": "https://your.github.io/echarts-united-kingdom-js/echarts-united-kingdoms-js", + "JUPYTER_ENTRY": "echarts-united-kingdom-js/index", + "JS_FOLDER": "echarts-united-kingdoms-js", + "PINYIN_MAP": { + "伦敦": "lundun", + "曼彻斯特": "manqiesite" + }, + "FILE_MAP": { + "lundun": "london", + "manqiesite": "manchester" + } +} +``` + +index.js is made for jupyter notebook only: +``` +define(["require", "exports"], function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var version = '1.0.0'; + function load_ipython_extension() { + console.log("echarts-united-kingdom-js " + version + " has been loaded"); + } + exports.load_ipython_extension = load_ipython_extension; +}); + +Now, you need to put javascript libraries under the sub-folder `echarts-united-kingdom-js` and please remember to update `PINYI_MAP` and `FILE_MAP`. + +``` + +### python repository + +Again, you will need the following utilities: + +``` +pip install yehua +git clone https://github.com/pyecharts/pypkg-mobans.git +export YEHUA_FILE=/ABSOLUTE/PATH/TO/pypkg-mobans/yehua.yml +``` + +Then create your work folder and change to it please. Take echarts-united-kingdom-pykg as an example: + +``` +$ yh +Yehua will walk you through creating a pyecharts pypkg package. +Press ^C to quit at any time. + +project name: echarts-united-kingdom-pypkg +npm project name: echarts-united-kingdom-js +description: pyecharts map extension - united kingdom maps - python package +license: MIT +author: C.W. +contact email: wangc_2011@hotmail.com +github profile/organisation: chfw +copyright owner: C.W. +Cloning into 'mobans'... +remote: Counting objects: 214, done. +remote: Compressing objects: 100% (11/11), done. +remote: Total 214 (delta 8), reused 12 (delta 5), pack-reused 198 +Receiving objects: 100% (214/214), 30.31 KiB | 17.00 KiB/s, done. +Resolving deltas: 100% (126/126), done. +Templating CUSTOM_README.rst.jj2 to README.rst +Templating custom_setup.py.jj2 to setup.py +Templating requirements.txt.jj2 to requirements.txt +Templating tests/custom_requirements.txt.jj2 to tests/requirements.txt +Templating docs/source/conf.py.jj2 to docs/source/conf.py +Templating test.script.jj2 to test.sh +Templating _version.py.jj2 to echarts_united_kingdom_pypkg/_version.py +Templating gitignore.jj2 to .gitignore +Templating travis.yml.jj2 to .travis.yml +Templated 9 files. +Initialized empty Git repository in /private/tmp/echarts-united-kingdom-pypkg/.git/ +Please review changes before commit! +``` + +Now all files have been generated. Let's add previous project as a submodule: + + +``` +pyecharts-host:tmp chfw$ cd echarts-united-kingdom-pypkg/ +git submodule add https://github.com/your/npm/project your_project_name_pypkg/resources +git submodule init +``` + +Please add all files and then do: + +``` +git commit +``` + +Now it is ready for github. diff --git a/docs/en-us/django.md b/docs/en-us/django.md new file mode 100644 index 000000000..f3e661f1e --- /dev/null +++ b/docs/en-us/django.md @@ -0,0 +1,192 @@ +# pyecharts integration with django + +We are following the official django [tutorials](https://docs.djangoproject.com/en/1.11/intro/tutorial01/) here. We expect you are familar with django and have +gone through the tutorial at least. + + +## Step 0: Let's create a virtual environment and install pyecharts + +```shell +$ virtualenv --no-site-packages pyecharts-env +$ source pyecharts-env/bin/activate +$ pip install django==1.11.4 +$ pip install pyecharts +``` + +Although current dependencies of pyecharts include django, the tutorial is written on top django version **1.11.4**. + + +## Step 1: create a mini django site and the actual visualization app + +```shell +$ django-admin startproject myechartsite +``` + +And start an app + +```shell +$ python manage.py startapp myfirstvis +$ ls +db.sqlite3 manage.py myechartsite myfirstvis +``` + +Then register the app in `myechartsite/settings.py`: + +``` +# myechartsite/settings.py +... +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'myfirstvis' # <--- +] +... +``` + +And then let's create the urls.py which provides the url route to the request handler. +And we will create the request handler views.py in step 3. + +```python +myfirstvis/urls.py +from django.conf.urls import url + +from . import views + +urlpatterns = [ + url(r'^$', views.index, name='index'), +] +``` + +And insert the 'myfirstvis.urls' into `myechartsite/urls.py` + +```python +myechartsite/urls.py +from django.conf.urls import include, url +from django.contrib import admin + +urlpatterns = [ + url(r'^admin/', admin.site.urls), + url(r'^myfirstvis/', include('myfirstvis.urls')) # <--- +] +``` + +## Step 2: Now let's write up the view function + +Then copy the following code and save as `myfirstvis/views.py` + + +```python +from __future__ import unicode_literals +import math + +from django.http import HttpResponse +from django.template import loader +from pyecharts import Line3D + +from pyecharts.constants import DEFAULT_HOST + + +def index(request): + template = loader.get_template('myfirstvis/pyecharts.html') + l3d = line3d() + context = dict( + myechart=l3d.render_embed(), + host=DEFAULT_HOST, + script_list=l3d.get_js_dependencies() + ) + return HttpResponse(template.render(context, request)) + + +def line3d(): + _data = [] + for t in range(0, 25000): + _t = t / 1000 + x = (1 + 0.25 * math.cos(75 * _t)) * math.cos(_t) + y = (1 + 0.25 * math.cos(75 * _t)) * math.sin(_t) + z = _t + 2.0 * math.sin(75 * _t) + _data.append([x, y, z]) + range_color = [ + '#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] + line3d = Line3D("3D line plot demo", width=1200, height=600) + line3d.add("", _data, is_visualmap=True, + visual_range_color=range_color, visual_range=[0, 30], + is_grid3D_rotate=True, grid3D_rotate_speed=180) + return line3d +``` + +`script_list` is a list of echarts libraries that are required for the chart rendering on the page. +The number of libraries varies according to the dependency requirements of the charts +to be rendered. + +`host` refers to the host for echarts libraries. The default host is +http://chfw.github.io/jupyter-echarts/echarts. You can change them if you wish. And if you do so, +please clone https://github.com/chfw/jupyter-echarts. Then, place `echarts` folder onto your own server. + + +## Step 3: Now let's create a template + +Previous steps follow the [tutorial part 1](https://docs.djangoproject.com/en/1.11/intro/tutorial01/). Now let's jump to [tutorial part 3](https://docs.djangoproject.com/en/1.11/intro/tutorial03/). + +Please create a templates directory and save the following file into it. + +```shell +$ mkdir templates/myfirstvis -p +``` + +Please note the absolute path is: `/myfirstvis/templates/myfirstvis`. Here +is the template file. + + +```html + + + + + + + Proudly presented by PycCharts + {% for jsfile_name in script_list %} + + {% endfor %} + + + + {{myechart|safe}} + + + +``` + +## Step 4: Run it + +Then let's bring up the django site: + +```shell +$ cd myechartsite +$ python manage.py runserver + +You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. +Run 'python manage.py migrate' to apply them. + +August 08, 2017 - 05:48:38 +Django version 1.11.4, using settings 'myechartsite.settings' +Starting development server at http://127.0.0.1:8000/ +Quit the server with CONTROL-C. +``` + +Please visit http://localhost:8000/myfirstvis/ for your first visualization via pyecharts. Here is your first 3D visualization: + +![django-0](https://github.com/chenjiandongx/pyecharts/blob/master/images/django-0.gif) + + +## Conclusion + +As you can see, it is just a few steps to create a visual charts using pyecharts. Django tutorials has 7 parts and we only need 1st and 3rd parts to +make the visualisation. + +For your reference, please find the example code in `pyecharts/document` folder. \ No newline at end of file diff --git a/docs/en-us/faq.md b/docs/en-us/faq.md new file mode 100644 index 000000000..d1103ab5f --- /dev/null +++ b/docs/en-us/faq.md @@ -0,0 +1,45 @@ +> Frequently asked questions and its solutions + +**jupyter-notebook export problem** + +Since 0.1.9.7, pyecharts has gone into offline mode, drawing without internet connection. Now, the charts in exported note book cannot be display as they have been put outside +jupyter environment. + +So the solution is to add the following statement: + +```python +... +from pyecharts import online + +online() +... +``` +Above code will take javascripts from github. +you cannot connect to github, you could clone https://github.com/pyecharts/assets. Then, you put `js` folder onto your own server. Here is a simple command to achieve it: + +``` +$ git clone https://github.com/pyecharts/assets +$ cd js +$ python -m http.server # for python 2, use python -m SimpleHTTPServer +Serving HTTP on 0.0.0.0 port 8000 ... +``` + +Then, add localhost into previous python code: + +```python +... +from pyecharts import online + +online(host="http://localhost:8000) +... +``` + +**Python2 Coding Problem** + +default code type is UTF-8, there's no problem in Python3, because Python3 have a good support in chinese. But in Python2, please use the following sentence to ensure avoiding wrong coding problem: +``` +#!/usr/bin/python +#coding=utf-8 +from __future__ import unicode_literals +``` +The first two sentences are telling your editor that it should use UTF-8 ([PEP-0263](https://www.python.org/dev/peps/pep-0263/)). And the last sentence is telling Python all the characters are UTF-8 ([unicode literals](http://python-future.org/unicode_literals.html)) diff --git a/docs/en-us/flask.md b/docs/en-us/flask.md new file mode 100644 index 000000000..9024ec96e --- /dev/null +++ b/docs/en-us/flask.md @@ -0,0 +1,112 @@ +# pyecharts integration with Flask + +## Step 0: let's create a mini flask project + +Please create new directory for the new project + +```shell +$ mkdir flask-echarts +$ cd flask-echarts +$ mkdir templates +``` + +## Step 1: render your chart using chart_instance.render_embed() + +Please save the following python file as server.py under your project root directory. + +```python +import random +from pyecharts import Scatter3D +from pyecharts.constants import DEFAULT_HOST +from flask import Flask, render_template + + +app = Flask(__name__) + + +@app.route("/") +def hello(): + s3d = scatter3d() + return render_template('pyecharts.html', + myechart=s3d.render_embed(), + host=DEFAULT_HOST, + script_list=s3d.get_js_dependencies()) + + +def scatter3d(): + data = [generate_3d_random_point() for _ in range(80)] + range_color = [ + '#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] + scatter3D = Scatter3D("3D scattering plot demo", width=1200, height=600) + scatter3D.add("", data, is_visualmap=True, visual_range_color=range_color) + return scatter3D + + +def generate_3d_random_point(): + return [random.randint(0, 100), + random.randint(0, 100), + random.randint(0, 100)] +``` + +`script_list` is a list of echarts libraries that are required for the chart rendering on the page. +The number of libraries varies according to the dependency requirements of the charts +to be rendered. + +`host` refers to the host for echarts libraries. The default host is +http://chfw.github.io/jupyter-echarts/echarts. You can change them if you wish. And if you do so, +please clone https://github.com/chfw/jupyter-echarts. Then, place `echarts` folder onto your own server. + +## Step 2: provide your own template + +Please save the following template as pyecharts.html in `templates` folder + +```html + + + + + + Proudly presented by ECharts + {% for jsfile_name in script_list %} + + {% endfor %} + + + + {{myechart|safe}} + + + +``` + +## Step 3: run it + +Now you shall have these: + +```shell +$ ls +server.py templates +$ ls templates +pyecharts.html + + +```shell +$ pip install flask +$ export FLASK_APP=server.py +$ flask run +* Serving Flask app "server" +* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) +``` + +Here's what you will get: + +![flask-0](https://github.com/chenjiandongx/pyecharts/blob/master/images/flask-0.gif) + + +## Conclusion + +It is extremely simple to include a pyexcharts instance in a Flask app. Please go +ahead and put your own charts in flask. + +For your reference, please find the example code in `pyecharts/document` folder. diff --git a/docs/en-us/for_pyechart_developer.md b/docs/en-us/for_pyechart_developer.md new file mode 100644 index 000000000..5208d5f9a --- /dev/null +++ b/docs/en-us/for_pyechart_developer.md @@ -0,0 +1,124 @@ +# Developer's Guide + +## Pull request instructions + +`dev` branch is for the development of each new releases. `master` branch is reserved for released code only. What it means for contributors is: +please checkout `dev` branch right after you have a clone of pyecharts. Then start your engineering effort. When you are ready, please submit a PR +against `dev` branch too. + +If your PR has code changes, please include unit tests. If possible, please attach a screenshot on your contribution. It helps everyone to see your contribution. + +## Generate uml diagram + +It uses plantuml and please get it from [its website](http://plantuml.com). + +``` +jar -jar plantuml.jar class-relationship-diagram.uml. +``` + +## How to add more javascript libraries to pyecharts + +All javascript libraries are now managed in a [submodule](https://git-scm.com/docs/git-submodule) [jupyter-echarts](https://github.com/chfw/jupyter-echarts). It means +new javascript library shall go through `jupyter-echarts`. + +jupyter-echarts is a front-end project. If you are new to front-end engineering, please find the crash course for you in the end. + +### Step 1: add the library to jupyter-echarts + +Checkout the repository: + +``` +git clone https://github.com/chfw/jupyter-echarts.git +``` + +And then do + +``` +npm install --save your_javascript_library +``` + +Edit gulp.js + +``` +... +FILES = [ + './node_modules/echarts/dist/echarts.min.js', + './node_modules/echarts/map/js/china.js', + './node_modules/your_library/dist/min_version.js' <--- +... +FILE_MAP = [ +... + 'nick_name': 'min_version' // note, please do not put .js suffix +... +] +PROVINCE_PINYIN_MAP = [ +... + 'chinese location name': 'nick_name', // note nick_name is the same as previous one +... +] +``` + +Then run + +``` +$ gulp +``` + +The most important thing is to do git commit. You will need to commit it +to jupyter-echarts. If you do not have write access, please submit a PR. + +If your contribution become large, please reference: echarts-countries-js or +echarts-china-cities-js. + +### Step 2: update pyecharts + +Once your previous commit is accepted in jupyter-notebooks, you could then +checkout pyecharts:: + +``` +$ git clone --recursive https://github.com/chenjiandongx/pyecharts.git +$ cd pyecharts/pyecharts/templates/js +$ git pull +remote: Counting objects: 7, done. +remote: Compressing objects: 100% (2/2), done. +remote: Total 7 (delta 4), reused 7 (delta 4), pack-reused 0 +Unpacking objects: 100% (7/7), done. +From https://github.com/chfw/jupyter-echarts + af7184b..bb87949 master -> origin/master +Updating af7184b..bb87949 +Fast-forward + echarts/main.js | 2 +- + gulpfile.js | 2 +- + src/main.ts | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) +$ cd ../../../ +$ git commit -am "pull latest changes from jupyter-echarts +``` + +And then push your changes to pyecharts. + + +## Front end engineering for Pythonistas + +In front end engineering field, no one manually downloads a javascript/css file +and type the script tag into html file. To an extreme, no one writes html, css +nor javascript though they are writing web pages. All of those work are either +automated and transcompiled. + +[npm](https://docs.npmjs.com/getting-started/what-is-npm) is a node.js package manager and helps front end engineers to automate +the delivery of all javascript and css modules. In this category, there are +other similiar tools: [bower](https://bower.io), [jspm](https://jspm.io) etc. [gulp](https://gulpjs.com) is the `make` command in node.js +world and gulpfile.js is the `Makefile` for gulp. You will write all commands +in javascript. These tools helps the developer automate the delivery of +javascript and css files as you would use pip for python packages. + +So what do they write if no html, css nor javascript are written? They write +[pug file](https://pugjs.org/api/getting-started.html)/[HAML file](http://haml.info), [sass file](http://sass-lang.com) and [coffeescript](http://coffeescript.org)/[typescript](http://www.typescriptlang.org) files. Those files +are then trans-compiled into what you see as html, css and javascript. Nowadays, +writing a few webpage has become a software engineering acitvity. Object +oriented programming, code reuse, css attribute inheritance are the things +in front end engineer's head on daily basis. + +Above is a quick introduction to front end engineering. There are many excellent +projects, tools and developers in node.js universe, waiting for you to find and +meet. diff --git a/docs/en-us/jupyter_notebook.md b/docs/en-us/jupyter_notebook.md new file mode 100644 index 000000000..1b4ef4a5a --- /dev/null +++ b/docs/en-us/jupyter_notebook.md @@ -0,0 +1,61 @@ +# pyecharts Document - Jupyter Notebook + +## Overview + +You can show charts and export to some file formats in the Jupyter Notebook. + +## Installation + +When install the *pyecharts* package using the following command, a jupyter nbextension named *echarts/main* will be installed if jupyter exists.Or the nbextension installation will be skipped. + +```shell +pip install pyecharts +``` + +In the development, you can also use the command to install manually jupyter nbextension. + +```shell +$ pip install jupyter-echarts-pypkg +``` + +You can check the jupyter nbextension using the *list* command. + +```shell +$ jupyter nbextension list +Known nbextensions: + config dir: /Users/jaska/.jupyter/nbconfig + notebook section + echarts/main enabled + - Validating: OK +``` + + + +## Show Charts + +In the Notebook cell ,you can simply call the instance itself to diplay the chart. + +All chart classes in pyecharts implement the `_repr_html_` interface about [IPython Rich Display](http://ipython.readthedocs.io/en/stable/config/integrating.html#rich-display) . + +![pandas_numpy](https://github.com/pyecharts/pyecharts/blob/master/images/pandas-numpy.png) + +## Export Images and Pdf + +You can also download as some file formats (ipynb/py/html/pdf) and run without jupyter notebook enviromnment. + +**Important** :You must be use remote jshost mode to enable this feature. + +```python +from pyecharts import online + +online(host='https://my-site.com') +``` + +## Demo + +see more detail for [pyecharts-users-cases](https://github.com/pyecharts/pyecharts-users-cases) 。 + +## jupyterlab + +[jupyterlab](https://github.com/jupyterlab/jupyterlab) is the next generation for Jupyter Notebook,and this is a very early preview, and is not suitable for general usage yet. We will pay Continuous attention to the development and make adapter with pyecharts. + diff --git a/docs/en-us/prepare.md b/docs/en-us/prepare.md new file mode 100644 index 000000000..06c4ef77f --- /dev/null +++ b/docs/en-us/prepare.md @@ -0,0 +1,192 @@ +# First-steps +### Make sure you have installed the latest version pyecharts +Now, you are ready to make your first chart! +```python +from pyecharts import Bar + +bar = Bar("我的第一个图表", "这里是副标题") +bar.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90]) +bar.show_config() +bar.render() +``` + +![guide-0](https://user-images.githubusercontent.com/19553554/35103909-3ee41ba2-fca2-11e7-87be-1a3585b9e0fa.png) + +**Tip:** You can click the download button on the right side to download the picture to your local disk. + +* ```add()``` + main method,add the data and set up various options of the chart +* ```show_config()``` + print and output all options of the chart +* ```render()``` + creat a file named render.html in the root directory defaultly,which supports path parameter and set the location the file save in,for instance render(r"e:\my_first_chart.html"),open file with your browser. + +**Note:** Click the image download button on the right hand side of the chart. If you need more buttons, please insert `is_more_utils=True` when calling add() + +```python +from pyecharts import Bar + +bar = Bar("我的第一个图表", "这里是副标题") +bar.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90], + is_more_utils=True) +bar.render() +``` +![guide-1](https://user-images.githubusercontent.com/19553554/35104150-f31e1b7c-fca2-11e7-81cf-a12bf1629e02.png) + + +### Rendering as image using pyecharts-snapshot + +If you would to get png, pdf, gif files instead of `render.html`, you can use [pyecharts-snapshot](https://github.com/chfw/pyecharts-snapshot)。However, node.js is required and can be downloaded from [https://nodejs.org/en/download/](https://nodejs.org/en/download/) + +1. Install phantomjs + `npm install -g phantomjs-prebuilt` +2. install pyecharts-snapshot + `pip install pyecharts-snapshot` +3. In your program, import pyecharts-snapshot + `from pyecharts_snapshot.main import make_a_snapshot` +4. Programmatical usage + `make_a_snapshot('render.html', 'snapshot.png')` + where the frist parameter is the output file(by default, render.html), and the second one is output file with file extension as png or pdf. + +For more details, please refer to [pyecharts-snapshot](https://github.com/chfw/pyecharts-snapshot) + +``` + +### Chart rendering process + +almost all the chart type drawed like this: +1. ```chart_name = Type()``` Initialise the concrete chart type. +2. ```add()``` Add data and options. +3. ```render()``` Creat .html file. + +​```add()``` Data is two lists commonly(the same length),if your data is dictionary or dictionary with tuple,use ```cast()``` to convert. + +​```python +@staticmethod +cast(seq) +​``` Convert the sequence with the dictionary and tuple type into k_lst, v_lst. ``` +``` +1. Tuple Lists + [(A1, B1), (A2, B2), (A3, B3), (A4, B4)] --> k_lst[ A[i1, i2...] ], v_lst[ B[i1, i2...] ] +2. Dictionary Lists + [{A1: B1}, {A2: B2}, {A3: B3}, {A4: B4}] --> k_lst[ A[i1, i2...] ], v_lst[ B[i1, i2...] ] +3. Dictionaries + {A1: B1, A2: B2, A3: B3, A4: B4} -- > k_lst[ A[i1, i2...] ], v_lst[ B[i1, i2...] ] + +### Render Charts Many Times + +> Update on v0.4.0 + +You can call `chart.render` many times to show some charts in a script. + +```python +from pyecharts import Bar, Line + +bar = Bar("我的第一个图表", "这里是副标题") +bar.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90]) +bar.render(path='bar.html') + +line = Line("我的第一个图表", "这里是副标题") +line.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90]) +line.render(path='line.html') +``` + +In v0.4.0+, pyecharts refactors the internal logic and make render faster.The following code is recommended. + +```python +from pyecharts import Bar, Line +from pyecharts.engine import create_default_environment + +bar = Bar("我的第一个图表", "这里是副标题") +bar.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90]) + +line = Line("我的第一个图表", "这里是副标题") +line.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90]) + +env = create_default_environment() + +env.render_chart_to_file(bar, path='bar.html') +env.render_chart_to_file(line, path='line.html') +``` + +This example use the only one engine object to render multiple charts. + +### Pandas & Numpy examples + +In the context of Numpy and/or Pandas, ```pdcast(pddata)``` and ``` npcast(npdata)``` methods, provided in 0.19.2 are no log required. Please see the advanced example in README. + +![pandas-numpy](https://user-images.githubusercontent.com/19553554/35104252-3e36cee2-fca3-11e7-8e43-09bbe8dbbd1e.png) + +If your DataFrame returns a transposed list(such as, [ [1], [2], [3] ]), you have to tranpose it by yourself (make it like [ 1, 2, 3 ] ). This transpose operation applies to Radar, Parallel, HeatMap. + +Series type +```python +from pyecharts import Bar +import pandas as pd + +pddata = pd.Series([1, 2, 3, 4], index=[1, 'b', 'c', 'd']) +vlst, ilst = Bar.pdcast(pddata) + +print(vlst) +>>> [1.0, 2.0, 3.0, 4.0] +print(ilst) +>>> ['1', 'b', 'c', 'd'] +``` + +DataFrame type +```python +from pyecharts import Bar +import pandas as pd + +pddt = pd.DataFrame([[1, 2, 3, 4], [2, 3, 4, 5], [4.1, 5.2, 6.3, 7.4]], index=["A", "B", "C"]) +vlst, ilst = Bar.pdcast(pddata) + +print(vlst) +>>> [[1.0, 2.0, 3.0, 4.0], [2.0, 3.0, 4.0, 5.0], [4.1, 5.2, 6.3, 7.4]] +print(ilst) +>>> ['A', 'B', 'C'] +``` + +npcast(),It accepts numpy.array type. +```python +@staticmethod +npcast(npdata) +​``` handle the ndarray type in Numpy, return a list that ensures the correct type. Returns the nested list if there are multiple dimensions.``` +``` + +Numpy.array type +```python +from pyecharts import Bar +import numpy ad np + +npdata = np.array([[1, 2, 3, 4], [2, 4, 5.0, 6.3]]) +print(npdata) +>>> [[1.0, 2.0, 3.0, 4.0], [2.0, 4.0, 5.0, 6.3]] +``` + +**Of course you can use the cooler way,use Jupyter Notebook to show the chart.But what matplotlib have,so do pyecharts** + +like this + +![notebook-0](https://user-images.githubusercontent.com/19553554/35104153-f6256212-fca2-11e7-854c-bacc61eabf6f.gif) + +and this + +![notebook-1](https://user-images.githubusercontent.com/19553554/35104157-fa39e170-fca2-11e7-9738-1547e22914a6.gif) + +more Jupyter notebook examples, please refer to [notebook-use-cases](https://github.com/chenjiandongx/pyecharts/blob/master/document/notebook-use-cases.ipynb)。you could download and run it on your notebook. + +**Tip:** The function was official added in 0.1.9.2 version,please update the newest version to use it. + + +### Offline installation instructions for pyecharts 0.3.2 + + +Please download these three packages from pypi: pyecharts, pyecharts-jupyter-installer, 和 jupyter-echarts-pypkg. + +Then install them sequentially as: + +``` +pip install pyecharts-jupyter-installer.tar.gz +pip install jupyter-echarts-pypkg.tar.gz +pip install pyecharts.tar.gz +``` diff --git a/docs/en-us/team.md b/docs/en-us/team.md new file mode 100644 index 000000000..44623fc61 --- /dev/null +++ b/docs/en-us/team.md @@ -0,0 +1,27 @@ +# Author + +## Development Team + +Home Url: https://github.com/pyecharts + +| Avatar | Username | Role | +| ------ | ------ | ------ | +| ![chenjiandongx](https://avatars3.githubusercontent.com/u/19553554?s=60&v=4) | [chenjiandongx](https://github.com/chenjiandongx) | Owner | +| |[chfw](https://github.com/chfw) | Member | +| ![kinegratii](https://avatars2.githubusercontent.com/u/9875406?s=60&v=4) | [kinegratii](https://github.com/kinegratii) | Member | + +## Contributors + +> Thank you for contributions ! + +| Avatar | Username | +| ------ | ------ | +| landpack | [landpack](https://github.com/landpack) | +| muxuezi | [muxuezi](https://github.com/muxuezi) | +| 647-coder | [647-coder](https://github.com/647-coder) | +| sd8089730 | [sd8089730](https://github.com/sd8089730) | +| MiracleXYZ | [MiracleXYZ](https://github.com/MiracleXYZ) | +| mowujilun | [mowujilun](https://github.com/mowujilun) | +| xbanke | [xbanke](https://github.com/xbanke) | +| shkey | [shkey](https://github.com/shkey) | +| crispgm | [crispgm](https://github.com/crispgm) | \ No newline at end of file diff --git a/docs/en-us/web_integration.md b/docs/en-us/web_integration.md new file mode 100644 index 000000000..8854dead7 --- /dev/null +++ b/docs/en-us/web_integration.md @@ -0,0 +1,114 @@ +# pyecharts document - Web Integration + +> Before You Read +> +> 1. This web integration requires pyecharts V0.3.0+. +> 2. This article is principle-described instead of a tutorial.So you should learn a lot about the relevant web framework. + +Now, it is more easy to integrate pyecharts with your web framework ,whatever you start a project or integrate a exist one.The integration will not break down origin features because of the flexibility and OOP in Python language. + +pyecharts exposes the API of builtin jinja2 template engine.In theory, it is easy to integrate the web framework which use jinja2 template engine. + +In different use case,different specific methods and procedures will be used. This arctile will use the common framework,Django and Flask to describe the procedures ,which other framework can be inspired from. + +## Flask + +### Custom Template Engine + +pyecharts use jinja2 as its template engine.According to Flask document.It is easy to integrate pyechart and Flask.This is a example. + +You can follow these steps to create custom template engine. + +- In the constructor `__init__` , addd attribute `pyecharts_config` and add template functions. +- Assign this class to your Flask app class. + +```python +from flask import Flask, render_template +from flask.templating import Environment + +from pyecharts import HeatMap +from pyecharts.engine import ECHAERTS_TEMPLATE_FUNCTIONS +from pyecharts.conf import PyEchartsConfig + +class FlaskEchartsEnvironment(Environment): + def __init__(self, *args, **kwargs): + super(FlaskEchartsEnvironment, self).__init__(*args, **kwargs) + self.pyecharts_config = PyEchartsConfig(jshost='https://cdn.bootcss.com/echarts/3.7.2') + self.globals.update(ECHAERTS_TEMPLATE_FUNCTIONS) + +class MyFlask(Flask): + jinja_environment = FlaskEchartsEnvironment + +app = MyFlask(__name__) +``` + +### Template Function + +You can use `echarts_*` template function in the template file. + +```html + + + + + 自定义模板 + {{ echarts_js_dependencies(hm) }} + + +

在 Flask 下使用 echarts_* 系列模板函数(Template Functions)渲染页面。

+ {{ echarts_container(hm) }} + {{ echarts_js_content(hm) }} + + +``` + +In the demo, boo CDN js is used, so the output ` +``` + +### Example Project + +The github repositoriy [Flask_demo](https://github.com/kinegratii/flask_demo) is a more complete example, which use local echarts library javascript files.You can continue development based on this project. + +## Django + +### Custom Template Engine + +From v1.8, you can directly use jinja2 as template engine in Django. + +In the integration,you should define a callable function which returns a `jinja2.Environment` object.This is a example following [Django Document](https://docs.djangoproject.com/en/1.11/topics/templates/#django.template.backends.jinja2.Jinja2) : + +```python +from django.contrib.staticfiles.storage import staticfiles_storage +from django.urls import reverse + +from pyecharts.conf import PyEchartsConfig +from pyecharts.engine import BaseEnvironment + + +def environment(**options): + env = BaseEnvironment(pyecharts_config=PyEchartsConfig(jshost='/static/'), **options) + # Add template functions to the environment object + env.globals.update({ + 'static': staticfiles_storage.url, + 'url': reverse, + }) + return env + +``` + +See more detail at Django document. + +## Summary + +You can has two way to create your own engine class. + +- Inherit `pyecharts.engine.BaseEnvironment` :e.g Django. Used for用于可以直接使用的场景。 +- Add template function:e.g Flask, The class `flask.templating.Environment` overwrites some features from `jinja2.Environment` .So you should inherit this class,and add template function handly. + +## More + +- If you use Django's default template engine, see the project [django-echarts](https://github.com/kinegratii/django-echarts) for more detail. + diff --git a/docs/favicon.ico b/docs/favicon.ico new file mode 100644 index 000000000..5b56c9bac Binary files /dev/null and b/docs/favicon.ico differ diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 000000000..2477c08f8 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,50 @@ + + + + + + pyecharts + + + + + + + + + +
Loading ...
+ + + + + + \ No newline at end of file diff --git a/docs/loading_sequence.uml b/docs/loading_sequence.uml new file mode 100644 index 000000000..198df3337 --- /dev/null +++ b/docs/loading_sequence.uml @@ -0,0 +1,21 @@ +@startuml + +actor bob +participant pyecharts +participant lml +participant "jupyter-echarts-pypkg" +participant "echarts-china-cities-pypkg" +participant "echarts-countries-pypkg" + +bob -> pyecharts : > draw world map +pyecharts -> lml : scan for plugins. +lml -> pyecharts: 3 packages found +pyecharts -> "jupyter-echarts-pypkg" : read registry.json +"jupyter-echarts-pypkg" --> pyecharts: here is my extension profile +pyecharts -> "echarts-china-cities-pypkg" : read registry.json +"echarts-china-cities-pypkg" --> pyecharts: here is my extension profile +pyecharts -> "echarts-countries-pypkg" : read registry.json +"echarts-countries-pypkg" --> pyecharts: here is my extension profile +"jupyter-echarts-pypkg" -> pyecharts: here is the world map +pyecharts -> bob: world map +@enduml \ No newline at end of file diff --git a/docs/map-extension-architecture.uml b/docs/map-extension-architecture.uml new file mode 100644 index 000000000..9543fcf79 --- /dev/null +++ b/docs/map-extension-architecture.uml @@ -0,0 +1,38 @@ +@startuml + +cloud "pypi" { +[pyecharts] +[pyecharts-jupyter-installer] +[jupyter notebook] + +[lml] + +[jupyter-echarts-pypkg] +[echarts-countries-pypkg] +[echarts-china-cities-pypkg] +} + +cloud "github" { + [jupyter-echarts] + [echarts-countries-js] + [echarts-china-cities-js] +} + +[jupyter-echarts] +[echarts-china-cities-js] + +[jupyter-echarts-pypkg] ..> [jupyter-echarts] : packages +[echarts-china-cities-pypkg] ..> [echarts-china-cities-js] : packages +[echarts-countries-pypkg] ..> [echarts-countries-js] : packages +[pyecharts] --> [lml] : finds extensions through +[lml] --> [echarts-countries-pypkg] : links +[lml] --> [echarts-china-cities-pypkg] : links +[lml] --> [jupyter-echarts-pypkg] : links + + +[jupyter-echarts-pypkg] --> [pyecharts-jupyter-installer] +[echarts-countries-pypkg] --> [pyecharts-jupyter-installer] +[echarts-china-cities-pypkg] --> [pyecharts-jupyter-installer] +[pyecharts-jupyter-installer] --> [jupyter notebook] : installs javascript extensions to + +@enduml diff --git a/docs/zh-cn/README.md b/docs/zh-cn/README.md new file mode 100644 index 000000000..b7cadebab --- /dev/null +++ b/docs/zh-cn/README.md @@ -0,0 +1,26 @@ +# pyecharts 文档 + +[![Build Status](https://travis-ci.org/pyecharts/pyecharts.svg?branch=master)](https://travis-ci.org/pyecharts/pyecharts) [![Build status](https://ci.appveyor.com/api/projects/status/81cbsfjpfryv1cl8?svg=true)](https://ci.appveyor.com/project/chenjiandongx/pyecharts) [![codecov](https://codecov.io/gh/pyecharts/pyecharts/branch/master/graph/badge.svg)](https://codecov.io/gh/pyecharts/pyecharts) [![PyPI version](https://badge.fury.io/py/pyecharts.svg)](https://badge.fury.io/py/pyecharts) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT) + + +pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,pyecharts 是为了与 Python 进行对接,方便在 Python 中直接使用数据生成图。 + +**基本使用** + +[渲染图表](zh-cn/prepare) | [图表配置](zh-cn/charts) + +**高级话题** + +[图表 API](zh-cn/api) | [自定义地图](zh-cn/customize_map) + +**平台支持** + +[Jupyter Notebook](zh-cn/jupyter_notebook) | [Flask](zh-cn/flask) | [Django](zh-cn/django) | [web 框架整合](zh-cn/web_integration) + +**其他资源** + +[示例项目](https://github.com/pyecharts/pyecharts-users-cases) | [地图扩展项目](https://github.com/pyecharts/echarts-china-cities-js) + +**项目开发** + +[版本日志](zh-cn/changelog) | [发布日志](zh-cn/release-note/) | [开发团队](zh-cn/team) | [FAQ](zh-cn/faq) diff --git a/docs/zh-cn/_sidebar.md b/docs/zh-cn/_sidebar.md new file mode 100644 index 000000000..1c0643ca5 --- /dev/null +++ b/docs/zh-cn/_sidebar.md @@ -0,0 +1,10 @@ +- [快速开始](zh-cn/prepare) +- [图表详情](zh-cn/charts) +- [地图自定义](zh-cn/customize_map) +- [pyecharts+Flask](zh-cn/flask) +- [pyecharts+Django](zh-cn/django) +- [Web 整合](zh-cn/web_integration) +- [艺术展](zh-cn/gallery) +- [API](zh-cn/api) +- [FAQ](zh-cn/faq) +- [捐赠](zh-cn/donate) \ No newline at end of file diff --git a/docs/zh-cn/api.md b/docs/zh-cn/api.md new file mode 100644 index 000000000..96e04106c --- /dev/null +++ b/docs/zh-cn/api.md @@ -0,0 +1,354 @@ +> API 篇:本文档描述了 pyecharts 库一些公开的 API,以供开发者之使用。 + +## 总体流程 + +一个通用的 pyecharts 使用流程可描述如下: + +| 步骤 | 简略代码 | 备注 | +| -------- | ---------------------------------------- | ---- | +| 1 创建图表实例 | `bar = Bar()` | | +| 2 添加数据 | `bar.add(**kwargs)` | | +| 3 创建配置实例 | `config = PyEchartsConfig(**kwargs)` | | +| 4 构建模板引擎 | `engine = EchartsEnvironment(pyecharts_config=config)` | | +| 5 获取模板文件 | `tpl = engine.get_template('demo_tpl.html')` | | +| 6 渲染 | `html = tpl.render(bar=bar)` | | +| 7 写入目标文件 | `write_utf8_html_file('my_demo_chart.html', html)` | | + + + +## pyecharts 配置项 + +pyecharts 遵循 “先配置后使用” 的基本原则,所有的配置项将统一于类 `pyecharts.conf.PyEChartsConfig` 类中。 + +如果使用 `chart.render()` 这种渲染方式,可以通过模块函数 `configure` 进行修改 pyecharts 中默认的配置类。 + +```python +import pyecharts +pyecharts.configure(P1=V1, P2=V2,...) +``` + +### 配置列表 + +**echarts_template_dir** + +模板文件目录,默认值:'.'(当前目录)。用于自定义模板文件,即 `render` 的 template_name 参数构成全部的路径。 + +**jshost** + +js 文件仓库路径。可以设置本地或者远程地址。所有的远程地址必须以 `http://` 或者 `https://` 开头。 +也可以使用 `pyecharts.online()` 函数设置此选项。 +为了保持兼容性, jshost 并不是必须使用 '/' 等分隔符作为结尾。 + +**force_js_embed** + +是否强制采用内部嵌入方式渲染js文件标签, `echarts_js_dependencies` 模板函数受此影响,具体可参考该函数。 + +## 图表类 + +图表类是 pyecharts 库中最为核心的内容,每一个类代表了 [Echarts](http://echarts.baidu.com/) 中一个图表类型。下表显示了这些图表的继承体系。 + +![class-relationship-diagram](https://raw.githubusercontent.com/chenjiandongx/pyecharts/master/images/class-relationship-diagram.png) + +### 属性 + +图表类和属性表如下: + +| 属性/图表 | Base | Chart/FOO_CHART | Grid | Overlap | Timeline | Page | +| --------------- | ---- | --------------- | ---- | ------- | -------- | ---- | +| chart_id | ✓ | ✓ | ✓ | ✓ | ✓ | | +| width | ✓ | ✓ | ✓ | ✓ | ✓ | | +| heigth | ✓ | ✓ | ✓ | ✓ | ✓ | | +| options | ✓ | ✓ | ✓ | ✓ | ✓ | | +| js_dependencies | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | + +**chart_id** + +字符串类型(str),图表唯一标识符,默认 uuid 格式的字符串,如 `'d2d9dcc4e28247518186c0882d356ba8'` 。 + +**width** + +数字类型(number)或字符串(str)。图表容器 div 的宽度,接收一个有效 css 长度形式的字符串;如果是数字,以 px 为单位。 + +**height** + +数字类型(number)或字符串(str)。图表容器 div 的高度,接收一个有效 css 长度形式的字符串;如果是数字,以 px 为单位。 + +> chart_id、width、height 三个属性均支持可写。 + +**options** + +字典类型(dict),Echarts 图表配置。不同图表类型具有不同数据格式。具体请参考 ECharts 文档。 + +**js_dependencies** + +列表类型(list),js 依赖文件名称列表,元素不包含文件后缀(.js),如 `{'echarts.min', 'fujian'}` 。 + +> 从v0.4开始,pyecharts 重写了 `js_dependencies` 的生成逻辑,目前返回的是有序、元素唯一的列表对象。另外还可以通过 `pyecharts.utils.merge_js_dependencies` 函数合并若干个图表的 js 依赖文件。 + +### 方法 + +**add()** + +添加图表配置和数据。具体请参考其子类定义。 + +| 图表类 | 函数签名 | +| -------- | ---------------------------------------- | +| Base | `add(**echarts_options)` | +| Grid | `add(grid_width=None, grid_height=None, grid_top=None, grid_bottom=None,grid_left=None, grid_right=None)` | +| Overlap | `add(chart, xaix_index=0, yaix_index=0, id_add_xaxis=False, is_add_yaxis=False)` | +| Timeline | `add(chart, time_point)` | +| Page | `add(achart_or_charts)` | + +**get_js_dependencies()** + +获取 js 依赖文件列表。和 属性 *js_dependencies* 不同, 这里的元素是包含了文件完整路径。 + +**render(path='render.html', template_name='simple_chart.html', object_name='chart', extra_context=None)** + +渲染至指定的 HTML 页面,不同图表类型使用默认的模板文件。各参数意义如下: + +- path :最终生成文件名称 +- template_name: 模板文件名称,其目录可通过 `pyecharts.configure()` 全局函数进行配置 +- object_name: 模板文件中,该图表类所使用变量的名称 +- extra_context 额外数据字典。 + +**render_embed()** + +渲染包含选项的 js 代码。 + +**print_echarts_options** + +打印全部 options 属性。 + +**show_config()** + +打印全部 options 属性。自 v0.3.3 起。已废弃,应当使用 `print_echarts_options` 。 + + +## 多图表 + +`pyecharts.custom.page.Page` 用于在同一页面显示多个图表,也拥有上述的属性和方法。 + +同时 `Page` 类继承自 `list` ,因此也支持长度计算(len)、迭代(iter)、索引(index)、切片(slice)、添加(append)、扩展(extend)等操作。 + +例子:按顺序打印 page 中每个图表的 echarts 选项字典。 + +```python +page = Page() +line = Line('Demo Line') +# ... Add data to line +page.add(line) +kline = KLine('Demo kline') +# ... Add data to kline +page.append(kline) + +for chart in page: + chart.show_config() +``` + +## 数据处理工具 + +以下几个方法为数据处理的类方法, + +**cast** + +`pyecharts.base.Base.cast(seq)` + +数据格式化处理函数,能够将源数据转化为符合 pyecharts 的数据。 + +例子: + +```python +o_data = [('A', '34'), ('B', '45'), ('C', '12')] +x, y = Base.cast(o_data) +print(x) # ['A', 'B', 'C'] +print(y) # ['34', '45', '12'] +``` + +**json_dumps** + +`pyecharts.utils.json_dumps(data, indent=0)` + +将 data 转换为 JSON 字符串,和默认的 `json.dumps` 方法增加了: + +- 将日期和时间转化为 ISO8601 字符串 +- 对于 numpy 数组,增加了类型强制转化,可参考 [astype](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.astype.html) 和 [tolist](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.tolist.html) . + + +## 模板引擎 + +### 概述 + +pyecharts库使用 [Jinja2](http://jinja.pocoo.org/) 作为其默认模板渲染引擎,并添加了若干个 echarts 图表相关的模板函数。 + +> 模板函数和模板标签是同一特性的不同术语,在 Django 模板系统中称为标签,Jinja2 模板系统中称之为函数。二者语法形式也有所不同。 + +### 引擎对象 + +`pyecharts.engine` 定义了若干个继承自 `jinja2.Environment` 的模板引擎类,每个类都有其适合的使用场景。 + +**BaseEnvironment** + +`pyecharts.engine.BaseEnvironment` + +该类是 pyecharts 基本的模板引擎类,该类直接继承 `jinja2.Environment` ,并且: + +- 添加了 pyecharts_config 属性,这是一个 `PyEchartsConfig` 对象。 +- 添加了 `echarts_*` 等模板函数。 + +该类可用于 web 框架整合。 + +**EChartsEnvironment** + +`pyecharts.engine.EChartsEnvironment(pyecharts_config=None, **kwargs)` + +EChartsEnvironment 类继承自 `BaseEnvironment` 。并在此基础上改写了模板文件加载器(loader)的行为,默认使用 `pyecharts_config.echarts_template_dir` 作为模板文件目录。 + +由于该类重写模板文件加载器的行为,因此不应当用于 web 整合。 + +**ECHAERTS_TEMPLATE_FUNCTIONS** + +`pyecharts.engine.ECHAERTS_TEMPLATE_FUNCTIONS` + +包含模板函数的字典。可用于 web 框架整合。 + +### 模板函数 + +pyecharts 内置的引擎提供了一些模板函数,这些函数通常接收一个或多个的 `Chart` 或 `Page` 的参数,详细的调用形式见下表。 + +| 标签/调用形式 | F(chart) | F(page) | F(chart1,chart2,...)/F(*page) | +| ----------------------------- | -------- | ------- | ----------------------------- | +| echarts_js_dependencies | ✓ | ✓ | ✓ | +| echarts_js_dependencies_embed | ✓ | ✓ | ✓ | +| echarts_container | ✓ | | | +| echarts_js_content | ✓ | ✓ | ✓ | +| echarts_js_content_wrap | ✓ | ✓ | ✓ | + + +**echarts_js_dependencies** + + `pyecharts.template.echarts_js_dependencies(*args)` + +渲染包含图表所需要的 js 文件的 script 一个或多个节点,有内部嵌入或者外部链接两种结果。 + +内嵌模式 + + ```html + + ``` + +外链模式 + +```html + +``` + +最终采用何种模板依据 PyEchartsConfig.jshost 和 PyEchartsConfig.force_js_embed 配置项决定的,具体可参考下表: + +| 取值 | 本地/远程 | script 模式 | 使用场景 | 备注 | +| ---------------------------------------- | ----- | ---------------------- | ------------- | ------------------ | +| `/template/js/echarts` | 本地 | 内嵌 | 本地生成单一文件,直接移植 | 此为默认是设置 | +| `'https://pyecharts.github.io/jupyter-echarts/echarts'` | 远程 | 内嵌 | 生成单一文件 | 使用 `online` 可切换到此项 | +| 其他本地模式 (如 `/static/js`) | 本地 | 外链,可以通过force_embed改成内嵌 | 可用于web框架整合 | | +| 其他远程模式(如 `hthttps://cdn.bootcss.com/echarts/3.7.2`) | 远程 | 外链 | 使用外部js,需依赖网络 | | + + +例子 + +``` +# Jinja2 Context function +{{ echarts_js_dependencies('echarts') }} +# Html Output + + +# Python +bar = Bar('Demo Bar') +# Jinja2 Context function +{{ echarts_js_dependencies(bar) }} +# Html Output + +``` + +**echarts_js_dependencies_embed** + +`pyecharts.template.echarts.js_dependencies_embed(*args)` + +渲染 js 的 script 一个或多个节点,采用内嵌方式引入。仅支持本地 jshost 。 + +**echarts_container** + +`pyecharts.template.echarts_container(chart)` + +渲染图表容器,为一个 `
` 元素。 + +例子 + +``` +# Python Code +bar = Bar('Demo Bar') +# Jinjia2 Context Function +{{ echarts_container(bar) }} +# Html Output +
+``` + +**echarts_js_content** + +`pyecharts.template.echarts_container(*chart)` + +渲染js初始化代码片段,不包含 `` 。 + +**echarts_js_content_wrap** + +`pyecharts.template.echarts_js_content_wrap(*args)` + +渲染js初始化代码片段,包含首尾的 `` 。 + + +### 完整的例子 + +使用模板函数和自定义模板的例子。 + +demo.py +```python +from __future__ import unicode_literals + +from pyecharts import Bar +from pyecharts.conf import PyEchartsConfig +from pyecharts.engine import EchartsEnvironment +from pyecharts.utils import write_utf8_html_file + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +bar = Bar("柱状图数据堆叠示例") +bar.add("商家A", attr, v1, is_stack=True) +bar.add("商家B", attr, v2, is_stack=True) +config = PyEchartsConfig(echarts_template_dir='my_tpl', + jshost='https://cdn.bootcss.com/echarts/3.6.2') +env = EchartsEnvironment(pyecharts_config=config) +tpl = env.get_template('tpl_demo.html') +html = tpl.render(bar=bar) +write_utf8_html_file('my_tpl_demo2.html', html) + +``` + +tpl_demo.html 模板 + +```html + + + + + 自定义模板 + {{ echarts_js_dependencies(bar) }} + + + {{ echarts_container(bar) }} + {{ echarts_js_content(bar) }} + + +``` diff --git a/docs/zh-cn/changelog.md b/docs/zh-cn/changelog.md new file mode 100644 index 000000000..633f82c78 --- /dev/null +++ b/docs/zh-cn/changelog.md @@ -0,0 +1,325 @@ +# 版本日志 + +* ### version 0.4.2 + * TODO + +* ### version 0.4.1 - 2018.03.13(Current) + + #### Fixed + * [issue#437](https://github.com/pyecharts/pyecharts/issues/437) 修复 Timeline 图累计多个 Bar 图会导致条形宽度压缩的 bug + * [issue#437](https://github.com/pyecharts/pyecharts/issues/437) 修复 Timeline 图不能正常显示 Tooltip 组件的 bug + +* ### version 0.4.0 - 2018.03.09 + + #### Added + * `EchartsEnvironment` 类性增 `render_chart_to_file` + * [issue#425](https://github.com/pyecharts/pyecharts/issues/425) 新增 `pieces` 配置项,为 visualMap 组件提供自定义分段标签的功能 + * 新增 `tooltip_border_width`, `tooltip_border_color`, `tooltip_background_color` 三个参数用与提示框背景颜色及边框的配置 + * [issue#376](https://github.com/pyecharts/pyecharts/issues/376) 新增 `mark_line_coords` 配置项用于指定标记线的起点和终点 + * [issue#431](https://github.com/pyecharts/pyecharts/issues/431) pyecharts.Chart 图表类新增 renderer 参数,用于指定渲染方式,支持 canvas / svg 两种方式 + + #### Updated + * 更新 jupyter-echarts 至 1.4.0: echarts 3.6.2 -> 4.0.4, echarts-gl 1.0.0-b4 -> 1.1.0, echarts-liquidfill 1.0.5 -> 2.0.0, echarts-wordcloud 1.1.0 -> 1.1.2 + * 优化内部渲染逻辑,提高渲染效率。 + + #### Fixed + * 修正 width / height 在 Jupyter Notebook 渲染错误的 Bug + * [issue#432](https://github.com/pyecharts/pyecharts/issues/432) 修复水球图和词云图不能指定 Toolbox 等选项的 Bug + +* ### version 0.3.3 - 2018.03.01(Current) + + #### Added + * 防止将来的依赖包影响 v0.3.2 的功能: lml==0.0.2, jupyter-echarts-pypkg==0.0.11 + * 新增 `name_map`, [允许用户采用自己地图名称](http://echarts.baidu.com/option.html#series-map.nameMap)。 + + #### Changed + * `Chart.render_embed` 返回 `jinja2.Markup` 实例 + * `Base.show_config` 重命名为 `Base.print_echarts_options` + * 移除 `EchartsEnvironment.configure_pyecharts` 方法 + +* ### version 0.3.2 - 2018.02.26 + + 从此版本开始,将不再自带地图 js 文件。有需要的开发人员,请自选安装。 + + #### Added + * 新增 `chart_id` 配置项,可设置图形 id,对应为每个图在 html 中的 div#id + * 新增 jupyter-echarts-pypkg, echarts-china-provinces-pypkg, echarts-china-cities-pypkg 和 echarts-countries-pypkg。第一个是自带安装,后三个是可选安装。 + * [issue#395](https://github.com/pyecharts/pyecharts/issues/395) 新增 `is_splitline_show` 配置项,用于控制是否显示网格线 + * 新增 AppVeyor CI,为 Windows OS 提供测试功能 + + #### Fixed + * [issue#322](https://github.com/pyecharts/pyecharts/issues/322) 修复在 timeline 中不能设置多个 legend 的 bug + * [issue#357](https://github.com/pyecharts/pyecharts/issues/357) 修复 Line 图 symbol 大小不能调整的 bug + * [issue#371](https://github.com/pyecharts/pyecharts/issues/371) 修复 Parallel 图 Line 样式失效的 bug + * [issue#378](https://github.com/pyecharts/pyecharts/issues/378) 修复 Geo 图中当多次 render 时相同 value 值会被叠加的 bug + * [issue#338](https://github.com/pyecharts/pyecharts/issues/338) 修复 timeline 中 map 的 visualmap 组件不能正常显示的 bug + + #### Updated + * 地图更新:[台湾地图补了市,县,岛](https://github.com/pyecharts/pyecharts/pull/316), [重庆地图补了开州区](https://github.com/pyecharts/pyecharts/pull/317) + * 优化图表 API,图表 js_dependencies 属性返回有序列表 + * 优化部分代码逻辑 + * [issue#377](https://github.com/pyecharts/pyecharts/issues/377) 为 Kline 提供 Candlestick 别名 + + #### Changed + * 示例移到新的代码仓库 [pyecharts-users-cases](https://github.com/pyecharts/pyecharts-users-cases) + + #### Removed + * [PR#368](https://github.com/pyecharts/pyecharts/pull/368) `pyecharts/templates/js` 被删去了。`jupyter-echarts` 不再内嵌于 pyecharts 。 + * echarts-china-cities-js 和 echarts-countries-js 不再是必选,而是可选图库。 + +* ### version 0.3.1 - 2017.12.13 + + #### Fixed + * [issue#290](https://github.com/pyecharts/pyecharts/issues/290) 紧急修复 v0.3.0 版本不能正常显示图形的严重 bug + * [issue#296](https://github.com/pyecharts/pyecharts/issues/296) 修复 Timeline 不能在 notebook 中显示的 bug + +* ### version 0.3.0 - 2017.12.11 + + #### Added + * 图表 `render` 方法增加 `template_name` 、`object_name`、`extra_context` 等参数,全面支持自定义模板 + * 新增统一配置函数 `pyecharts.configure` ,支持设置模板目录,JS 文件仓库路径。 + * [issue#252](https://github.com/pyecharts/pyecharts/issues/252) 新增 `xaxis_label_textsize`, `xaxis_label_textcolor`, `yaxis_label_textsize`, `yaxis_label_textcolor` 四个参数修改坐标轴标签的字体和颜色 + * [issue#258](https://github.com/pyecharts/pyecharts/issues/258) 新增 `mark_point_valuedim` 参数,并将 `mark_line_valuedim` 和 `mark_point_valuedim` 参数类型修改为 list。 + * [issue#260](https://github.com/pyecharts/pyecharts/issues/260) 新增 `is_toolbox_show` 参数用于控制是否显示右侧实用工具箱。 + + #### Updated + * 重写底层逻辑,支持在模板文件中使用 `echarts_*` 系列模板函数 + * js 依赖文件支持外部链接方式引入。 + * `pyecharts.custom.Page` 类实现 `list` 协议,支持迭代、索引、添加、扩展等操作。 + * 图表 width 和 height 支持 '50%' 、'78px' 等其他 css 有效长度形式。 + * 更新 jupyter-echarts 至 1.3.3: [上海地图补了崇明区](https://github.com/pyecharts/jupyter-echarts/issues/9), [西藏地图补了山南市](https://github.com/pyecharts/jupyter-echarts/issues/7) + +* ### version 0.2.7 - 2017.10.27 + + #### Added + * 新增 GeoLines(地理坐标系线图) + * [issue#230](https://github.com/pyecharts/pyecharts/issues/230) 新增工具类 `Style`,用于简化代码编写和统一风格 + + #### Changed + * [issue#232](https://github.com/pyecharts/pyecharts/issues/232) Grid, Overlap, Timeline 类初始化参数的变动 + + #### Fixed + * 修复 Geo 系列名无法正常显示的问题 + * [issue#229](https://github.com/pyecharts/pyecharts/issues/229) 修复水球图不能自定义图形的问题 + +* ### version 0.2.6 - 2017.10.14 + + #### Added + * 为 [文档](https://github.com/pyecharts/pyecharts/blob/master/docs/zh-cn/documentation.md) 新增 [使用技巧](https://github.com/pyecharts/pyecharts/blob/master/docs/zh-cn/documentation.md#使用技巧) 介绍 + * [issue#194](https://github.com/pyecharts/pyecharts/issues/194) 新增 `is_map_symbol_show` 参数,用于控制 Map 图 [红点的显示](https://www.oschina.net/question/1416804_245423) + * [issue#192](https://github.com/pyecharts/pyecharts/issues/192) 新增 `label_emphasis_pos`, `label_emphasis_textsize`, `label_emphasis_textcolor` 参数,用于解决 Geo 图 tooltip 不能只显示城市名和数值的问题 + * [issue#132](https://github.com/pyecharts/pyecharts/issues/132) 新增图形类型树图 + * [issue#181](https://github.com/pyecharts/pyecharts/issues/181) 为 Geo 图新增 `is_roam` 参数解决不能缩放和移动的问题 + * [issue#199](https://github.com/pyecharts/pyecharts/issues/199) 为 markLine 新增 `mark_line_symbolsize` 和 `mark_line_valuedim` 参数,解决不能指定维度以及标记大小不能调整的问题 + * [issue#200](https://github.com/pyecharts/pyecharts/issues/200) 为 xyAxis 通用配置项新增 `is_xaxis_show` 和 `is_yaxis_show` 参数,(控制是否显示 x 轴或 y 轴)解决设计可编辑文本的问题 + * [issue#201](https://github.com/pyecharts/pyecharts/issues/201) 为 Bar 图新增 `bar_category_gap` 参数,提供绘制直方图的方案 + * [issue#208](https://github.com/pyecharts/pyecharts/issues/208) 为 dataZoom 通用配置项 `datazoom_type` 新增类型 'both'(同时拥有 'slider' 以及 'inside') + * [issue#208](https://github.com/pyecharts/pyecharts/issues/208) 为 HeatMap 图新增 **日历热力图** + + #### Changed + * 将 label 通用配置项的 `is_emphasis` 参数更改为 `is_label_emphasis` + * show_config() 修改用 JSON 显示 + + #### Fixed + * [issue#195](https://github.com/pyecharts/pyecharts/issues/195) 修复 HeatMap 图配置 x、y 轴属性无效的问题 + +* ### version 0.2.5 - 2017.9.28 + + #### Added + * [issue#173](https://github.com/pyecharts/pyecharts/issues/173) 为 xyAxis 通用配置项新增 `is_xaxis_boundarygap` 和 `is_yaxis_boundartgap` 参数 + * [issue#22](https://github.com/pyecharts/pyecharts/issues/22) 为散点图新增 `extra_data` 参数,可以为数据新增除 x y 轴外的其他维度 + * 为 markPoint 新增自定义标记点功能 + * 为 visualMap 新增 `visual_dimension` 参数,可以指定 visualmap 映射到哪个数据维度 + * 为 Map 图新增 [212个国家和地区](https://github.com/pyecharts/echarts-countries-js#featuring-citiesor-for-single-download) + * 部分解决 Overlap 和 Grid 不能一起使用的问题(当 Overlap 为多 x 轴或多 y 轴的时候坐标轴索引仍会出现问题) + +* ### version 0.2.4 - 2017.9.8 + + #### Added + * [issue#148](https://github.com/pyecharts/pyecharts/issues/148) 为 Radar.config() 新增 `legend_text_size` 参数 + * [issue#148](https://github.com/pyecharts/pyecharts/issues/148) 为 Legend 通用配置项新增 `legend_text_color` 和 `legend_text_font` 参数 + * [issue#156](https://github.com/pyecharts/pyecharts/issues/156) 为 xyAxis 通用配置项新增 `xaxis_force_interval` 和 `yaxis_force_interval` 参数 + * 为 Visualmap 通用配置项新增 `is_piecewise` 和 `visual_split_number` 参数 + * [issue#160](https://github.com/pyecharts/pyecharts/issues/160) 为 Base 类新增 `page_title` 参数,初始化类实例的时候可指定生成的 html 文件 `` 标签的值。自定义类 Grid/Overlap/Timeline/Page 以第一个添加的实例的 `page_title` 参数为准。 + * [issue#165](https://github.com/pyecharts/pyecharts/issues/165) 为 Radar 图新增 `label` 通用配置项,现可以展示 `label` 文字标签,但是建议在数据量少的时候使用(比如数据量为 1 的时候) + + #### Changed + * 压缩 js 文件体积,总体体积减少约 0.3MB + + #### Fixed + * [issue#158](https://github.com/pyecharts/pyecharts/issues/158) 修复 Grid/Timeline/Overlap 在 Page 中不能正常使用的 bug + +* ### version 0.2.3 - 2017.9.1 + + #### Fixed + * [issue#143](https://github.com/pyecharts/pyecharts/issues/143) [issue#146](https://github.com/pyecharts/pyecharts/issues/146) 修复默认状态下 Graph 不显示连线的 bug + * [issue#145](https://github.com/pyecharts/pyecharts/issues/145) 修复 dataZoom 无法正常使用的 bug + +* ### version 0.2.2 - 2017.8.31 + #### Added + * Map 图和 Geo 图增加 [363个二线城市地图](https://github.com/pyecharts/echarts-china-cities-js#featuring-citiesor-for-single-download) + * Map 图新增 label 模块,现可以利用标签显示地区名称 + * Geo 图新增 3000+ 城市地区经纬度信息,现已基本覆盖全国各个地区 + * Geo 图新增 `geo_cities_coords` 参数,用户可以为自己所选地图提供地区经纬度坐标(这将会覆盖原来预存的城市坐标信息),即完全按照用户提供的坐标来定位。 + * 新增图形种类 ThemeRiver(主题河流图) + * 新增 `is_more_utils` 参数,在 `add()` 中设置该标志位为 True 则会提供更多的实用工具按钮(建议在 Line, Kilne, Bar 等直角坐标图形中设置)。默认只提供『数据视图』和『下载』按钮。 + * [issue#138](https://github.com/pyecharts/pyecharts/issues/138) 新增 `is_xaxis_inverse`, `is_yaxis_inverse`, `xaxis_pos`, `yaxis_pos` 参数,提供倒映直角坐标系功能 + * [issue#140](https://github.com/pyecharts/pyecharts/issues/140) 为每种图形(包括 Overlap, Grid, Timeline)都提供 Public 的 `options` 属性,返回实例的 `self._option` + + #### Fixed + * [issue#133](https://github.com/pyecharts/pyecharts/issues/133) 回退 Echarts 版本,从 v3.7.0 回退至原先的 v3.6.2,解决标签不能正常显示的 bug + +* ### version 0.2.1 - 2017.8.25 + + #### Added + * [issue#127](https://github.com/pyecharts/pyecharts/issues/127) 新增数据图切换按钮(只针对部分图有效) + + #### Fixed + * [issue#130](https://github.com/pyecharts/pyecharts/issues/130) 更改 freeze_js,更正文件路径表示方法 + * 修复直角坐标系的标签显示问题 + + +* ### version 0.2.0 - 2017.8.25 + + #### Added + * [issue#118](https://github.com/pyecharts/pyecharts/issues/118) 新增 `datazoom_xaxis_index`, `datazoom_yaxis_index`,可使 datazoom 组件同时控制多个 x y 轴。 + * 新增 jupyter-notebook 中的 js host 参数,用户可自行决定使用本地后者网络 js 文件,确保转移 notebook 时图形可正常显示 + * 新增图形种类 Boxplot(箱形图) + * [issue#120](https://github.com/pyecharts/pyecharts/issues/120) 新增图形种类 Sankey(桑基图) + + #### Changed + * 更新 Flask&Django 模板,加载文件的体积大大减小,出图速度更快。 + * 更新 echarts 到 3.7.0 + + #### Fixed + * 修复 Page 类于其他自定义类共用出现问题的 bug + + +* ### version 0.1.9.7 - 2017.8.20 + + #### Fixed + * [issue#113](https://github.com/pyecharts/pyecharts/issues/113) 修复 requirements.txt 中 jupyter-pip 版本过旧问题 + * [issue#109](https://github.com/pyecharts/pyecharts/issues/109) 修复地图不能正常显示的问题 + + +* ### version 0.1.9.6 - 2017.8.19 + + #### Added + * [issue#95](https://github.com/pyecharts/pyecharts/issues/95) Overlap 类中新增 `xaxis_index`, `is_add_xaxis`, `yaxis_index`, `is_add_yaxis` 参数,现支持多 Y 轴或多 X 轴 + * Page 类现在也支持在 jupyter-notebook 中显示了,直接调用 Page() 实例即可。 + * Graph 图中新增 `graph_edge_symbol`, `graph_edge_symbolsize` 参数 + * [issue#94](https://github.com/pyecharts/pyecharts/issues/94) 提供 pyecharts-snapshot 用于将生成的图片保存为 png 或 pdf 文件,仅静态图片生效。(3D 图和动态图不生效) + * [issue#98](https://github.com/pyecharts/pyecharts/issues/98) 通用配置项中新增 tooltip 模块 + + #### Changed + * jupyter-notebook 和本地 render() 现在均采用动态加入 js 依赖文件的方法,生成文件体积大大缩小。 + * 更改通用配置项中的 label 的参数 `formatter` 为 `label_formatter` + * 更改 `clockwise` 参数为 `is_clockwise` + * 更改 Graph 图中的 `repulsion`, `gravity`, `edge_length`, `layout` 参数为 `graph_repulsion`, `graph_gravity`, `graph_edge_length`, `graph_layout` + + +* ### version 0.1.9.5 - 2017.8.16 + + #### Added + * 为 xyAxis 模块新增下列参数 + `xaxis_interval`, `xaxis_name_size`, `xaxis_name_gap`, `xaxis_margin`, `is_xaxislabel_align` + `yaxis_interval`, `yaxis_name_size`, `yaxis_name_gap`, `yaxis_margin`, `is_yaxislabel_align` + * [issue#86](https://github.com/pyecharts/pyecharts/issues/86) 为 3D 图新增参数用于配置坐标轴选项(参见通用配置项中的 axis3D) + * 修改自定义模块的接口,现自定义模块有以下 4 个类,具体用法参见文档 + * Grid 类:并行显示多张图 + * Overlap 类:结合不同类型图表叠加画在同张图上 + * Page 类:同一网页按顺序展示多图 + * Timeline 类:提供时间线轮播多张图 + * 新增 Timeline 功能,支持轮播多张图表 + + #### Changed + * jupyter notebook 现在也为离线模式,从本地加载项目所需 js 文件。至此 pyecharts 彻底实现本地化运行。速度更快,不再受网速影响。 + + #### Removed + * 删除冗余 js 文件,压缩项目体积。 + * 废弃 xAxis,yAxis 中的 `interval`, `xy_font_size`, `namegap` 参数。 + + +* ### version 0.1.9.4 - 2017.8.10 + + #### Added + * [issue#76](https://github.com/pyecharts/pyecharts/issues/76) 新增 Page 类,现能同时在一个 html 页面内按顺序展示多个图形。(参见用户自定义) + + #### Changed + * 更改 Image 依赖模块为 pillow + + +* ### version 0.1.9.3 - 2017.8.10 + + #### Added + * [issue#72](https://github.com/pyecharts/pyecharts/issues/72) [issue#41](https://github.com/pyecharts/pyecharts/issues/41) 新增 `xaxis_type`, `yaxis_type` 参数,可通过设置该参数指定直角坐标系数轴类型。(参见 Line,Scattre 图) + * [issue#09](https://github.com/pyecharts/pyecharts/issues/9) 集成 Flask + Django + + #### Removed + * 废弃 `npcast()`, `pdcast()` 方法,新版本已经在内部封装了处理逻辑,具体参见文档的 pandas&numpy 示例 + + +* ### version 0.1.9.2 - 2017.8.6 + + #### Added + * [issue#52](https://github.com/pyecharts/pyecharts/issues/52) 新增 `xaxis_rotate`, `yaxis_rotate` 参数,可通过设置该参数解决强制显示所有坐标轴标签时因过于密集重叠的问题。参见(Bar 图) + * 新增 `xaxis_min`, `xaxis_max`. `yaxis_min`, `yaxis_max` 参数,可设置坐标轴上的最大最小值,针对数值轴有效。 + + #### Changed + * [issue#67](https://github.com/pyecharts/pyecharts/issues/67) `render()` 方法现在为离线模式,实现本地生成 .html 文件,加载速度更快。 + + #### Fixed + * [issue#61](https://github.com/pyecharts/pyecharts/issues/61) 解决 3D 图形不能在 jupyter notebook 上正常显示的问题。 + + #### Removed + * 废弃 `render_notebook()` 方法,现可直接调用图形实例显示在 jupyter notebook 上。 + + +* ### version 0.1.9.1 - 2017.7.31 + + #### Added + * 加入 Travis-CI 自动化测试。 + * [issue#46](https://github.com/pyecharts/pyecharts/issues/46) legend 增加 `legend_selectedmode` 参数,图例可以设置为单例或者多例。(参见 Radar 图) + * visualmap 组件增加 `visual_type` 和 `visual_range_size` 参数。现在支持映射到颜色和图形大小两种方式。(参见 Scatter 图) + + +* ### version 0.1.9 - 2017.7.30 + + #### Added + * [issue#28](https://github.com/pyecharts/pyecharts/issues/28) datazoom 中增加了将组件效果显示在 y 坐标轴中的功能。(参见 KLine 图) + * 新增对 Pandas 和 Numpy 数据的简单处理。解决直接传入 Pandas 和 Numpy 数据类型出错的问题。(参见开始使用) + * 新增 Bar3D, Line3D, Scatter3D 三种 3D 立体图。 + + #### Fixed + * [issue#34](https://github.com/pyecharts/pyecharts/issues/34) 解决在 macos 下安装出错的问题。 + + +* ### version 0.1.8 - 2017.7.28 + + #### Added + * [issue#05](https://github.com/pyecharts/pyecharts/issues/5) 新增在 Jupyter Notebook 中展示图表功能。感谢 [@ygw365](https://github.com/ygw365) 提供这部分的代码模板 和 [@muxuezi](https://github.com/muxuezi) 协助对代码进行改进! + * 新增对自定义地图的使用说明 + + +* ### version 0.1.7 - 2017.7.26 + + #### Added + * 增加并行显示图表功能 + + +* ### version 0.1.6 - 2017.7.24 + + #### Added + * 新增了热力图 + + +* ### version 0.1.5 - 2017.7.22 + + #### Added + * 新增了 K 线图 + + +* ### version 0.1.4 - 2017.7.20 + + #### Added + * 第一个稳定版本 diff --git a/docs/zh-cn/charts.md b/docs/zh-cn/charts.md new file mode 100644 index 000000000..b2faf8dad --- /dev/null +++ b/docs/zh-cn/charts.md @@ -0,0 +1,3666 @@ +> 图表篇:本篇文档为 pyecharts 的主要配置文档,介绍了关于 pyecharts 的详细配置项。 + +* 图形初始化 +* 通用配置项 + * xyAxis:直角坐标系中的 x、y 轴(Line、Bar、Scatter、EffectScatter、Kline) + * dataZoom:dataZoom 组件 用于区域缩放,从而能自由关注细节的数据信息,或者概览数据整体,或者去除离群点的影响。(Line、Bar、Scatter、EffectScatter、Kline、Boxplot) + * legend:图例组件。图例组件展现了不同系列的标记(symbol),颜色和名字。可以通过点击图例控制哪些系列不显示。 + * label:图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。 + * lineStyle:带线图形的线的风格选项(Line、Polar、Radar、Graph、Parallel) + * grid3D:3D笛卡尔坐标系组配置项,适用于 3D 图形。(Bar3D, Line3D, Scatter3D) + * axis3D:3D 笛卡尔坐标系 X,Y,Z 轴配置项,适用于 3D 图形。(Bar3D, Line3D, Scatter3D) + * visualMap:是视觉映射组件,用于进行『视觉编码』,也就是将数据映射到视觉元素(视觉通道) + * markLine&markPoint:图形标记组件,用于标记指定的特殊数据,有标记线和标记点两种。(Bar、Line、Kline) + * tooltip:提示框组件,用于移动或点击鼠标时弹出数据内容 + * toolbox:右侧实用工具箱 +* 图表详细 + * Bar(柱状图/条形图) + * Bar3D(3D 柱状图) + * Boxplot(箱形图) + * EffectScatter(带有涟漪特效动画的散点图) + * Funnel(漏斗图) + * Gauge(仪表盘) + * Geo(地理坐标系) + * GeoLines(地理坐标系线图) + * Graph(关系图) + * HeatMap(热力图) + * Kline/Candlestick(K线图) + * Line(折线/面积图) + * Line3D(3D 折线图) + * Liquid(水球图) + * Map(地图) + * Parallel(平行坐标系) + * Pie(饼图) + * Polar(极坐标系) + * Radar(雷达图) + * Sankey(桑基图) + * Scatter(散点图) + * Scatter3D(3D 散点图) + * ThemeRiver(主题河流图) + * TreeMap(树图) + * WordCloud(词云图) +* 用户自定义 + * Grid 类:并行显示多张图 + * Overlap 类:结合不同类型图表叠加画在同张图上 + * Page 类:同一网页按顺序展示多图 + * Timeline 类:提供时间线轮播多张图 +* 统一风格 +* 关于项目 + + +# 图形初始化 +图表类初始化所接受的参数(所有类型的图表都一样)。 + +* title -> str + 主标题文本,支持 \n 换行,默认为 "" +* subtitle -> str + 副标题文本,支持 \n 换行,默认为 "" +* width -> int + 画布宽度,默认为 800(px) +* height -> int + 画布高度,默认为 400(px) +* title_pos -> str/int + 标题距离左侧距离,默认为'left',有'auto', 'left', 'right', 'center'可选,也可为百分比或整数 +* title_top -> str/int + 标题距离顶部距离,默认为'top',有'top', 'middle', 'bottom'可选,也可为百分比或整数 +* title_color -> str + 主标题文本颜色,默认为 '#000' +* subtitle_color -> str + 副标题文本颜色,默认为 '#aaa' +* title_text_size -> int + 主标题文本字体大小,默认为 18 +* subtitle_text_size -> int + 副标题文本字体大小,默认为 12 +* background_color -> str + 画布背景颜色,默认为 '#fff' +* page_title -> str + 指定生成的 html 文件中 `<title>` 标签的值。默认为'Echarts' +* renderer -> str + 指定使用渲染方式,有 'svg' 和 'canvas' 可选,默认为 'canvas'。3D 图仅能使用 'canvas'。 + + +# 通用配置项 +**通用配置项均在 ```add()``` 中设置** + +**xyAxis:直角坐标系中的 x、y 轴(Line、Bar、Scatter、EffectScatter、Kline)** + +* is_convert -> bool + 是否交换 x 轴与 y 轴 +* is_xaxislabel_align -> bool + x 轴刻度线和标签是否对齐,默认为 False +* is_yaxislabel_align -> bool + y 轴刻度线和标签是否对齐,默认为 False +* is_xaxis_inverse -> bool + 是否反向 x 坐标轴,默认为 False +* is_yaxis_inverse -> bool + 是否反向 y 坐标轴,默认为 False +* is_xaxis_boundarygap -> bool + x 轴两边留白策略,适用于类目轴。类目轴中 boundaryGap 可以配置为 True 和 False。默认为 True,这时候刻度只是作为分隔线,标签和数据点都会在两个刻度之间的带(band)中间,即两边留白。 +* is_yaxis_boundarygap -> bool + y 轴两边留白策略,适用于类目轴。类目轴中 boundaryGap 可以配置为 True 和 False。默认为 True,这时候刻度只是作为分隔线,标签和数据点都会在两个刻度之间的带(band)中间,即两边留白。 +* is_xaxis_show -> bool + 是否显示 x 轴 +* is_yaxis_show -> bool + 是否显示 y 轴 +* is_splitline_show -> bool + 是否显示 y 轴网格线,默认为 True。 +* x_axis -> list + x 轴数据项 +* xaxis_interval -> int + x 轴刻度标签的显示间隔,在类目轴中有效。默认会采用标签不重叠的策略间隔显示标签。 + 设置成 0 强制显示所有标签。设置为 1,表示『隔一个标签显示一个标签』,如果值为 2,表示隔两个标签显示一个标签,以此类推 +* xaxis_force_interval -> int/str + 强制设置 x 坐标轴分割间隔。如设置为 50 则刻度为 [0, 50, 150, ...],设置为 "auto" 则只显示两个刻度。一般情况下不建议设置这个参数!! + 因为 splitNumber 是预估的值,实际根据策略计算出来的刻度可能无法达到想要的效果,这时候可以使用 interval 配合 min、max 强制设定刻度划分。在类目轴中无效。 +* xaxis_margin -> int + x 轴刻度标签与轴线之间的距离。默认为 8 +* xaxis_name -> str + x 轴名称 +* xaxis_name_size -> int + x 轴名称体大小,默认为 14 +* xaxis_name_gap -> int + x 轴名称与轴线之间的距离,默认为 25 +* xaxis_name_pos -> str + x 轴名称位置,有'start','middle','end'可选 +* xaxis_min -> int/float + x 坐标轴刻度最小值,默认为自适应。使用特殊值 "dataMin" 可自定以数据中最小值为 x 轴最小值。 +* xaxis_max -> int/float + x 坐标轴刻度最大值,默认为自适应。使用特殊值 "dataMax" 可自定以数据中最小值为 x 轴最大值。 +* xaxis_pos -> str + x 坐标轴位置,有'top','bottom'可选 +* xaxis_label_textsize -> int + x 坐标轴标签字体大小,默认为 12 +* xaxis_label_textcolor -> str + x 坐标轴标签字体颜色,默认为 "#000" +* xaxis_type -> str + x 坐标轴类型 + * 'value':数值轴,适用于连续数据。 + * 'category':类目轴,适用于离散的类目数据。 + * 'log':对数轴。适用于对数数据。 +* xaxis_rotate -> int + x 轴刻度标签旋转的角度,在类目轴的类目标签显示不下的时候可以通过旋转防止标签之间重叠。默认为 0,即不旋转。旋转的角度从 -90 度到 90 度。 +* y_axis -> list + y 坐标轴数据 +* yaxis_interval -> int + y 轴刻度标签的显示间隔,在类目轴中有效。默认会采用标签不重叠的策略间隔显示标签。 + 设置成 0 强制显示所有标签。设置为 1,表示『隔一个标签显示一个标签』,如果值为 2,表示隔两个标签显示一个标签,以此类推 +* yaxis_force_interval -> int/str + 强制设置 y 坐标轴分割间隔。如设置为 50 则刻度为 [0, 50, 150, ...],设置为 "auto" 则只显示两个刻度。一般情况下不建议设置这个参数!! + 因为 splitNumber 是预估的值,实际根据策略计算出来的刻度可能无法达到想要的效果,这时候可以使用 interval 配合 min、max 强制设定刻度划分。在类目轴中无效。 +* yaxis_margin -> int + y 轴刻度标签与轴线之间的距离。默认为 8 +* yaxis_formatter -> str + y 轴标签格式器,如 '天',则 y 轴的标签为数据加'天'(3 天,4 天),默认为 "" +* yaxis_name -> str + y 轴名称 +* yaxis_name_size -> int + y 轴名称体大小,默认为 14 +* yaxis_name_gap -> int + y 轴名称与轴线之间的距离,默认为 25 +* yaxis_name_pos -> str + y 轴名称位置,有'start', 'middle','end'可选 +* yaxis_min -> int/float + y 坐标轴刻度最小值,默认为自适应。使用特殊值 "dataMin" 可自定以数据中最小值为 y 轴最小值。 +* yaxis_max -> int/float + y 坐标轴刻度最大值,默认为自适应。使用特殊值 "dataMax" 可自定以数据中最大值为 y 轴最大值。 +* yaxis_pos -> str + y 坐标轴位置,有'left','right'可选 +* yaxis_label_textsize -> int + y 坐标轴标签字体大小,默认为 12 +* yaxis_label_textcolor -> str + y 坐标轴标签字体颜色,默认为 "#000" +* yaxis_type -> str + y 坐标轴类型 + * 'value':数值轴,适用于连续数据。 + * 'category':类目轴,适用于离散的类目数据。 + * 'log':对数轴。适用于对数数据。 +* yaxis_rotate -> int + y 轴刻度标签旋转的角度,在类目轴的类目标签显示不下的时候可以通过旋转防止标签之间重叠。默认为 0,即不旋转。旋转的角度从 -90 度到 90 度。 + + +**dataZoom:dataZoom 组件 用于区域缩放,从而能自由关注细节的数据信息,或者概览数据整体,或者去除离群点的影响。(Line、Bar、Scatter、EffectScatter、Kline)** + +* is_datazoom_show -> bool + 是否使用区域缩放组件,默认为 False +* datazoom_type -> str + 区域缩放组件类型,默认为'slider',有'slider', 'inside', 'both'可选 +* datazoom_range -> list + 区域缩放的范围,默认为[50, 100] +* datazoom_orient -> str + datazoom 组件在直角坐标系中的方向,默认为 'horizontal',效果显示在 x 轴。如若设置为 'vertical' 的话效果显示在 y 轴。 +* datazoom_xaxis_index -> int/list + datazoom 组件控制的 x 轴索引 + 默认控制第一个 x 轴,如没特殊需求无须显示指定。单个为 int 类型而控制多个为 list 类型,如 [0, 1] 表示控制第一个和第二个 x 轴。 +* datazoom_yaxis_index -> int/list + datazoom 组件控制的 y 轴索引 + 默认控制第一个 y 轴,如没特殊需求无须显示指定。单个为 int 类型而控制多个为 list 类型,如 [0, 1] 表示控制第一个和第二个 x 轴。 + + +**legend:图例组件。图例组件展现了不同系列的标记(symbol),颜色和名字。可以通过点击图例控制哪些系列不显示。** + +* is_legend_show -> bool + 是否显示顶端图例,默认为 True +* legend_orient -> str + 图例列表的布局朝向,默认为'horizontal',有'horizontal', 'vertical'可选 +* legend_pos -> str + 图例组件离容器左侧的距离,默认为'center',有'left', 'center', 'right'可选,也可以为百分数,如"%60" +* legend_top -> str + 图例组件离容器上侧的距离,默认为'top',有'top', 'center', 'bottom'可选,也可以为百分数,如"%60" +* legend_selectedmode -> str/bool + 图例选择的模式,控制是否可以通过点击图例改变系列的显示状态。默认为'multiple',可以设成 'single' 或者 'multiple' 使用单选或者多选模式。也可以设置为 False 关闭显示状态。 +* legend_text_size -> int + 图例名称字体大小 +* legend_text_color -> str + 图例名称字体颜色 + + +**label:图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。** + +* is_label_show -> bool + 是否正常显示标签,默认不显示。标签即各点的数据项信息 +* is_label_emphasis -> bool + 是否高亮显示标签,默认显示。高亮标签即选中数据时显示的信息项。 +* label_pos -> str + 标签的位置,Bar 图默认为'top'。有'top', 'left', 'right', 'bottom', 'inside','outside'可选 +* label_emphasis_pos -> str + 高亮标签的位置,Bar 图默认为'top'。有'top', 'left', 'right', 'bottom', 'inside','outside'可选 +* label_text_color -> str + 标签字体颜色,默认为 "#000" +* label_emphasis_textcolor -> str + 高亮标签字体颜色,默认为 "#fff" +* label_text_size -> int + 标签字体大小,默认为 12 +* label_emphasis_textsize -> int + 高亮标签字体大小,默认为 12 +* is_random -> bool + 是否随机排列颜色列表,默认为 False +* label_color -> list + 自定义标签颜色。全局颜色列表,所有图表的图例颜色均在这里修改。如 Bar 的柱状颜色,Line 的线条颜色等等。 +* label_formatter -> str + 模板变量有 {a}, {b},{c},{d},{e},分别表示系列名,数据名,数据值等。使用示例,如 `label_formatter='{a}'` + 在 trigger 为 'axis' 的时候,会有多个系列的数据,此时可以通过 {a0}, {a1}, {a2} 这种后面加索引的方式表示系列的索引。不同图表类型下的 {a},{b},{c},{d} 含义不一样。 其中变量 {a}, {b}, {c}, {d} 在不同图表类型下代表数据含义为: + * 折线(区域)图、柱状(条形)图、K线图 : {a}(系列名称),{b}(类目值),{c}(数值), {d}(无) + * 散点图(气泡)图 : {a}(系列名称),{b}(数据名称),{c}(数值数组), {d}(无) + * 地图 : {a}(系列名称),{b}(区域名称),{c}(合并数值), {d}(无) + * 饼图、仪表盘、漏斗图: {a}(系列名称),{b}(数据项名称),{c}(数值), {d}(百分比) + +**Note:** is_random 可随机打乱图例颜色列表,算是切换风格?建议试一试! + + +**lineStyle:带线图形的线的风格选项(Line、Polar、Radar、Graph、Parallel)** + +* line_width -> int + 线的宽度,默认为 1 +* line_opacity -> float + 线的透明度,0 为完全透明,1 为完全不透明。默认为 1 +* line_curve -> float + 线的弯曲程度,0 为完全不弯曲,1 为最弯曲。默认为 0 +* line_type -> str + 线的类型,有'solid', 'dashed', 'dotted'可选。默认为'solid' +* line_color -> str + 线的颜色 + + +**grid3D:3D 笛卡尔坐标系组配置项,适用于 3D 图形。(Bar3D, Line3D, Scatter3D)** + +* grid3d_width -> int + 三维笛卡尔坐标系组件在三维场景中的高度。默认为 100 +* grid3d_height -> int + 三维笛卡尔坐标系组件在三维场景中的高度。默认为 100 +* grid3d_depth -> int + 三维笛卡尔坐标系组件在三维场景中的高度。默认为 100 +* is_grid3d_rotate -> bool + 是否开启视角绕物体的自动旋转查看。默认为 False +* grid3d_rotate_speed -> int + 物体自传的速度。单位为角度 / 秒,默认为 10 ,也就是 36 秒转一圈。 +* grid3d_rotate_sensitivity -> int + 旋转操作的灵敏度,值越大越灵敏。默认为 1, 设置为 0 后无法旋转。 + + +**axis3D:3D 笛卡尔坐标系 X,Y,Z 轴配置项,适用于 3D 图形。(Bar3D, Line3D, Scatter3D)** + +**3D X 轴** + +* xaxis3d_name -> str + x 轴名称,默认为 "" +* xaxis3d_name_size -> int + x 轴名称体大小,默认为 16 +* xaxis3d_name_gap -> int + x 轴名称与轴线之间的距离,默认为 25 +* xaxis3d_min -> int/float + x 坐标轴刻度最小值,默认为自适应。 +* xaxis3d_max -> int/float + x 坐标轴刻度最大值,默认为自适应。 +* xaxis3d_interval -> int + x 轴刻度标签的显示间隔,在类目轴中有效。默认会采用标签不重叠的策略间隔显示标签。 + 设置成 0 强制显示所有标签。设置为 1,表示『隔一个标签显示一个标签』,如果值为 2,表示隔两个标签显示一个标签,以此类推 +* xaxis3d_margin -> int + x 轴刻度标签与轴线之间的距离。默认为 8 + +**3D Y 轴** + +* yaxis3d_name -> str + y 轴名称,默认为 "" +* yaxis3d_name_size -> int + y 轴名称体大小,默认为 16 +* yaxis3d_name_gap -> int + y 轴名称与轴线之间的距离,默认为 25 +* yaxis3d_min -> int/float + y 坐标轴刻度最小值,默认为自适应。 +* yaxis3d_max -> int/float + y 坐标轴刻度最大值,默认为自适应。 +* yaxis3d_interval -> int + y 轴刻度标签的显示间隔,在类目轴中有效。默认会采用标签不重叠的策略间隔显示标签。 + 设置成 0 强制显示所有标签。设置为 1,表示『隔一个标签显示一个标签』,如果值为 2,表示隔两个标签显示一个标签,以此类推 +* yaxis3d_margin -> int + y 轴刻度标签与轴线之间的距离。默认为 8 + +**3D Z 轴** + +* zaxis3d_name -> str + z 轴名称,默认为 "" +* zaxis3d_name_size -> int + z 轴名称体大小,默认为 16 +* zaxis3d_name_gap -> int + z 轴名称与轴线之间的距离,默认为 25 +* zaxis3d_min -> int/float + z 坐标轴刻度最小值,默认为自适应。 +* zaxis3d_max -> int/float + z 坐标轴刻度最大值,默认为自适应。 +* zaxis3d_margin -> int + z 轴刻度标签与轴线之间的距离。默认为 8 + + +**visualMap:是视觉映射组件,用于进行『视觉编码』,也就是将数据映射到视觉元素(视觉通道)** + +* is_visualmap -> bool + 是否使用视觉映射组件 +* visual_type -> str + 制定组件映射方式,默认为'color‘,即通过颜色来映射数值。有'color', 'size'可选。'size'通过数值点的大小,也就是图形点的大小来映射数值。 +* visual_range -> list + 指定组件的允许的最小值与最大值。默认为 [0, 100] +* visual_text_color -> list + 两端文本颜色。 +* visual_range_text -> list + 两端文本。默认为 ['low', 'hight'] +* visual_range_color -> list + 过渡颜色。默认为 ['#50a3ba', '#eac763', '#d94e5d'] +* visual_range_size -> list + 数值映射的范围,也就是图形点大小的范围。默认为 [20, 50] +* visual_orient -> str + visualMap 组件条的方向,默认为'vertical',有'vertical', 'horizontal'可选。 +* visual_pos -> str/int + visualmap 组件条距离左侧的位置,默认为'left'。有'right', 'center', 'right'可选,也可为百分数或整数。 +* visual_top -> str/int + visualmap 组件条距离顶部的位置,默认为'top'。有'top', 'center', 'bottom'可选,也可为百分数或整数。 +* visual_split_number -> int + 分段型中分割的段数,在设置为分段型时生效。默认分为 5 段。 +* visual_dimension -> int + 指定用数据的『哪个维度』,映射到视觉元素上。默认映射到最后一个维度。索引从 0 开始。 + 在直角坐标系中,x 轴为第一个维度(0),y 轴为第二个维度(1)。 +* is_calculable -> bool + 是否显示拖拽用的手柄(手柄能拖拽调整选中范围)。默认为 True +* is_piecewise -> bool + 是否将组件转换为分段型(默认为连续型),默认为 False +* pieces -> list + 自定义『分段式视觉映射组件(visualMapPiecewise)』的每一段的范围, + 以及每一段的文字,以及每一段的特别的样式。(仅在 is_piecewise 为 True 时生效)例如: + ``` + pieces: [ + {min: 1500}, // 不指定 max,表示 max 为无限大(Infinity)。 + {min: 900, max: 1500}, + {min: 310, max: 1000}, + {min: 200, max: 300}, + {min: 10, max: 200, label: '10 到 200(自定义label)'}, + // 表示 value 等于 123 的情况。 + {value: 123, label: '123(自定义特殊颜色)', color: 'grey'} + {max: 5} // 不指定 min,表示 min 为无限大(-Infinity)。 + ] + ``` + + +**tooltip:提示框组件,用于移动或点击鼠标时弹出数据内容** + +* tooltip_tragger -> str + 触发类型。默认为 'item' + * 'item': 数据项图形触发,主要在散点图,饼图等无类目轴的图表中使用。 + * 'axis': 坐标轴触发,主要在柱状图,折线图等会使用类目轴的图表中使用。 + * 'none': 什么都不触发。 +* tooltip_tragger_on -> str + 提示框触发的条件。默认为 "mousemove|click" + * 'mousemove': 鼠标移动时触发。 + * 'click': 鼠标点击时触发。 + * 'mousemove|click': 同时鼠标移动和点击时触发。 + * 'none': 不在 'mousemove' 或 'click' 时触发 +* tooltip_axispointer_type -> str + 指示器类型。默认为 "line" + * 'line': 直线指示器 + * 'shadow': 阴影指示器 + * 'cross': 十字准星指示器。其实是种简写,表示启用两个正交的轴的 axisPointer。 +* tooltip_formatter -> str + 模板变量有 {a}, {b},{c},{d},{e},分别表示系列名,数据名,数据值等。 + 在 trigger 为 'axis' 的时候,会有多个系列的数据,此时可以通过 {a0}, {a1}, {a2} 这种后面加索引的方式表示系列的索引。不同图表类型下的 {a},{b},{c},{d} 含义不一样。 其中变量 {a}, {b}, {c}, {d} 在不同图表类型下代表数据含义为: + * 折线(区域)图、柱状(条形)图、K线图 : {a}(系列名称),{b}(类目值),{c}(数值), {d}(无) + * 散点图(气泡)图 : {a}(系列名称),{b}(数据名称),{c}(数值数组), {d}(无) + * 地图 : {a}(系列名称),{b}(区域名称),{c}(合并数值), {d}(无) + * 饼图、仪表盘、漏斗图: {a}(系列名称),{b}(数据项名称),{c}(数值), {d}(百分比) +* tooltip_text_color -> str + 提示框字体颜色,默认为 '#fff' +* tooltip_font_size -> int + 提示框字体大小,默认为 14 +* tooltip_background_color -> str + 提示框浮层的背景颜色。默认为 "rgba(50,50,50,0.7)" +* tooltip_border_color -> str + 提示框浮层的边框颜色。默认为 "#333" +* tooltip_border_width -> int/float + 提示框浮层的边框宽。默认为 0 + + +**markLine&markPoint:图形标记组件,用于标记指定的特殊数据,有标记线和标记点两种(Bar、Line、Kline)** + +* mark_point -> list + 标记点,默认有'min', 'max', 'average'可选。支持自定义标记点,具体使用如下 + [{"coord": [a1, b1], "name": "first markpoint"}, {"coord": [a2, b2], "name": "second markpoint"}] + 需自己传入标记点字典,共有两个键值对,'coord' 对应为 x y 轴坐标, 'name' 为标记点名称 +* mark_point_symbol -> str + 标记点图形,,默认为'pin',有'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow'可选 +* mark_point_symbolsize -> int + 标记点图形大小,默认为 50 +* mark_point_textcolor -> str + 标记点字体颜色,默认为'#fff' +* mark_line -> list + 标记线,默认有'min', 'max', 'average'可选 +* mark_line_symbolsize -> int + 标记线图形大小,默认为 15 +* mark_line_valuedim -> list + 标记线指定在哪个维度上指定最大值最小值。这可以是维度的直接名称,Line 时可以是 x、angle 等、Kline 图时可以是 open、close、highest、lowest。 + 可同时制定多个维度,如: + mark_line=['min', 'max'], mark_line_valuedim=['lowest', 'highest'] 则表示 min 使用 lowest 维度,max 使用 highest 维度,以此类推 +* mark_line_coords -> [list], 包含列表的列表 + 标记线指定起点坐标和终点坐标,如 [[10, 10], [30, 30]],两个点分别为横纵坐标轴点。 +* mark_point_valuedim -> list + 标记线指定在哪个维度上指定最大值最小值。这可以是维度的直接名称,Line 时可以是 x、angle 等、Kline 图时可以是 open、close、highest、lowest。 + 可同时制定多个维度,如: + mark_point=['min', 'max'], mark_point_valuedim=['lowest', 'highest'] 则表示 min 使用 lowest 维度,max 使用 highest 维度,以此类推 + + +**toolbox:右侧实用工具箱** + +* is_toolbox_show -> bool + 指定是否显示右侧实用工具箱,默认为 True。 +* is_more_utils -> bool + 指定是否提供更多的实用工具按钮。默认只提供『数据视图』和『下载』按钮 + + +# 图表详细 + + +## Bar(柱状图/条形图) +> 柱状/条形图,通过柱形的高度/条形的宽度来表现数据的大小。 + +Bar.add() 方法签名 +```python +add(name, x_axis, y_axis, + is_stack=False, + bar_category_gap='20%', **kwargs) +``` +* name -> str + 图例名称 +* x_axis -> list + x 坐标轴数据 +* y_axis -> list + y 坐标轴数据 +* is_stack -> bool + 数据堆叠,同个类目轴上系列配置相同的 stack 值可以堆叠放置 +* bar_category_gap -> int/str + 类目轴的柱状距离,当设置为 0 时柱状是紧挨着(直方图类型),默认为 '20%' + +```python +from pyecharts import Bar + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +bar = Bar("柱状图数据堆叠示例") +bar.add("商家A", attr, v1, is_stack=True) +bar.add("商家B", attr, v2, is_stack=True) +bar.render() +``` +![bar-0](https://user-images.githubusercontent.com/19553554/35081597-0c3e7212-fc50-11e7-8f72-af6c552223e8.gif) +**Note:** 全局配置项要在最后一个 ```add()``` 上设置,否侧设置会被冲刷掉。 + +```python +from pyecharts import Bar + +bar = Bar("标记线和标记点示例") +bar.add("商家A", attr, v1, mark_point=["average"]) +bar.add("商家B", attr, v2, mark_line=["min", "max"]) +bar.render() +``` +![bar-1](https://user-images.githubusercontent.com/19553554/35081600-0ea23f0c-fc50-11e7-894b-65ad0f611a01.gif) + +```python +from pyecharts import Bar + +bar = Bar("x 轴和 y 轴交换") +bar.add("商家A", attr, v1) +bar.add("商家B", attr, v2, is_convert=True) +bar.render() +``` +![bar-2](https://user-images.githubusercontent.com/19553554/35081605-151472ce-fc50-11e7-8627-66929309b08c.png) + +dataZoom 效果,'slider' 类型 +```python +import random + +attr = ["{}天".format(i) for i in range(30)] +v1 = [random.randint(1, 30) for _ in range(30)] +bar = Bar("Bar - datazoom - slider 示例") +bar.add("", attr, v1, is_label_show=True, is_datazoom_show=True) +bar.render() +``` +![bar-4](https://user-images.githubusercontent.com/19553554/35081742-ddcbf3e0-fc50-11e7-937e-f806fd12c83e.gif) + +dataZoom 效果,'inside' 类型 +```python +attr = ["{}天".format(i) for i in range(30)] +v1 = [random.randint(1, 30) for _ in range(30)] +bar = Bar("Bar - datazoom - inside 示例") +bar.add("", attr, v1, is_datazoom_show=True, datazoom_type='inside', + datazoom_range=[10, 25]) +bar.render() +``` +![bar-5](https://user-images.githubusercontent.com/19553554/35081801-307b3d26-fc51-11e7-8ac7-eea2f2422402.gif) + +dataZoom 效果,'both' 类型 +```python +attr = ["{}天".format(i) for i in range(30)] +v1 = [random.randint(1, 30) for _ in range(30)] +bar = Bar("Bar - datazoom - inside 示例") +bar.add("", attr, v1, is_datazoom_show=True, datazoom_type='both', + datazoom_range=[10, 25]) +bar.render() +``` +![bar-8](https://user-images.githubusercontent.com/19553554/35081813-37fc4072-fc51-11e7-9b5c-a3ca2f0d1fef.gif) + + +**Note:** datazoom 适合所有平面直角坐标系图形,也就是(Line、Bar、Scatter、EffectScatter、Kline) + +当 x 轴或者 y 轴的标签因为过于密集而导致全部显示出来会重叠的话,可采用使标签旋转的方法。 +```python +attr = ["{}天".format(i) for i in range(20)] +v1 = [random.randint(1, 20) for _ in range(20)] +bar = Bar("坐标轴标签旋转示例") +bar.add("", attr, v1, xaxis_interval=0, xaxis_rotate=30, yaxis_rotate=30) +bar.render() +``` +![bar-6](https://user-images.githubusercontent.com/19553554/35081805-3258a2be-fc51-11e7-9cb1-d99c1a707bc5.png) + +**Note:** 可通过设置 xaxis_min/xaxis_max/yaxis_min/yaxis_max 来调整 x 轴和 y 轴上的最大最小值。针对数值轴有效! +**Note:** 可以通过 label_color 来设置柱状的颜色,如 ['#eee', '#000'],所有的图表类型的图例颜色都可通过 label_color 来修改。 + +瀑布图示例 +```python +from pyecharts import Bar + +attr = ["{}月".format(i) for i in range(1, 8)] +v1 = [0, 100, 200, 300, 400, 220, 250] +v2 = [1000, 800, 600, 500, 450, 400, 300] +bar = Bar("瀑布图示例") +# 利用第一个 add() 图例的颜色为透明,即 'rgba(0,0,0,0)',并且设置 is_stack 标志为 True +bar.add("", attr, v1, label_color=['rgba(0,0,0,0)'], is_stack=True) +bar.add("月份", attr, v2, is_label_show=True, is_stack=True, label_pos='inside') +bar.render() +``` +![bar-7](https://user-images.githubusercontent.com/19553554/35081807-34a5568e-fc51-11e7-8199-3c3f8f43ba98.png) + +直方图示例 +```python +from pyecharts import Bar + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +bar = Bar("直方图示例") +bar.add("", attr * 2, v1 + v2, bar_category_gap=0) +bar.render() +``` +![bar-9](https://user-images.githubusercontent.com/19553554/35081820-3c6f2ad4-fc51-11e7-8600-9212e7e8b519.png) + +某地的降水量和蒸发量柱状图 +```python +from pyecharts import Bar + +attr = ["{}月".format(i) for i in range(1, 13)] +v1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3] +v2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3] +bar = Bar("柱状图示例") +bar.add("蒸发量", attr, v1, mark_line=["average"], mark_point=["max", "min"]) +bar.add("降水量", attr, v2, mark_line=["average"], mark_point=["max", "min"]) +bar.render() +``` +![bar-10](https://user-images.githubusercontent.com/19553554/35081822-3e090748-fc51-11e7-8bba-b775d29671e4.png) + +## Bar3D(3D 柱状图) + +Bar3D.add() 方法签名 +```python +add(name, x_axis, y_axis, data, + grid3d_opacity=1, + grid3d_shading='color', **kwargs) +``` +* name -> str + 图例名称 +* x_axis -> str + x 坐标轴数据。需为类目轴,也就是不能是数值。 +* y_axis -> str + y 坐标轴数据。需为类目轴,也就是不能是数值。 +* data -> [list], 包含列表的列表 + 数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』 +* grid3d_opacity -> int + 3D 笛卡尔坐标系组的透明度(柱状的透明度),默认为 1,完全不透明。 +* grid3d_shading -> str + 三维柱状图中三维图形的着色效果。 + * color:只显示颜色,不受光照等其它因素的影响。 + * lambert:通过经典的 lambert 着色表现光照带来的明暗。 + * realistic:真实感渲染,配合 light.ambientCubemap 和 postEffect 使用可以让展示的画面效果和质感有质的提升。ECharts GL 中使用了基于物理的渲染(PBR) 来表现真实感材质。 + +```python +from pyecharts import Bar3D + +bar3d = Bar3D("3D 柱状图示例", width=1200, height=600) +x_axis = [ + "12a", "1a", "2a", "3a", "4a", "5a", "6a", "7a", "8a", "9a", "10a", "11a", + "12p", "1p", "2p", "3p", "4p", "5p", "6p", "7p", "8p", "9p", "10p", "11p"] +y_axis = [ + "Saturday", "Friday", "Thursday", "Wednesday", "Tuesday", "Monday", "Sunday"] +data = [ + [0, 0, 5], [0, 1, 1], [0, 2, 0], [0, 3, 0], [0, 4, 0], [0, 5, 0], + [0, 6, 0], [0, 7, 0], [0, 8, 0], [0, 9, 0], [0, 10, 0], [0, 11, 2], + [0, 12, 4], [0, 13, 1], [0, 14, 1], [0, 15, 3], [0, 16, 4], [0, 17, 6], + [0, 18, 4], [0, 19, 4], [0, 20, 3], [0, 21, 3], [0, 22, 2], [0, 23, 5], + [1, 0, 7], [1, 1, 0], [1, 2, 0], [1, 3, 0], [1, 4, 0], [1, 5, 0], + [1, 6, 0], [1, 7, 0], [1, 8, 0], [1, 9, 0], [1, 10, 5], [1, 11, 2], + [1, 12, 2], [1, 13, 6], [1, 14, 9], [1, 15, 11], [1, 16, 6], [1, 17, 7], + [1, 18, 8], [1, 19, 12], [1, 20, 5], [1, 21, 5], [1, 22, 7], [1, 23, 2], + [2, 0, 1], [2, 1, 1], [2, 2, 0], [2, 3, 0], [2, 4, 0], [2, 5, 0], + [2, 6, 0], [2, 7, 0], [2, 8, 0], [2, 9, 0], [2, 10, 3], [2, 11, 2], + [2, 12, 1], [2, 13, 9], [2, 14, 8], [2, 15, 10], [2, 16, 6], [2, 17, 5], + [2, 18, 5], [2, 19, 5], [2, 20, 7], [2, 21, 4], [2, 22, 2], [2, 23, 4], + [3, 0, 7], [3, 1, 3], [3, 2, 0], [3, 3, 0], [3, 4, 0], [3, 5, 0], + [3, 6, 0], [3, 7, 0], [3, 8, 1], [3, 9, 0], [3, 10, 5], [3, 11, 4], + [3, 12, 7], [3, 13, 14], [3, 14, 13], [3, 15, 12], [3, 16, 9], [3, 17, 5], + [3, 18, 5], [3, 19, 10], [3, 20, 6], [3, 21, 4], [3, 22, 4], [3, 23, 1], + [4, 0, 1], [4, 1, 3], [4, 2, 0], [4, 3, 0], [4, 4, 0], [4, 5, 1], + [4, 6, 0], [4, 7, 0], [4, 8, 0], [4, 9, 2], [4, 10, 4], [4, 11, 4], + [4, 12, 2], [4, 13, 4], [4, 14, 4], [4, 15, 14], [4, 16, 12], [4, 17, 1], + [4, 18, 8], [4, 19, 5], [4, 20, 3], [4, 21, 7], [4, 22, 3], [4, 23, 0], + [5, 0, 2], [5, 1, 1], [5, 2, 0], [5, 3, 3], [5, 4, 0], [5, 5, 0], + [5, 6, 0], [5, 7, 0], [5, 8, 2], [5, 9, 0], [5, 10, 4], [5, 11, 1], + [5, 12, 5], [5, 13, 10], [5, 14, 5], [5, 15, 7], [5, 16, 11], [5, 17, 6], + [5, 18, 0], [5, 19, 5], [5, 20, 3], [5, 21, 4], [5, 22, 2], [5, 23, 0], + [6, 0, 1], [6, 1, 0], [6, 2, 0], [6, 3, 0], [6, 4, 0], [6, 5, 0], + [6, 6, 0], [6, 7, 0], [6, 8, 0], [6, 9, 0], [6, 10, 1], [6, 11, 0], + [6, 12, 2], [6, 13, 1], [6, 14, 3], [6, 15, 4], [6, 16, 0], [6, 17, 0], + [6, 18, 0], [6, 19, 0], [6, 20, 1], [6, 21, 2], [6, 22, 2], [6, 23, 6] + ] +range_color = ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] +bar3d.add("", x_axis, y_axis, [[d[1], d[0], d[2]] for d in data], + is_visualmap=True, visual_range=[0, 20], + visual_range_color=range_color, grid3d_width=200, grid3d_depth=80) +bar3d.render() +``` +![bar3d-0](https://user-images.githubusercontent.com/19553554/35081629-36a8e046-fc50-11e7-8910-e02bf24008d9.gif) + +data 中,如 [1, 2, 3] 表示 x 轴的索引为 1,即 "1a";y 轴的索引为 2,即 "Thursday";z 轴的数值为 3 + +设置 ``` grid3d_shading``` 可以让柱状更真实 +```python +bar3d = Bar3D("3D 柱状图示例", width=1200, height=600) +bar3d.add("", x_axis, y_axis, [[d[1], d[0], d[2]] for d in data], + is_visualmap=True, visual_range=[0, 20], + visual_range_color=range_color, grid3d_width=200, + grid3d_depth=80, grid3d_shading='lambert') +bar3d.render() +``` +![bar3d-1](https://user-images.githubusercontent.com/19553554/35081631-38a0cb02-fc50-11e7-9f74-3d487bd98a3a.gif) + +设置 ```is_grid3d_rotate``` 启动自动旋转功能 +```python +bar3d = Bar3D("3D 柱状图示例", width=1200, height=600) +bar3d.add("", x_axis, y_axis, [[d[1], d[0], d[2]] for d in data], + is_visualmap=True, visual_range=[0, 20], + visual_range_color=range_color, grid3d_width=200, + grid3d_depth=80, is_grid3d_rotate=True) +bar3d.render() +``` +![bar3d-2](https://user-images.githubusercontent.com/19553554/35081703-a70b544a-fc50-11e7-838a-53445cd8d203.gif) + +设置 ``` grid3d_rotate_speed``` 调节旋转速度 +```python +bar3d = Bar3D("3D 柱状图示例", width=1200, height=600) +bar3d.add("", x_axis, y_axis, [[d[1], d[0], d[2]] for d in data], + is_visualmap=True, visual_range=[0, 20], + visual_range_color=range_color, grid3d_width=200, + grid3d_depth=80, is_grid3d_rotate=True, grid3d_rotate_speed=180) +bar3d.render() +``` +![bar3d-3](https://user-images.githubusercontent.com/19553554/35081705-a92a878c-fc50-11e7-8427-9066456db54c.gif) + +**Note:** 关于 gird3D 部分的设置,请参照 通用配置项 中的介绍 +**Note:** 可配合 axis3D 通用配置项 一起使用 + + +## Boxplot(箱形图) +> 箱形图是一种用作显示一组数据分散情况资料的统计图。它能显示出一组数据的最大值、最小值、中位数、下四分位数及上四分位数。 + +Boxplot.add() 方法签名 +```python +add(name, x_axis, y_axis, **kwargs) +``` +* name -> str + 图例名称 +* x_axis -> list + x 坐标轴数据 +* y_axis -> [list], 包含列表的列表 + y 坐标轴数据,二维数组的每一数组项(上例中的每行)是渲染一个 box,它含有五个量值,依次是: + [min, Q1, median (or Q2), Q3, max] + +可自行计算出所需五个数值,也可通过内置 `prepare_data()` 转换,`prepare_data()` 会将传入的嵌套列表中的数据转换为嵌套的 [min, Q1, median (or Q2), Q3, max],如下所示: +```python +from pyecharts import Boxplot + +boxplot = Boxplot("箱形图") +x_axis = ['expr1', 'expr2', 'expr3', 'expr4', 'expr5'] +y_axis = [ + [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, + 1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960], + [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, + 830, 790, 810, 880, 880, 830, 800, 790, 760, 800], + [880, 880, 880, 860, 720, 720, 620, 860, 970, 950, + 880, 910, 850, 870, 840, 840, 850, 840, 840, 840], + [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, + 910, 920, 890, 860, 880, 720, 840, 850, 850, 780], + [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, + 870, 870, 810, 740, 810, 940, 950, 800, 810, 870] +] +_yaxis = boxplot.prepare_data(y_axis) # 转换数据 +boxplot.add("boxplot", x_axis, _yaxis) +boxplot.render() +``` +![boxplot-0](https://user-images.githubusercontent.com/19553554/35082364-4f4e98f8-fc54-11e7-9e53-1d6a66b67e46.png) + +或者直接在 add() 中转换 +```python +from pyecharts import Boxplot + +boxplot = Boxplot("箱形图") +x_axis = ['expr1', 'expr2'] +y_axis1 = [ + [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, + 1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960], + [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, + 830, 790, 810, 880, 880, 830, 800, 790, 760, 800], +] +y_axis2 = [ + [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, + 910, 920, 890, 860, 880, 720, 840, 850, 850, 780], + [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, + 870, 870, 810, 740, 810, 940, 950, 800, 810, 870] +] +boxplot.add("category1", x_axis, boxplot.prepare_data(y_axis1)) +boxplot.add("category2", x_axis, boxplot.prepare_data(y_axis2)) +boxplot.render() +``` +![boxplot-1](https://user-images.githubusercontent.com/19553554/35082365-511fcc38-fc54-11e7-9826-d16231a401f4.png) + + +## EffectScatter(带有涟漪特效动画的散点图) +> 利用动画特效可以将某些想要突出的数据进行视觉突出。 + +EffectScatter.add() 方法签名 +```python +add(name, x_axis, y_axis, + symbol_size=10, **kwargs) +``` +* name -> str + 图例名称 +* x_axis -> list + x 坐标轴数据 +* y_axis -> list + y 坐标轴数据 +* symbol_size -> int + 标记图形大小,默认为 10 + +```python +from pyecharts import EffectScatter + +v1 = [10, 20, 30, 40, 50, 60] +v2 = [25, 20, 15, 10, 60, 33] +es = EffectScatter("动态散点图示例") +es.add("effectScatter", v1, v2) +es.render() +``` +![effectscatter-0](https://user-images.githubusercontent.com/19553554/35090528-e4c9a04c-fc74-11e7-938a-d348bb1fdbf8.gif) + +```python +es = EffectScatter("动态散点图各种图形示例") +es.add("", [10], [10], symbol_size=20, effect_scale=3.5, + effect_period=3, symbol="pin") +es.add("", [20], [20], symbol_size=12, effect_scale=4.5, + effect_period=4,symbol="rect") +es.add("", [30], [30], symbol_size=30, effect_scale=5.5, + effect_period=5,symbol="roundRect") +es.add("", [40], [40], symbol_size=10, effect_scale=6.5, + effect_brushtype='fill',symbol="diamond") +es.add("", [50], [50], symbol_size=16, effect_scale=5.5, + effect_period=3,symbol="arrow") +es.add("", [60], [60], symbol_size=6, effect_scale=2.5, + effect_period=3,symbol="triangle") +es.render() +``` +![effectscatter-1](https://user-images.githubusercontent.com/19553554/35090533-e7330076-fc74-11e7-9ba0-7cc4ff80e030.gif) + +* symbol -> str + 标记图形,有'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow'可选 +* effect_brushtype -> str + 波纹绘制方式,有'stroke', 'fill'可选。默认为'stroke' +* effect_scale -> float + 动画中波纹的最大缩放比例。默认为 2.5 +* effect_period -> float + 动画持续的时间。默认为 4(s) + + +## Funnel(漏斗图) +Funnel.add() 方法签名 +```python +add(name, attr, value, **kwargs) +``` +* name -> str + 图例名称 +* attr -> list + 属性名称 +* value -> list + 属性所对应的值 + +```python +from pyecharts import Funnel + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +value = [20, 40, 60, 80, 100, 120] +funnel = Funnel("漏斗图示例") +funnel.add("商品", attr, value, is_label_show=True, + label_pos="inside", label_text_color="#fff") +funnel.render() +``` +![funnel-0](https://user-images.githubusercontent.com/19553554/35090181-d6b0e886-fc73-11e7-8e00-dec8ac38c415.gif) + +```python +funnel = Funnel("漏斗图示例", width=600, height=400, title_pos='center') +funnel.add("商品", attr, value, is_label_show=True, label_pos="outside", + legend_orient='vertical', legend_pos='left') +funnel.render() +``` +![funnel-1](https://user-images.githubusercontent.com/19553554/35090186-d8f50db6-fc73-11e7-9b7e-947580a621de.png) + + +## Gauge(仪表盘) +Gauge.add() 方法签名 +```python +add(name, attr, value, + scale_range=None, + angle_range=None, **kwargs) +``` +* name -> str + 图例名称 +* attr -> list + 属性名称 +* value -> list + 属性所对应的值 +* scale_range -> list + 仪表盘数据范围。默认为 [0, 100] +* angle_range -> list + 仪表盘角度范围。默认为 [225, -45] + +```python +from pyecharts import Gauge + +gauge = Gauge("仪表盘示例") +gauge.add("业务指标", "完成率", 66.66) +gauge.render() +``` +![gauge-0](https://user-images.githubusercontent.com/19553554/35090190-daa33eee-fc73-11e7-9710-7844b12d3e6b.png) + +```python +gauge = Gauge("仪表盘示例") +gauge.add("业务指标", "完成率", 166.66, angle_range=[180, 0], + scale_range=[0, 200], is_legend_show=False) +gauge.render() +``` +![gauge-1](https://user-images.githubusercontent.com/19553554/35090193-dc199d22-fc73-11e7-8f4d-22477a3a22be.png) + + +## Geo(地理坐标系) +> 地理坐标系组件用于地图的绘制,支持在地理坐标系上绘制散点图,线集。 + +Geo.add() 方法签名 +```python +add(name, attr, value, + type="scatter", + maptype='china', + symbol_size=12, + border_color="#111", + geo_normal_color="#323c48", + geo_emphasis_color="#2a333d", + geo_cities_coords=None, + is_roam=True, **kwargs) +``` +* name -> str + 图例名称 +* attr -> list + 属性名称 +* value -> list + 属性所对应的值 +* type -> str + 图例类型,有'scatter', 'effectScatter', 'heatmap'可选。默认为 'scatter' +* maptype -> str + 地图类型。 支持 china、world、安徽、澳门、北京、重庆、福建、福建、甘肃、广东,广西、广州、海南、河北、黑龙江、河南、湖北、湖南、江苏、江西、吉林、辽宁、内蒙古、宁夏、青海、山东、上海、陕西、山西、四川、台湾、天津、香港、新疆、西藏、云南、浙江,以及 [363个二线城市地图](https://github.com/chfw/echarts-china-cities-js#featuring-citiesor-for-single-download)。提醒:在画市级地图的时候,城市名字后面的‘市’要省去了,比如,石家庄市的‘市’不要提,即‘石家庄’就可以了。 +* symbol_size -> int + 标记图形大小。默认为 12 +* border_color -> str + 地图边界颜色。默认为 '#111' +* geo_normal_color -> str + 正常状态下地图区域的颜色。默认为 '#323c48' +* geo_emphasis_color -> str + 高亮状态下地图区域的颜色。默认为 '#2a333d' +* geo_cities_coords -> dict + 用户自定义地区经纬度,类似如 {'阿城': [126.58, 45.32],} 这样的字典,当用于提供了该参数时,将会覆盖原有预存的区域坐标信息。 +* is_roam -> bool + 是否开启鼠标缩放和平移漫游。默认为 True + 如果只想要开启缩放或者平移,可以设置成'scale'或者'move'。设置成 True 为都开启 + +Scatter 类型(连续型) +```python +from pyecharts import Geo + +data = [ + ("海门", 9),("鄂尔多斯", 12),("招远", 12),("舟山", 12),("齐齐哈尔", 14),("盐城", 15), + ("赤峰", 16),("青岛", 18),("乳山", 18),("金昌", 19),("泉州", 21),("莱西", 21), + ("日照", 21),("胶南", 22),("南通", 23),("拉萨", 24),("云浮", 24),("梅州", 25), + ("文登", 25),("上海", 25),("攀枝花", 25),("威海", 25),("承德", 25),("厦门", 26), + ("汕尾", 26),("潮州", 26),("丹东", 27),("太仓", 27),("曲靖", 27),("烟台", 28), + ("福州", 29),("瓦房店", 30),("即墨", 30),("抚顺", 31),("玉溪", 31),("张家口", 31), + ("阳泉", 31),("莱州", 32),("湖州", 32),("汕头", 32),("昆山", 33),("宁波", 33), + ("湛江", 33),("揭阳", 34),("荣成", 34),("连云港", 35),("葫芦岛", 35),("常熟", 36), + ("东莞", 36),("河源", 36),("淮安", 36),("泰州", 36),("南宁", 37),("营口", 37), + ("惠州", 37),("江阴", 37),("蓬莱", 37),("韶关", 38),("嘉峪关", 38),("广州", 38), + ("延安", 38),("太原", 39),("清远", 39),("中山", 39),("昆明", 39),("寿光", 40), + ("盘锦", 40),("长治", 41),("深圳", 41),("珠海", 42),("宿迁", 43),("咸阳", 43), + ("铜川", 44),("平度", 44),("佛山", 44),("海口", 44),("江门", 45),("章丘", 45), + ("肇庆", 46),("大连", 47),("临汾", 47),("吴江", 47),("石嘴山", 49),("沈阳", 50), + ("苏州", 50),("茂名", 50),("嘉兴", 51),("长春", 51),("胶州", 52),("银川", 52), + ("张家港", 52),("三门峡", 53),("锦州", 54),("南昌", 54),("柳州", 54),("三亚", 54), + ("自贡", 56),("吉林", 56),("阳江", 57),("泸州", 57),("西宁", 57),("宜宾", 58), + ("呼和浩特", 58),("成都", 58),("大同", 58),("镇江", 59),("桂林", 59),("张家界", 59), + ("宜兴", 59),("北海", 60),("西安", 61),("金坛", 62),("东营", 62),("牡丹江", 63), + ("遵义", 63),("绍兴", 63),("扬州", 64),("常州", 64),("潍坊", 65),("重庆", 66), + ("台州", 67),("南京", 67),("滨州", 70),("贵阳", 71),("无锡", 71),("本溪", 71), + ("克拉玛依", 72),("渭南", 72),("马鞍山", 72),("宝鸡", 72),("焦作", 75),("句容", 75), + ("北京", 79),("徐州", 79),("衡水", 80),("包头", 80),("绵阳", 80),("乌鲁木齐", 84), + ("枣庄", 84),("杭州", 84),("淄博", 85),("鞍山", 86),("溧阳", 86),("库尔勒", 86), + ("安阳", 90),("开封", 90),("济南", 92),("德阳", 93),("温州", 95),("九江", 96), + ("邯郸", 98),("临安", 99),("兰州", 99),("沧州", 100),("临沂", 103),("南充", 104), + ("天津", 105),("富阳", 106),("泰安", 112),("诸暨", 112),("郑州", 113),("哈尔滨", 114), + ("聊城", 116),("芜湖", 117),("唐山", 119),("平顶山", 119),("邢台", 119),("德州", 120), + ("济宁", 120),("荆州", 127),("宜昌", 130),("义乌", 132),("丽水", 133),("洛阳", 134), + ("秦皇岛", 136),("株洲", 143),("石家庄", 147),("莱芜", 148),("常德", 152),("保定", 153), + ("湘潭", 154),("金华", 157),("岳阳", 169),("长沙", 175),("衢州", 177),("廊坊", 193), + ("菏泽", 194),("合肥", 229),("武汉", 273),("大庆", 279)] + +geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff", + title_pos="center", width=1200, + height=600, background_color='#404a59') +attr, value = geo.cast(data) +geo.add("", attr, value, visual_range=[0, 200], visual_text_color="#fff", + symbol_size=15, is_visualmap=True) +geo.render() +``` +![geo-0](https://user-images.githubusercontent.com/19553554/35089650-7f06172e-fc72-11e7-9d4b-14437fb0d8fe.gif) + +**Note:** 请配合 通用配置项 中的 Visualmap 使用 + +Scatter 类型(分段型) +```python +geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff", + title_pos="center", width=1200, + height=600, background_color='#404a59') +attr, value = geo.cast(data) +geo.add("", attr, value, visual_range=[0, 200], visual_text_color="#fff", + symbol_size=15, is_visualmap=True, is_piecewise=True, visual_split_number=6) +geo.render() +``` +![geo-0-0](https://user-images.githubusercontent.com/19553554/35089651-80d259a0-fc72-11e7-8af9-d96df53c0d49.gif) + +HeatMap 类型 +```python +geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff", + title_pos="center", width=1200, + height=600, background_color='#404a59') +attr, value = geo.cast(data) +geo.add("", attr, value, type="heatmap", is_visualmap=True, visual_range=[0, 300], + visual_text_color='#fff') +geo.render() +``` +![geo-0-1](https://user-images.githubusercontent.com/19553554/35089653-82498f88-fc72-11e7-9811-2aceccd4ed68.gif) + +EffectScatter 类型(全国) +```python +from pyecharts import Geo + +data = [ + ("海门", 9), ("鄂尔多斯", 12), ("招远", 12), + ("舟山", 12), ("齐齐哈尔", 14), ("盐城", 15) + ] +geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff", + title_pos="center", width=1200, + height=600, background_color='#404a59') +attr, value = geo.cast(data) +geo.add("", attr, value, type="effectScatter", is_random=True, effect_scale=5) +geo.render() +``` +![geo-1](https://user-images.githubusercontent.com/19553554/35089655-844c8902-fc72-11e7-8d1b-a0920ad5baa8.gif) + +EffectScatter 类型(广东) +```python +from pyecharts import Geo + +data =[ + ('汕头市', 50), ('汕尾市', 60), ('揭阳市', 35), + ('阳江市', 44), ('肇庆市', 72) + ] +geo = Geo("广东城市空气质量", "data from pm2.5", title_color="#fff", + title_pos="center", width=1200, + height=600, background_color='#404a59') +attr, value = geo.cast(data) +geo.add("", attr, value, maptype='广东', type="effectScatter", + is_random=True, effect_scale=5, is_legend_show=False) +geo.render() +``` +![geo-2](https://user-images.githubusercontent.com/19553554/35089657-85d0b7bc-fc72-11e7-8b3d-8127dbe8f780.gif) + + +## GeoLines(地理坐标系线图) +> 用于带有起点和终点信息的线数据的绘制,主要用于地图上的航线,路线的可视化。 + +GeoLines.add() 方法签名 +```python +add(name, data, + maptype='china', + symbol=None, + symbol_size=12, + border_color="#111", + geo_normal_color="#323c48", + geo_emphasis_color="#2a333d", + geo_cities_coords=None, + geo_effect_period=6, + geo_effect_traillength=0, + geo_effect_color='#fff', + geo_effect_symbol='circle', + geo_effect_symbolsize=5, + is_geo_effect_show=True, + is_roam=True, **kwargs) +``` +* name -> str + 图例名称 +* data -> [list], 包含列表的列表 + 数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』。每一行包含两个数据, 如 ["广州", "北京"],则指定从广州到北京。 +* maptype -> str + 地图类型。 支持 china、world、安徽、澳门、北京、重庆、福建、福建、甘肃、广东,广西、广州、海南、河北、黑龙江、河南、湖北、湖南、江苏、江西、吉林、辽宁、内蒙古、宁夏、青海、山东、上海、陕西、山西、四川、台湾、天津、香港、新疆、西藏、云南、浙江,以及 [363个二线城市地图](https://github.com/chfw/echarts-china-cities-js#featuring-citiesor-for-single-download)。提醒:在画市级地图的时候,城市名字后面的‘市’要省去了,比如,石家庄市的‘市’不要提,即‘石家庄’就可以了。 +* symbol -> str + 线两端的标记类型,可以是一个数组分别指定两端,也可以是单个统一指定。 +* symbol_size -> int + 线两端的标记大小,可以是一个数组分别指定两端,也可以是单个统一指定。 +* border_color -> str + 地图边界颜色。默认为 '#111' +* geo_normal_color -> str + 正常状态下地图区域的颜色。默认为 '#323c48' +* geo_emphasis_color -> str + 高亮状态下地图区域的颜色。默认为 '#2a333d' +* geo_cities_coords -> dict + 用户自定义地区经纬度,类似如 {'阿城': [126.58, 45.32],} 这样的字典,当用于提供了该参数时,将会覆盖原有预存的区域坐标信息。 +* geo_effect_period -> int/float + 特效动画的时间,单位为 s,默认为 6s +* geo_effect_traillength -> float + 特效尾迹的长度。取从 0 到 1 的值,数值越大尾迹越长。默认为 0 +* geo_effect_color -> str + 特效标记的颜色。默认为 '#fff' +* geo_effect_symbol -> str + 特效图形的标记。有 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'plane' 可选。 +* geo_effect_symbolsize -> int/list + 特效标记的大小,可以设置成诸如 10 这样单一的数字,也可以用数组分开表示高和宽,例如 [20, 10] 表示标记宽为 20,高为 10。 +* is_geo_effect_show -> bool + 是否显示特效。 +* is_roam -> bool + 是否开启鼠标缩放和平移漫游。默认为 True + 如果只想要开启缩放或者平移,可以设置成'scale'或者'move'。设置成 True 为都开启 + +默认效果 +```python +from pyecharts import GeoLines, Style + +style = Style( + title_top="#fff", + title_pos = "center", + width=1200, + height=600, + background_color="#404a59" +) + +data_guangzhou = [ + ["广州", "上海"], + ["广州", "北京"], + ["广州", "南京"], + ["广州", "重庆"], + ["广州", "兰州"], + ["广州", "杭州"] +] +geolines = GeoLines("GeoLines 示例", **style.init_style) +geolines.add("从广州出发", data_guangzhou, is_legend_show=False) +geolines.render() +``` +![geolines-0](https://user-images.githubusercontent.com/19553554/35082101-fb57aeb6-fc52-11e7-92c9-3e9a024e5749.gif) + +稍加配置 +```python +from pyecharts import GeoLines, Style + +style_geo = style.add( + is_label_show=True, + line_curve=0.2, + line_opacity=0.6, + legend_text_color="#eee", + legend_pos="right", + geo_effect_symbol="plane", + geo_effect_symbolsize=15, + label_color=['#a6c84c', '#ffa022', '#46bee9'], + label_pos="right", + label_formatter="{b}", + label_text_color="#eee", +) +geolines = GeoLines("GeoLines 示例", **style.init_style) +geolines.add("从广州出发", data_guangzhou, **style_geo) +geolines.render() + +``` +![geolines-1](https://user-images.githubusercontent.com/19553554/35082102-fd8d884a-fc52-11e7-9e40-5f94098d4493.gif) + +多例模式 +```python +from pyecharts import GeoLines, Style + +data_beijing = [ + ["北京", "上海"], + ["北京", "广州"], + ["北京", "南京"], + ["北京", "重庆"], + ["北京", "兰州"], + ["北京", "杭州"] +] +geolines = GeoLines("GeoLines 示例", **style.init_style) +geolines.add("从广州出发", data_guangzhou, **style_geo) +geolines.add("从北京出发", data_beijing, **style_geo) +geolines.render() +``` +![geolines-2](https://user-images.githubusercontent.com/19553554/35082103-ff1f2aba-fc52-11e7-97b2-edf837db113e.gif) + +单例模式,指定 `legend_selectedmode="single"` +```python +from pyecharts import GeoLines, Style + +style_geo = style.add( + is_label_show=True, + line_curve=0.2, + line_opacity=0.6, + legend_text_color="#eee", + legend_pos="right", + geo_effect_symbol="plane", + geo_effect_symbolsize=15, + label_color=['#a6c84c', '#ffa022', '#46bee9'], + label_pos="right", + label_formatter="{b}", + label_text_color="#eee", + legend_selectedmode="single", #指定单例模式 +) +geolines = GeoLines("GeoLines 示例", **style.init_style) +geolines.add("从广州出发", data_guangzhou, **style_geo) +geolines.add("从北京出发", data_beijing, **style_geo) +geolines.render() +``` +![geolines-3](https://user-images.githubusercontent.com/19553554/35082105-00885b92-fc53-11e7-8803-adc054037285.gif) + + +## Graph(关系图) +> 用于展现节点以及节点之间的关系数据。 + +Graph.add() 方法签名 +```python +add(name, nodes, links, + categories=None, + is_focusnode=True, + is_roam=True, + is_rotatelabel=False, + layout="force", + graph_edge_length=50, + graph_gravity=0.2, + graph_repulsion=50, **kwargs) +``` +* name -> str + 图例名称 +* nodes -> dict + 关系图结点,包含的数据项有 + * name:结点名称(必须有!) + * x:节点的初始 x 值 + * y:节点的初始 y 值 + * value:结点数值 + * category:结点类目 + * symbol:标记图形 + * symbolSize:标记图形大小 +* links -> dict + 结点间的关系数据,包含的数据项有 + * source:边的源节点名称的字符串,也支持使用数字表示源节点的索引(必须有!) + * target:边的目标节点名称的字符串,也支持使用数字表示源节点的索引(必须有!) + * value:边的数值,可以在力引导布局中用于映射到边的长度 +* categories -> list + 结点分类的类目,结点可以指定分类,也可以不指定。 + 如果节点有分类的话可以通过 nodes[i].category 指定每个节点的类目,类目的样式会被应用到节点样式上 +* is_focusnode -> bool + 是否在鼠标移到节点上的时候突出显示节点以及节点的边和邻接节点。默认为 True +* is_roam -> bool/str + 是否开启鼠标缩放和平移漫游。默认为 True + 如果只想要开启缩放或者平移,可以设置成'scale'或者'move'。设置成 True 为都开启 +* is_rotatelabel -> bool + 是否旋转标签,默认为 False +* graph_layout -> str + 关系图布局,默认为 'force' + * none:不采用任何布局,使用节点中必须提供的 x, y 作为节点的位置。 + * circular:采用环形布局 + * force:采用力引导布局 +* graph_edge_length -> int + 力布局下边的两个节点之间的距离,这个距离也会受 repulsion 影响。默认为 50 + 支持设置成数组表达边长的范围,此时不同大小的值会线性映射到不同的长度。值越小则长度越长 +* graph_gravity -> int + 节点受到的向中心的引力因子。该值越大节点越往中心点靠拢。默认为 0.2 +* graph_repulsion -> int + 节点之间的斥力因子。默认为 50 + 支持设置成数组表达斥力的范围,此时不同大小的值会线性映射到不同的斥力。值越大则斥力越大 +* graph_edge_symbol -> str/list + 边两端的标记类型,可以是一个数组分别指定两端,也可以是单个统一指定。默认不显示标记,常见的可以设置为箭头,如下:edgeSymbol: ['circle', 'arrow'] +* graph_edge_symbolsize -> int/list + 边两端的标记大小,可以是一个数组分别指定两端,也可以是单个统一指定。 + +```python +from pyecharts import Graph + +nodes = [{"name": "结点1", "symbolSize": 10}, + {"name": "结点2", "symbolSize": 20}, + {"name": "结点3", "symbolSize": 30}, + {"name": "结点4", "symbolSize": 40}, + {"name": "结点5", "symbolSize": 50}, + {"name": "结点6", "symbolSize": 40}, + {"name": "结点7", "symbolSize": 30}, + {"name": "结点8", "symbolSize": 20}] +links = [] +for i in nodes: + for j in nodes: + links.append({"source": i.get('name'), "target": j.get('name')}) +graph = Graph("关系图-力引导布局示例") +graph.add("", nodes, links, repulsion=8000) +graph.render() + +``` +![graph-0](https://user-images.githubusercontent.com/19553554/35082109-05240854-fc53-11e7-9e92-dd9437c55383.png) + +```python +graph = Graph("关系图-环形布局示例") +graph.add("", nodes, links, is_label_show=True, + graph_repulsion=8000, graph_layout='circular', + label_text_color=None) +graph.render() +``` +![graph-1](https://user-images.githubusercontent.com/19553554/35082112-07074726-fc53-11e7-9f28-2d3b39c5e162.png) + +```python +from pyecharts import Graph + +import json +with open("data\weibo.json", "r", encoding="utf-8") as f: + j = json.load(f) + nodes, links, categories, cont, mid, userl = j +graph = Graph("微博转发关系图", width=1200, height=600) +graph.add("", nodes, links, categories, label_pos="right", + graph_repulsion=50, is_legend_show=False, + line_curve=0.2, label_text_color=None) +graph.render() +``` +![graph-2](https://user-images.githubusercontent.com/19553554/35081908-bb313aba-fc51-11e7-8ef5-df20be445d72.gif) + +**Note:** 可配置 **lineStyle** 参数 + + +## HeatMap(热力图) +> 热力图主要通过颜色去表现数值的大小,必须要配合 visualMap 组件使用。直角坐标系上必须要使用两个类目轴。 + +HeatMap.add() 方法签名 +```python +add(*args, **kwargs) +``` +如果指定了 `is_calendar_heatmap`(使用日历热力图)为 True,则参数为 +* name -> str + 图例名称 +* data -> [list], 包含列表的列表 + 数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』 +* calendar_date_range -> str/list + 日历热力图的日期, "2016" 表示 2016 年, ["2016-5-5", "2017-5-5"] 表示 2016 年 5 月 5 日至 2017 年 5 月 5 日 +* calendar_cell_size -> list + 日历每格框的大小,可设置单值 或数组 第一个元素是宽 第二个元素是高,支持设置自适应 "auto"。默认为 ["auto", 20] + +默认为不指定,参数为 +* name -> str + 图例名称 +* x_axis -> str + x 坐标轴数据。需为类目轴,也就是不能是数值。 +* y_axis -> str + y 坐标轴数据。需为类目轴,也就是不能是数值。 +* data -> [list], 包含列表的列表 + 数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』 + +默认情况,不指定 `is_calendar_heatmap` +```python +import random +from pyecharts import HeatMap + +x_axis = [ + "12a", "1a", "2a", "3a", "4a", "5a", "6a", "7a", "8a", "9a", "10a", "11a", + "12p", "1p", "2p", "3p", "4p", "5p", "6p", "7p", "8p", "9p", "10p", "11p"] +y_axis = [ + "Saturday", "Friday", "Thursday", "Wednesday", "Tuesday", "Monday", "Sunday"] +data = [[i, j, random.randint(0, 50)] for i in range(24) for j in range(7)] +heatmap = HeatMap() +heatmap.add("热力图直角坐标系", x_axis, y_axis, data, is_visualmap=True, + visual_text_color="#000", visual_orient='horizontal') +heatmap.render() +``` +![heatmap-0](https://user-images.githubusercontent.com/19553554/35090544-f306fcb8-fc74-11e7-8b0a-0284632c3c4d.gif) + +使用日历热力图,指定 `is_calendar_heatmap` 为 True +```python +import datetime +import random +from pyecharts import HeatMap + +begin = datetime.date(2017, 1, 1) +end = datetime.date(2017, 12, 31) +data = [[str(begin + datetime.timedelta(days=i)), + random.randint(1000, 25000)] for i in range((end - begin).days + 1)] +heatmap = HeatMap("日历热力图示例", "某人 2017 年微信步数情况", width=1100) +heatmap.add("", data, is_calendar_heatmap=True, + visual_text_color='#000', visual_range_text=['', ''], + visual_range=[1000, 25000], calendar_cell_size=['auto', 30], + is_visualmap=True, calendar_date_range="2017", + visual_orient="horizontal", visual_pos="center", + visual_top="80%", is_piecewise=True) +heatmap.render() +``` +![heatmap-1](https://user-images.githubusercontent.com/19553554/35090548-f51dfe0c-fc74-11e7-8a97-012fec231b85.gif) + +**Note:** 热力图必须配合 通用配置项 中的 VisualMap 使用才有效果。 + + +## Kline/Candlestick(K线图) +> 红涨蓝跌 + +Kline.add() 方法签名 +```python +add(name, x_axis, y_axis, **kwargs) +``` +* name -> str + 图例名称 +* x_axis -> list + x 坐标轴数据 +* y_axis -> [list], 包含列表的列表 + y 坐标轴数据。数据中,每一行是一个『数据项』,每一列属于一个『维度』。 + 数据项具体为 [open, close, lowest, highest] (即:[开盘值, 收盘值, 最低值, 最高值]) + +```python +from pyecharts import Kline + +v1 = [[2320.26, 2320.26, 2287.3, 2362.94], [2300, 2291.3, 2288.26, 2308.38], + [2295.35, 2346.5, 2295.35, 2345.92], [2347.22, 2358.98, 2337.35, 2363.8], + [2360.75, 2382.48, 2347.89, 2383.76], [2383.43, 2385.42, 2371.23, 2391.82], + [2377.41, 2419.02, 2369.57, 2421.15], [2425.92, 2428.15, 2417.58, 2440.38], + [2411, 2433.13, 2403.3, 2437.42], [2432.68, 2334.48, 2427.7, 2441.73], + [2430.69, 2418.53, 2394.22, 2433.89], [2416.62, 2432.4, 2414.4, 2443.03], + [2441.91, 2421.56, 2418.43, 2444.8], [2420.26, 2382.91, 2373.53, 2427.07], + [2383.49, 2397.18, 2370.61, 2397.94], [2378.82, 2325.95, 2309.17, 2378.82], + [2322.94, 2314.16, 2308.76, 2330.88], [2320.62, 2325.82, 2315.01, 2338.78], + [2313.74, 2293.34, 2289.89, 2340.71], [2297.77, 2313.22, 2292.03, 2324.63], + [2322.32, 2365.59, 2308.92, 2366.16], [2364.54, 2359.51, 2330.86, 2369.65], + [2332.08, 2273.4, 2259.25, 2333.54], [2274.81, 2326.31, 2270.1, 2328.14], + [2333.61, 2347.18, 2321.6, 2351.44], [2340.44, 2324.29, 2304.27, 2352.02], + [2326.42, 2318.61, 2314.59, 2333.67], [2314.68, 2310.59, 2296.58, 2320.96], + [2309.16, 2286.6, 2264.83, 2333.29], [2282.17, 2263.97, 2253.25, 2286.33], + [2255.77, 2270.28, 2253.31, 2276.22]] +kline = Kline("K 线图示例") +kline.add("日K", ["2017/7/{}".format(i + 1) for i in range(31)], v1) +kline.render() +``` +![kline-0](https://user-images.githubusercontent.com/19553554/35090067-9a247694-fc73-11e7-88bb-3b0f019a5e90.png) + +Kline + dataZoom +```python +kline = Kline("K 线图示例") +kline.add("日K", ["2017/7/{}".format(i + 1) for i in range(31)], v1, + mark_point=["max"], is_datazoom_show=True) +kline.render() +``` +![kline-1](https://user-images.githubusercontent.com/19553554/35090072-9b6ca404-fc73-11e7-8abe-e5576d35c57a.gif) + +dataZoom 效果加在纵坐标轴上 +```python +kline = Kline("K 线图示例") +kline.add("日K", ["2017/7/{}".format(i + 1) for i in range(31)], v1, + mark_point=["max"], is_datazoom_show=True, + datazoom_orient='vertical') +kline.render() +``` +![kline-2](https://user-images.githubusercontent.com/19553554/35090075-9d14041e-fc73-11e7-8b89-437ee75a9296.gif) + +指定 markLine 位于开盘或者收盘上 +```python +kline = Kline("K 线图示例") +kline.add("日K", ["2017/7/{}".format(i + 1) for i in range(31)], + v1, mark_line=["max"], mark_line_symbolsize=0, + datazoom_orient='vertical', mark_line_valuedim='close') +kline.render() +``` +![kline-3](https://user-images.githubusercontent.com/19553554/35090078-9e901a44-fc73-11e7-835c-3408cc960bac.png) + +## Line(折线/面积图) +> 折线图是用折线将各个数据点标志连接起来的图表,用于展现数据的变化趋势。 + +Line.add() 方法签名 +```python +add(name, x_axis, y_axis, + is_symbol_show=True, + is_smooth=False, + is_stack=False, + is_step=False, + is_fill=False, **kwargs) +``` +* name -> str + 图例名称 +* x_axis -> list + x 坐标轴数据 +* y_axis -> list + y 坐标轴数据 +* is_symbol_show -> bool + 是否显示标记图形,默认为 True +* is_smooth -> bool + 是否平滑曲线显示,默认为 False +* is_stack -> bool + 数据堆叠,同个类目轴上系列配置相同的 stack 值可以堆叠放置。默认为 False +* is_step -> bool/str + 是否是阶梯线图。可以设置为 True 显示成阶梯线图。默认为 False + 也支持设置成'start', 'middle', 'end'分别配置在当前点,当前点与下个点的中间下个点拐弯。 +* is_fill -> bool + 是否填充曲线所绘制面积,默认为 False + +```python +from pyecharts import Line + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 10, 100] +v2 = [55, 60, 16, 20, 15, 80] +line = Line("折线图示例") +line.add("商家A", attr, v1, mark_point=["average"]) +line.add("商家B", attr, v2, is_smooth=True, mark_line=["max", "average"]) +line.render() +``` +![line-0](https://user-images.githubusercontent.com/19553554/35089953-4865fe2c-fc73-11e7-8c47-e917332d061c.gif) + +标记点其他配置 +```python +line = Line("折线图示例") +line.add("商家A", attr, v1, mark_point=["average", "max", "min"], + mark_point_symbol='diamond', mark_point_textcolor='#40ff27') +line.add("商家B", attr, v2, mark_point=["average", "max", "min"], + mark_point_symbol='arrow', mark_point_symbolsize=40) +line.render() +``` +![line-0-1](https://user-images.githubusercontent.com/19553554/35089954-49784dd8-fc73-11e7-8a5b-d9163857c4b1.png) + +```python +line = Line("折线图示例") +line.add("商家A", attr, v1, + mark_point=["average", { + "coord": ["裤子", 10], "name": "这是我想要的第一个标记点"}]) +line.add("商家B", attr, v2, is_smooth=True, + mark_point=[{ + "coord": ["袜子", 80], "name": "这是我想要的第二个标记点"}]) +line.render() +``` +![line-0-2](https://user-images.githubusercontent.com/19553554/35089957-4af28598-fc73-11e7-967b-cb6a431ed542.gif) + +```python +line = Line("折线图-数据堆叠示例") +line.add("商家A", attr, v1, is_stack=True, is_label_show=True) +line.add("商家B", attr, v2, is_stack=True, is_label_show=True) +line.render() +``` +![line-1](https://user-images.githubusercontent.com/19553554/35089965-4f880100-fc73-11e7-9861-c43bd4d4bbe1.gif) + +```python +line = Line("折线图-阶梯图示例") +line.add("商家A", attr, v1, is_step=True, is_label_show=True) +line.render() +``` +![line-2](https://user-images.githubusercontent.com/19553554/35089968-510f3304-fc73-11e7-9159-67ce6ace9fa3.png) + +```python +line = Line("折线图-面积图示例") +line.add("商家A", attr, v1, is_fill=True, line_opacity=0.2, + area_opacity=0.4, symbol=None) +line.add("商家B", attr, v2, is_fill=True, area_color='#000', + area_opacity=0.3, is_smooth=True) +line.render() +``` +![line-3](https://user-images.githubusercontent.com/19553554/35089973-53868fd8-fc73-11e7-8ff6-bfb452954267.png) + +* area_opacity -> float + 填充区域透明度 +* area_color -> str + 填充区域颜色 + +**Note:** 可配置 **lineStyle** 参数 +**Note:** 可以通过 label_color 来设置线条颜色,如 ['#eee', '#000'],所有的图表类型的图例颜色都可通过 label_color 来修改。 + +如果是对数数据,推荐使用 ```yaxis_type``` 参数来设置 y 坐标轴为对数轴 +```python +import math, random +line = Line("折线图示例") +line.add("商家A", attr, [math.log10(random.randint(1, 99999)) for _ in range(6)]) +line.add("商家B", attr, [math.log10(random.randint(1, 99999999)) for _ in range(6)], + yaxis_type="log") +line.render() +``` +![line-4](https://user-images.githubusercontent.com/19553554/35089976-5473125e-fc73-11e7-809c-adbfe6834b61.png) + +某地最低温和最高气温折线图 +```python +from pyecharts import Line + +attr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日', ] +line = Line("折线图示例") +line.add("最高气温", attr, [11, 11, 15, 13, 12, 13, 10], + mark_point=["max", "min"], mark_line=["average"]) +line.add("最低气温", attr, [1, -2, 2, 5, 3, 2, 0], + mark_point=["max", "min"], mark_line=["average"], + yaxis_formatter="°C") +line.show_config() +line.render() +``` +![line-5](https://user-images.githubusercontent.com/19553554/35089980-5649aed0-fc73-11e7-9e8f-01ed75ad7418.gif) + + +## Line3D(3D 折线图) + +Line3D.add() 方法签名 +```python +add(name, data, + grid3d_opacity=1, **kwargs) +``` +* name -> str + 图例名称 +* data -> [list], 包含列表的列表 + 数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』 +* grid3d_opacity -> int + 3D 笛卡尔坐标系组的透明度(线的透明度),默认为 1,完全不透明。 + +画个弹簧 +```python +from pyecharts import Line3D + +import math +_data = [] +for t in range(0, 25000): + _t = t / 1000 + x = (1 + 0.25 * math.cos(75 * _t)) * math.cos(_t) + y = (1 + 0.25 * math.cos(75 * _t)) * math.sin(_t) + z = _t + 2.0 * math.sin(75 * _t) + _data.append([x, y, z]) +range_color = [ + '#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] +line3d = Line3D("3D 折线图示例", width=1200, height=600) +line3d.add("", _data, is_visualmap=True, visual_range_color=range_color, + visual_range=[0, 30], grid3d_rotate_sensitivity=5) +line3d.render() +``` +![line3d-0](https://user-images.githubusercontent.com/19553554/35081902-b0bed8c6-fc51-11e7-9b3a-1d138c4eba13.gif) + +旋转弹簧 +```python +from pyecharts import Line3D + +import math +_data = [] +for t in range(0, 25000): + _t = t / 1000 + x = (1 + 0.25 * math.cos(75 * _t)) * math.cos(_t) + y = (1 + 0.25 * math.cos(75 * _t)) * math.sin(_t) + z = _t + 2.0 * math.sin(75 * _t) + _data.append([x, y, z]) +range_color = [ + '#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] +line3d = Line3D("3D 折线图示例", width=1200, height=600) +line3d.add("", _data, is_visualmap=True, visual_range_color=range_color, + visual_range=[0, 30], is_grid3d_rotate=True, + grid3d_rotate_speed=180) +line3d.render() +``` +![line3d-1](https://user-images.githubusercontent.com/19553554/35081903-b3a4eada-fc51-11e7-97b1-33f1dd6ed79e.gif) + +**Note:** 关于 gird3D 部分的设置,请参照通用配置项中的介绍 通用配置项 +**Note:** 可配合 axis3D 通用配置项 一起使用 + + +## Liquid(水球图) +> 主要用来突出数据的百分比。 + +Liquid.add() 方法签名 +```python +add(name, data, + shape='circle', + liquid_color=None, + is_liquid_animation=True, + is_liquid_outline_show=True, **kwargs) +``` +* name -> str + 图例名称 +* data -> list + 数据项 +* shape -> str + 水球外形,有'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow'可选。默认'circle'。也可以为自定义的 SVG 路径。 +* liquid_color -> list + 波浪颜色,默认的颜色列表为['#294D99', '#156ACF', '#1598ED', '#45BDFF']。 +* is_liquid_animation -> bool + 是否显示波浪动画,默认为 True。 +* is_liquid_outline_show -> bool + 是否显示边框,默认为 True。 + +```python +from pyecharts import Liquid + +liquid = Liquid("水球图示例") +liquid.add("Liquid", [0.6]) +liquid.render() +``` +![liquid-0](https://user-images.githubusercontent.com/19553554/35082172-536178a8-fc53-11e7-8c8b-1fa1312c8854.gif) + +```python +from pyecharts import Liquid + +liquid = Liquid("水球图示例") +liquid.add("Liquid", [0.6, 0.5, 0.4, 0.3], is_liquid_outline_show=False) +liquid.render() +``` +![liquid-1](https://user-images.githubusercontent.com/19553554/35082175-55337000-fc53-11e7-9e5b-24cd47288e8d.gif) + +```python +from pyecharts import Liquid + +liquid = Liquid("水球图示例") +liquid.add("Liquid", [0.6, 0.5, 0.4, 0.3], + is_liquid_animation=False, shape='diamond') +liquid.render() +``` +![liquid-2](https://user-images.githubusercontent.com/19553554/35082178-567d2db6-fc53-11e7-965a-d60e72ab6bf4.png) + +自定义 SVG 路径 +```python +from pyecharts import Liquid + +shape = ("path://M367.855,428.202c-3.674-1.385-7.452-1.966-11.146-1" + ".794c0.659-2.922,0.844-5.85,0.58-8.719 c-0.937-10.407-7." + "663-19.864-18.063-23.834c-10.697-4.043-22.298-1.168-29.9" + "02,6.403c3.015,0.026,6.074,0.594,9.035,1.728 c13.626,5." + "151,20.465,20.379,15.32,34.004c-1.905,5.02-5.177,9.115-9" + ".22,12.05c-6.951,4.992-16.19,6.536-24.777,3.271 c-13.625" + "-5.137-20.471-20.371-15.32-34.004c0.673-1.768,1.523-3.423" + ",2.526-4.992h-0.014c0,0,0,0,0,0.014 c4.386-6.853,8.145-14" + ".279,11.146-22.187c23.294-61.505-7.689-130.278-69.215-153" + ".579c-61.532-23.293-130.279,7.69-153.579,69.202 c-6.371," + "16.785-8.679,34.097-7.426,50.901c0.026,0.554,0.079,1.121," + "0.132,1.688c4.973,57.107,41.767,109.148,98.945,130.793 c58." + "162,22.008,121.303,6.529,162.839-34.465c7.103-6.893,17.826" + "-9.444,27.679-5.719c11.858,4.491,18.565,16.6,16.719,28.643 " + "c4.438-3.126,8.033-7.564,10.117-13.045C389.751,449.992," + "382.411,433.709,367.855,428.202z") +liquid = Liquid("水球图示例", width=1000, height=600) +liquid.add("Liquid", [0.6, 0.5, 0.4, 0.3], + shape=shape, is_liquid_outline_show=False) +liquid.render() +``` +![liquid-3](https://user-images.githubusercontent.com/19553554/35082181-5863dfda-fc53-11e7-9807-507ac5639638.gif) + + +## Map(地图) +> 地图主要用于地理区域数据的可视化。 + +Map.add() 方法签名 +```python +add(name, attr, value, + maptype='china', + is_roam=True, + is_map_symbol_show=True, **kwargs) +``` +* name -> str + 图例名称 +* attr -> list + 属性名称 +* value -> list + 属性所对应的值 +* maptype -> str + 地图类型。 支持 china、world、安徽、澳门、北京、重庆、福建、福建、甘肃、广东,广西、广州、海南、河北、黑龙江、河南、湖北、湖南、江苏、江西、吉林、辽宁、内蒙古、宁夏、青海、山东、上海、陕西、山西、四川、台湾、天津、香港、新疆、西藏、云南、浙江,以及 [363个二线城市地图](https://github.com/chfw/echarts-china-cities-js#featuring-citiesor-for-single-download)。提醒:在画市级地图的时候,城市名字后面的‘市’要省去了,比如,石家庄市的‘市’不要提,即‘石家庄’就可以了。地图提供了自定义模式 [用户如何自定义地图](https://github.com/chenjiandongx/pyecharts/blob/master/docs/zh-cn/user-customize-map.md) +* is_roam -> bool/str + 是否开启鼠标缩放和平移漫游。默认为 True + 如果只想要开启缩放或者平移,可以设置成'scale'或者'move'。设置成 True 为都开启 +* is_map_symbol_show -> bool + 是否显示地图标记红点,默认为 True。 +* name_map -> dict + [用自定义的地图名称](http://echarts.baidu.com/option.html#series-map.nameMap). 有些地图提供行政区号,`name_map` 可以帮助把它们转换成用户满意的地名。比如英国选区地图,伦敦选区的行政区号是 E14000639 ,把它转换成可读地名就需要这么一个字典: + ``` + name_map = {"E14000639": "Cities of London and Westminster"} + ``` + +以此类推,把英国选区所有的地名都转换一下,就需要个[更大一些的字典](https://github.com/chfw/echarts-united-kingdom-pypkg/blob/master/echarts_united_kingdom_pypkg/constants.py#L1)。 + +```python +from pyecharts import Map + +value = [155, 10, 66, 78] +attr = ["福建", "山东", "北京", "上海"] +map = Map("全国地图示例", width=1200, height=600) +map.add("", attr, value, maptype='china') +map.render() +``` +![map-0](https://user-images.githubusercontent.com/19553554/35082377-718385f0-fc54-11e7-88c2-bd1df8bf112b.gif) + +显示各区域名称 +```python +from pyecharts import Map + +value = [155, 10, 66, 78] +attr = ["福建", "山东", "北京", "上海"] +map = Map("全国地图示例", width=1200, height=600) +map.add("", attr, value, maptype='china', is_label_show=True) +map.render() +``` +![map-0-1](https://user-images.githubusercontent.com/19553554/35082379-7463a0f2-fc54-11e7-9bee-d71e8ec3acc8.png) + +```python +from pyecharts import Map + +value = [155, 10, 66, 78, 33, 80, 190, 53, 49.6] +attr = [ + "福建", "山东", "北京", "上海", "甘肃", "新疆", "河南", "广西", "西藏"] +map = Map("Map 结合 VisualMap 示例", width=1200, height=600) +map.add("", attr, value, maptype='china', is_visualmap=True, + visual_text_color='#000') +map.render() +``` +![map-1](https://user-images.githubusercontent.com/19553554/35082380-75e1b89c-fc54-11e7-8169-75884ffb67fb.gif) + +**Note:** 请配合 通用配置项 中的 Visualmap 使用 + +```python +from pyecharts import Map + +value = [20, 190, 253, 77, 65] +attr = ['汕头市', '汕尾市', '揭阳市', '阳江市', '肇庆市'] +map = Map("广东地图示例", width=1200, height=600) +map.add("", attr, value, maptype='广东', is_visualmap=True, + visual_text_color='#000') +map.render() +``` +![map-2](https://user-images.githubusercontent.com/19553554/35082381-786c8542-fc54-11e7-8886-5e4047fbeefd.gif) + +```python +value = [95.1, 23.2, 43.3, 66.4, 88.5] +attr= ["China", "Canada", "Brazil", "Russia", "United States"] +map = Map("世界地图示例", width=1200, height=600) +map.add("", attr, value, maptype="world", is_visualmap=True, + visual_text_color='#000') +map.render() +``` +![map-3](https://user-images.githubusercontent.com/19553554/35082382-7a37df3e-fc54-11e7-93e8-f9c02e465a2f.gif) + +设置 `is_map_symbol_show=False` 取消显示标记红点 +```python +value = [95.1, 23.2, 43.3, 66.4, 88.5] +attr= ["China", "Canada", "Brazil", "Russia", "United States"] +map = Map("世界地图示例", width=1200, height=600) +map.add("", attr, value, maptype="world", is_visualmap=True, + visual_text_color='#000', , is_map_symbol_show=False) +map.render() +``` +![map-4](https://user-images.githubusercontent.com/19553554/35082387-7d35893e-fc54-11e7-8482-60dc23d31836.png) + +设置 `name_map=...` 采用自己地图名称 +原版: +<div align="center"> +<img width="382" alt="screen shot 2018-02-27 at 09 24 21" src="https://user-images.githubusercontent.com/4280312/36720467-16fb0a66-1ba0-11e8-8cbd-453d8f2462d3.png"> +</div> + +用 `name_map` 改动之后: + +```python +#coding=utf-8 +from __future__ import unicode_literals + +from pyecharts import Map +from echarts_united_kingdom_pypkg import NM_WESTMINSTER_2016_UK + +value = [] +attr = [] +map = Map('United Kingdom', width=800, height=600) +map.add('', attr, value, maptype='英国选区2016', is_visualmap=True, + visual_text_color="#000", name_map=NM_WESTMINSTER_2016_UK) +map.render() +``` +<div align="center"> +<img width="449" alt="screen shot 2018-02-27 at 09 27 38" src="https://user-images.githubusercontent.com/4280312/36720626-803ff194-1ba0-11e8-998b-548afbedc18e.png"> +</div> +这个方便画图,因为很多数据和地区号直接挂钩,同时也容易做本地化。 + +设置 `pieces` 自定义 visualMap 组件标签 +```python +value = [155, 10, 66, 78] +attr = ["福建", "山东", "北京", "上海"] +map = Map("全国地图示例", width=1200, height=600) +map.add("", attr, value, maptype='china', + is_visualmap=True, is_piecewise=True, + visual_text_color="#000", + visual_range_text=["", ""], + pieces=[ + {"max": 160, "min": 70, "label": "高数值"}, + {"max": 69, "min": 0, "label": "低数值"}, + ]) +map.render() +``` +![map-5](https://user-images.githubusercontent.com/19553554/36943053-22748c70-1fbd-11e8-86dc-ac3d48f5c4e3.png) + + +## Parallel(平行坐标系) +> 平行坐标系是一种常用的可视化高维数据的图表。 + +Parallel.add() 方法签名 +```python +add(name, data, **kwargs) +``` +* name -> str + 图例名称 +* data -> [list], 包含列表的列表 + 数据项。数据中,每一行是一个『数据项』,每一列属于一个『维度』 + +Parallel.config() 方法签名 +```python +config(schema=None, c_schema=None) +``` +* schema + 默认平行坐标系的坐标轴信息,如 ["dim_name1", "dim_name2", "dim_name3"]。 +* c_schema + 用户自定义平行坐标系的坐标轴信息。 + * dim -> int + 维度索引 + * name -> str + 维度名称 + * type -> str + 维度类型,有'value', 'category'可选 + value:数值轴,适用于连续数据。 + category: 类目轴,适用于离散的类目数据。 + * min -> int + 坐标轴刻度最小值。 + * max -> int + 坐标轴刻度最大值。 + * inverse - bool + 是否是反向坐标轴。默认为 False + * nameLocation -> str + 坐标轴名称显示位置。有'start', 'middle', 'end'可选 + +```python +from pyecharts import Parallel + +schema = ["data", "AQI", "PM2.5", "PM10", "CO", "NO2"] +data = [ + [1, 91, 45, 125, 0.82, 34], + [2, 65, 27, 78, 0.86, 45,], + [3, 83, 60, 84, 1.09, 73], + [4, 109, 81, 121, 1.28, 68], + [5, 106, 77, 114, 1.07, 55], + [6, 109, 81, 121, 1.28, 68], + [7, 106, 77, 114, 1.07, 55], + [8, 89, 65, 78, 0.86, 51, 26], + [9, 53, 33, 47, 0.64, 50, 17], + [10, 80, 55, 80, 1.01, 75, 24], + [11, 117, 81, 124, 1.03, 45] +] +parallel = Parallel("平行坐标系-默认指示器") +parallel.config(schema) +parallel.add("parallel", data, is_random=True) +parallel.render() +``` +![parallel-0](https://user-images.githubusercontent.com/19553554/35090275-17c3dcde-fc74-11e7-94d6-e497668dba0c.png) + +```python +from pyecharts import Parallel + +c_schema = [ + {"dim": 0, "name": "data"}, + {"dim": 1, "name": "AQI"}, + {"dim": 2, "name": "PM2.5"}, + {"dim": 3, "name": "PM10"}, + {"dim": 4, "name": "CO"}, + {"dim": 5, "name": "NO2"}, + {"dim": 6, "name": "CO2"}, + {"dim": 7, "name": "等级", + "type": "category", + "data": ['优', '良', '轻度污染', '中度污染', '重度污染', '严重污染']} +] +data = [ + [1, 91, 45, 125, 0.82, 34, 23, "良"], + [2, 65, 27, 78, 0.86, 45, 29, "良"], + [3, 83, 60, 84, 1.09, 73, 27, "良"], + [4, 109, 81, 121, 1.28, 68, 51, "轻度污染"], + [5, 106, 77, 114, 1.07, 55, 51, "轻度污染"], + [6, 109, 81, 121, 1.28, 68, 51, "轻度污染"], + [7, 106, 77, 114, 1.07, 55, 51, "轻度污染"], + [8, 89, 65, 78, 0.86, 51, 26, "良"], + [9, 53, 33, 47, 0.64, 50, 17, "良"], + [10, 80, 55, 80, 1.01, 75, 24, "良"], + [11, 117, 81, 124, 1.03, 45, 24, "轻度污染"], + [12, 99, 71, 142, 1.1, 62, 42, "良"], + [13, 95, 69, 130, 1.28, 74, 50, "良"], + [14, 116, 87, 131, 1.47, 84, 40, "轻度污染"] +] +parallel = Parallel("平行坐标系-用户自定义指示器") +parallel.config(c_schema=c_schema) +parallel.add("parallel", data) +parallel.render() +``` +![parallel-1](https://user-images.githubusercontent.com/19553554/35090278-19ac1674-fc74-11e7-9aa1-2662296d3e22.png) + +**Note:** 可配置 **lineStyle** 参数 + + +## Pie(饼图) +> 饼图主要用于表现不同类目的数据在总和中的占比。每个的弧度表示数据数量的比例。 + +Pie.add() 方法签名 +```python +add(name, attr, value, + radius=None, + center=None, + rosetype=None, **kwargs) +``` +* name -> str + 图例名称 +* attr -> list + 属性名称 +* value -> list + 属性所对应的值 +* radius -> list + 饼图的半径,数组的第一项是内半径,第二项是外半径,默认为 [0, 75] + 默认设置成百分比,相对于容器高宽中较小的一项的一半 +* center -> list + 饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标,默认为 [50, 50] + 默认设置成百分比,设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度 +* rosetype -> str + 是否展示成南丁格尔图,通过半径区分数据大小,有'radius'和'area'两种模式。默认为'radius' + * radius:扇区圆心角展现数据的百分比,半径展现数据的大小 + * area:所有扇区圆心角相同,仅通过半径展现数据大小 + +```python +from pyecharts import Pie + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [11, 12, 13, 10, 10, 10] +pie = Pie("饼图示例") +pie.add("", attr, v1, is_label_show=True) +pie.render() +``` +![pie-0](https://user-images.githubusercontent.com/19553554/35089599-5eed1ef6-fc72-11e7-8740-601880be9e16.gif) + +```python +from pyecharts import Pie + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [11, 12, 13, 10, 10, 10] +pie = Pie("饼图-圆环图示例", title_pos='center') +pie.add("", attr, v1, radius=[40, 75], label_text_color=None, + is_label_show=True, legend_orient='vertical', + legend_pos='left') +pie.render() +``` +![pie-1](https://user-images.githubusercontent.com/19553554/35089631-70b6e7de-fc72-11e7-838d-f8b238bbc03f.png) + +```python +from pyecharts import Pie + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [11, 12, 13, 10, 10, 10] +v2 = [19, 21, 32, 20, 20, 33] +pie = Pie("饼图-玫瑰图示例", title_pos='center', width=900) +pie.add("商品A", attr, v1, center=[25, 50], is_random=True, + radius=[30, 75], rosetype='radius') +pie.add("商品B", attr, v2, center=[75, 50], is_random=True, + radius=[30, 75], rosetype='area', + is_legend_show=False, is_label_show=True) +pie.render() +``` +![pie-2](https://user-images.githubusercontent.com/19553554/35089635-72585da2-fc72-11e7-835d-c9b64750d19d.png) + +饼中饼 +```python +import random +from pyecharts import Pie + +attr = ['A', 'B', 'C', 'D', 'E', 'F'] +pie = Pie("饼图示例", width=1000, height=600) +pie.add("", attr, [random.randint(0, 100) for _ in range(6)], + radius=[50, 55], center=[25, 50], is_random=True) +pie.add("", attr, [random.randint(20, 100) for _ in range(6)], + radius=[0, 45], center=[25, 50], rosetype='area') +pie.add("", attr, [random.randint(0, 100) for _ in range(6)], + radius=[50, 55], center=[65, 50], is_random=True) +pie.add("", attr, [random.randint(20, 100) for _ in range(6)], + radius=[0, 45], center=[65, 50], rosetype='radius') +pie.render() +``` +![pie-3](https://user-images.githubusercontent.com/19553554/35089639-73f0e2c4-fc72-11e7-9fba-84376a94314c.gif) + +多个饼图画在一张图内 +```python +from pyecharts import Pie + +pie = Pie('各类电影中"好片"所占的比例', "数据来着豆瓣", title_pos='center') +style = Style() +pie_style = style.add( + label_pos="center", + is_label_show=True, + label_text_color=None +) + +pie.add("", ["剧情", ""], [25, 75], center=[10, 30], + radius=[18, 24], **pie_style) +pie.add("", ["奇幻", ""], [24, 76], center=[30, 30], + radius=[18, 24], **pie_style) +pie.add("", ["爱情", ""], [14, 86], center=[50, 30], + radius=[18, 24], **pie_style) +pie.add("", ["惊悚", ""], [11, 89], center=[70, 30], + radius=[18, 24], **pie_style) +pie.add("", ["冒险", ""], [27, 73], center=[90, 30], + radius=[18, 24], **pie_style) +pie.add("", ["动作", ""], [15, 85], center=[10, 70], + radius=[18, 24], **pie_style) +pie.add("", ["喜剧", ""], [54, 46], center=[30, 70], + radius=[18, 24], **pie_style) +pie.add("", ["科幻", ""], [26, 74], center=[50, 70], + radius=[18, 24], **pie_style) +pie.add("", ["悬疑", ""], [25, 75], center=[70, 70], + radius=[18, 24], **pie_style) +pie.add("", ["犯罪", ""], [28, 72], center=[90, 70], + radius=[18, 24], legend_top="center", **pie_style) +pie.render() +``` +![pie-4](https://user-images.githubusercontent.com/19553554/35089644-76cbcb9e-fc72-11e7-8b9e-d5bebc78e8a1.gif) + + +## Polar(极坐标系) +> 可以用于散点图和折线图。 + +Polar.add() 方法签名 +```python +add(name, data, + angle_data=None, + radius_data=None, + type='line', + symbol_size=4, + start_angle=90, + rotate_step=0, + boundary_gap=True, + clockwise=True, **kwargs) +``` +* name -> str + 图例名称 +* data -> [list], 包含列表的列表 + 数据项 [极径,极角 [数据值]] +* angle_data -> list + 角度类目数据 +* radius_data -> list + 半径类目数据 +* type -> str + 图例类型,有'line', 'scatter', 'effectScatter', 'barAngle', 'barRadius'可选。默认为 'line' +* symbol_size -> int + 标记图形大小,默认为 4。 +* start_angle -> int + 起始刻度的角度,默认为 90 度,即圆心的正上方。0 度为圆心的正右方 +* rotate_step -> int + 刻度标签旋转的角度,在类目轴的类目标签显示不下的时候可以通过旋转防止标签之间重叠 + 旋转的角度从 -90 度到 90 度。默认为 0 +* boundary_gap -> bool + 坐标轴两边留白策略 + 默认为 True,这时候刻度只是作为分隔线,标签和数据点都会在两个刻度之间的带(band)中间 +* clockwise -> bool + 刻度增长是否按顺时针,默认 True +* is_stack -> bool + 数据堆叠,同个类目轴上系列配置相同的 stack 值可以堆叠放置 +* axis_range -> list + 坐标轴刻度范围。默认值为 [None, None]。 +* is_angleaxis_show -> bool + 是否显示极坐标系的角度轴,默认为 True +* is_radiusaxis_show -> bool + 是否显示极坐标系的径向轴,默认为 True + +```python +from pyecharts import Polar + +import random +data = [(i, random.randint(1, 100)) for i in range(101)] +polar = Polar("极坐标系-散点图示例") +polar.add("", data, boundary_gap=False, type='scatter', + is_splitline_show=False, + area_color=None, is_axisline_show=True) +polar.render() +``` +![polar-0](https://user-images.githubusercontent.com/19553554/35090448-aaf0d5a2-fc74-11e7-83c4-7b2f55090e98.png) + +* is_splitline_show -> bool + 是否显示分割线,默认为 True +* is_axisline_show -> bool + 是否显示坐标轴线,默认为 True +* area_opacity -> float + 填充区域透明度 +* area_color -> str + 填充区域颜色 + +**Note:** 可配置 **lineStyle** 参数 + +```python +from pyecharts import Polar + +import random +data_1 = [(10, random.randint(1, 100)) for i in range(300)] +data_2 = [(11, random.randint(1, 100)) for i in range(300)] +polar = Polar("极坐标系-散点图示例", width=1200, height=600) +polar.add("", data_1, type='scatter') +polar.add("", data_2, type='scatter') +polar.render() +``` +![polar-1](https://user-images.githubusercontent.com/19553554/35090451-abf708e0-fc74-11e7-8814-25ba5e72f542.png) + +```python +from pyecharts import Polar + +import random +data = [(i, random.randint(1, 100)) for i in range(10)] +polar = Polar("极坐标系-动态散点图示例", width=1200, height=600) +polar.add("", data, type='effectScatter', effect_scale=10, effect_period=5) +polar.render() +``` +![polar-2](https://user-images.githubusercontent.com/19553554/35090453-ad2b4d52-fc74-11e7-8ecd-cb64546d0d40.gif) + +```python +from pyecharts import Polar + +radius = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] +polar = Polar("极坐标系-堆叠柱状图示例", width=1200, height=600) +polar.add("A", [1, 2, 3, 4, 3, 5, 1], radius_data=radius, + type='barRadius', is_stack=True) +polar.add("B", [2, 4, 6, 1, 2, 3, 1], radius_data=radius, + type='barRadius', is_stack=True) +polar.add("C", [1, 2, 3, 4, 1, 2, 5], radius_data=radius, + type='barRadius', is_stack=True) +polar.render() +``` +![polar-3](https://user-images.githubusercontent.com/19553554/35090457-afc0658e-fc74-11e7-9c58-24c780436287.gif) + +```python +from pyecharts import Polar + +radius = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] +polar = Polar("极坐标系-堆叠柱状图示例", width=1200, height=600) +polar.add("", [1, 2, 3, 4, 3, 5, 1], radius_data=radius, + type='barAngle', is_stack=True) +polar.add("", [2, 4, 6, 1, 2, 3, 1], radius_data=radius, + type='barAngle', is_stack=True) +polar.add("", [1, 2, 3, 4, 1, 2, 5], radius_data=radius, + type='barAngle', is_stack=True) +polar.render() +``` +![polar-4](https://user-images.githubusercontent.com/19553554/35090460-b11ab380-fc74-11e7-836c-2e8197e32723.png) + + +## Radar(雷达图) +> 雷达图主要用于表现多变量的数据。 + +Radar.add() 方法签名 +```python +add(name, value, + item_color=None, **kwargs) +``` +* name -> list + 图例名称 +* value -> [list], 包含列表的列表 + 数据项。数据中,每一行是一个『数据项』,每一列属于一个『维度』 +* item_color -> str + 指定单图例颜色 + +Radar.config() 方法签名 +```python +config(schema=None, + c_schema=None, + shape="", + rader_text_color="#000", **kwargs): +``` +* schema -> list + 默认雷达图的指示器,用来指定雷达图中的多个维度,会对数据处理成 {name:xx, value:xx} 的字典 +* c_schema -> dict + 用户自定义雷达图的指示器,用来指定雷达图中的多个维度 + * name: 指示器名称 + * min: 指示器最小值 + * max: 指示器最大值 +* shape -> str + 雷达图绘制类型,有'polygon'(多边形)和'circle'可选 +* rader_text_color -> str + 雷达图数据项字体颜色,默认为'#000' +* radar_text_size -> int + 雷达图m数据项字体大小,默认为 12 + +```python +from pyecharts import Radar + +schema = [ + ("销售", 6500), ("管理", 16000), ("信息技术", 30000), + ("客服", 38000), ("研发", 52000), ("市场", 25000) +] +v1 = [[4300, 10000, 28000, 35000, 50000, 19000]] +v2 = [[5000, 14000, 28000, 31000, 42000, 21000]] +radar = Radar() +radar.config(schema) +radar.add("预算分配", v1, is_splitline=True, is_axisline_show=True) +radar.add("实际开销", v2, label_color=["#4e79a7"], is_area_show=False, + legend_selectedmode='single') +radar.render() +``` +![radar-0](https://user-images.githubusercontent.com/19553554/35082333-20046172-fc54-11e7-944a-b6e25bf5dd2a.gif) + +* is_area_show -> bool + 是否显示填充区域 +* area_opacity -> float + 填充区域透明度 +* area_color -> str + 填充区域颜色 +* is_splitline_show -> bool + 是否显示分割线,默认为 True +* is_axisline_show -> bool + 是否显示坐标轴线,默认为 True + +**Note:** 可配置 **lineStyle** 参数 + +```python +value_bj = [ + [55, 9, 56, 0.46, 18, 6, 1], [25, 11, 21, 0.65, 34, 9, 2], + [56, 7, 63, 0.3, 14, 5, 3], [33, 7, 29, 0.33, 16, 6, 4], + [42, 24, 44, 0.76, 40, 16, 5], [82, 58, 90, 1.77, 68, 33, 6], + [74, 49, 77, 1.46, 48, 27, 7], [78, 55, 80, 1.29, 59, 29, 8], + [267, 216, 280, 4.8, 108, 64, 9], [185, 127, 216, 2.52, 61, 27, 10], + [39, 19, 38, 0.57, 31, 15, 11], [41, 11, 40, 0.43, 21, 7, 12], + [64, 38, 74, 1.04, 46, 22, 13], [108, 79, 120, 1.7, 75, 41, 14], + [108, 63, 116, 1.48, 44, 26, 15], [33, 6, 29, 0.34, 13, 5, 16], + [94, 66, 110, 1.54, 62, 31, 17], [186, 142, 192, 3.88, 93, 79, 18], + [57, 31, 54, 0.96, 32, 14, 19], [22, 8, 17, 0.48, 23, 10, 20], + [39, 15, 36, 0.61, 29, 13, 21], [94, 69, 114, 2.08, 73, 39, 22], + [99, 73, 110, 2.43, 76, 48, 23], [31, 12, 30, 0.5, 32, 16, 24], + [42, 27, 43, 1, 53, 22, 25], [154, 117, 157, 3.05, 92, 58, 26], + [234, 185, 230, 4.09, 123, 69, 27],[160, 120, 186, 2.77, 91, 50, 28], + [134, 96, 165, 2.76, 83, 41, 29], [52, 24, 60, 1.03, 50, 21, 30], +] +value_sh = [ + [91, 45, 125, 0.82, 34, 23, 1], [65, 27, 78, 0.86, 45, 29, 2], + [83, 60, 84, 1.09, 73, 27, 3], [109, 81, 121, 1.28, 68, 51, 4], + [106, 77, 114, 1.07, 55, 51, 5], [109, 81, 121, 1.28, 68, 51, 6], + [106, 77, 114, 1.07, 55, 51, 7], [89, 65, 78, 0.86, 51, 26, 8], + [53, 33, 47, 0.64, 50, 17, 9], [80, 55, 80, 1.01, 75, 24, 10], + [117, 81, 124, 1.03, 45, 24, 11], [99, 71, 142, 1.1, 62, 42, 12], + [95, 69, 130, 1.28, 74, 50, 13], [116, 87, 131, 1.47, 84, 40, 14], + [108, 80, 121, 1.3, 85, 37, 15], [134, 83, 167, 1.16, 57, 43, 16], + [79, 43, 107, 1.05, 59, 37, 17], [71, 46, 89, 0.86, 64, 25, 18], + [97, 71, 113, 1.17, 88, 31, 19], [84, 57, 91, 0.85, 55, 31, 20], + [87, 63, 101, 0.9, 56, 41, 21], [104, 77, 119, 1.09, 73, 48, 22], + [87, 62, 100, 1, 72, 28, 23], [168, 128, 172, 1.49, 97, 56, 24], + [65, 45, 51, 0.74, 39, 17, 25], [39, 24, 38, 0.61, 47, 17, 26], + [39, 24, 39, 0.59, 50, 19, 27], [93, 68, 96, 1.05, 79, 29, 28], + [188, 143, 197, 1.66, 99, 51, 29], [174, 131, 174, 1.55, 108, 50, 30], +] +c_schema= [{"name": "AQI", "max": 300, "min": 5}, + {"name": "PM2.5", "max": 250, "min": 20}, + {"name": "PM10", "max": 300, "min": 5}, + {"name": "CO", "max": 5}, + {"name": "NO2", "max": 200}, + {"name": "SO2", "max": 100}] +radar = Radar() +radar.config(c_schema=c_schema, shape='circle') +radar.add("北京", value_bj, item_color="#f9713c", symbol=None) +radar.add("上海", value_sh, item_color="#b3e4a1", symbol=None, + legend_selectedmode='single') +radar.render() +``` +![radar-1](https://user-images.githubusercontent.com/19553554/35082335-224c23ca-fc54-11e7-910a-0914699ac06e.gif) + +**Note:** symblo=None 可隐藏标记图形(小圆圈) + +图例多例模式。 +```python +radar = Radar() +radar.config(c_schema=c_schema, shape='circle') +radar.add("北京", value_bj, item_color="#f9713c", symbol=None) +radar.add("上海", value_sh, item_color="#b3e4a1", symbol=None) +radar.render() +``` +![radar-2](https://user-images.githubusercontent.com/19553554/35082343-269d9440-fc54-11e7-9675-4c125bbca75d.gif) + + +## Sankey(桑基图) +> 桑基图是一种特殊的流图, 它主要用来表示原材料、能量等如何从初始形式经过中间过程的加工、转化到达最终形式。 + +Sankey.add() 方法签名 +```python +add(name, nodes, links, + sankey_node_width=20, + sankey_node_gap=8, **kwargs) +``` +* name -> str + 图例名称 +* nodes -> list + 桑基图结点,必须包含的数据项有: + * name:数据项名称 + * value:数据项数值 +* links -> list + 桑基图结点关系 + * source:边的源节点名称(必须有!) + * target:边的目标节点名称(必须有!) + * value:边的数值,决定边的宽度。 + * sankey_node_width -> int + 图中每个矩形节点的宽度。默认为 20 + * sankey_node_gap -> int + 图中每一列任意两个矩形节点之间的间隔。默认为 8 + +先来个简单示例 +```python +from pyecharts import Sankey + +nodes = [ + {'name': 'category1'}, {'name': 'category2'}, {'name': 'category3'}, + {'name': 'category4'}, {'name': 'category5'}, {'name': 'category6'}, +] + +links = [ + {'source': 'category1', 'target': 'category2', 'value': 10}, + {'source': 'category2', 'target': 'category3', 'value': 15}, + {'source': 'category3', 'target': 'category4', 'value': 20}, + {'source': 'category5', 'target': 'category6', 'value': 25} +] +sankey = Sankey("桑基图示例", width=1200, height=600) +sankey.add("sankey", nodes, links, line_opacity=0.2, + line_curve=0.5, line_color='source', + is_label_show=True, label_pos='right') +sankey.render() +``` +![sankey-0](https://user-images.githubusercontent.com/19553554/35090344-5b701286-fc74-11e7-8c53-9a5d0e6797e5.png) + +使用官方提供的 json 数据 +```python +import os +import json + +from pyecharts import Sankey + +with codecs.open(os.path.join("fixtures", "energy.json"), "r", encoding="utf-8") as f: + j = json.load(f) +sankey = Sankey("桑基图示例", width=1200, height=600) +sankey.add("sankey", nodes=j['nodes'], links=j['links'], + line_opacity=0.2, line_curve=0.5, line_color='source', + is_label_show=True, label_pos='right') +sankey.render() +``` +![sankey-1](https://user-images.githubusercontent.com/19553554/35090346-5c79d1da-fc74-11e7-869b-7db7ecf42d9e.png) + + +## Scatter(散点图) +> 直角坐标系上的散点图可以用来展现数据的 x,y 之间的关系,如果数据项有多个维度,可以用颜色来表现,利用 geo 组件。 + +Scatter.add() 方法签名 +```python +add(name, x_axis, y_axis, + extra_data=None, + symbol_size=10, **kwargs) +``` +* name -> str + 图例名称 +* x_axis -> list + x 坐标轴数据 +* y_axis -> list + y 坐标轴数据 +* extra_data -> int + 第三维度数据,x 轴为第一个维度,y 轴为第二个维度。(可在 visualmap 中将视图元素映射到第三维度) +* symbol_size -> int + 标记图形大小,默认为 10 + +```python +from pyecharts import Scatter + +v1 = [10, 20, 30, 40, 50, 60] +v2 = [10, 20, 30, 40, 50, 60] +scatter = Scatter("散点图示例") +scatter.add("A", v1, v2) +scatter.add("B", v1[::-1], v2) +scatter.render() +``` +![scatter-0](https://user-images.githubusercontent.com/19553554/35090352-5f4bae42-fc74-11e7-9158-6fa70e5abf5d.png) + +利用 Visualmap 组件,通过颜色映射数值。 +```python +scatter = Scatter("散点图示例") +scatter.add("A", v1, v2) +scatter.add("B", v1[::-1], v2, is_visualmap=True) +scatter.render() +``` +![scatter-0-1](https://user-images.githubusercontent.com/19553554/35090355-60bc82b0-fc74-11e7-8cc2-4f10c1c8193e.gif) + +利用 Visualmap 组件,通过图形点大小映射数值。 +```python +scatter = Scatter("散点图示例") +scatter.add("A", v1, v2) +scatter.add("B", v1[::-1], v2, is_visualmap=True, + visual_type='size', visual_range_size=[20, 80]) +scatter.render() +``` +![scatter-0-2](https://user-images.githubusercontent.com/19553554/35090360-62d94cfe-fc74-11e7-869f-ae3a3281f27b.gif) + +利用 Visualmap 组件映射到第三维度数据 +```python +data = [ + [28604, 77, 17096869], + [31163, 77.4, 27662440], + [1516, 68, 1154605773], + [13670, 74.7, 10582082], + [28599, 75, 4986705], + [29476, 77.1, 56943299], + [31476, 75.4, 78958237], + [28666, 78.1, 254830], + [1777, 57.7, 870601776], + [29550, 79.1, 122249285], + [2076, 67.9, 20194354], + [12087, 72, 42972254], + [24021, 75.4, 3397534], + [43296, 76.8, 4240375], + [10088, 70.8, 38195258], + [19349, 69.6, 147568552], + [10670, 67.3, 53994605], + [26424, 75.7, 57110117], + [37062, 75.4, 252847810] + ] + +x_lst = [v[0] for v in data] +y_lst = [v[1] for v in data] +extra_data = [v[2] for v in data] +sc = Scatter() +sc.add("scatter", x_lst, y_lst, extra_data=extra_data, is_visualmap=True, + visual_dimension=2, visual_orient='horizontal', + visual_type='size', visual_range=[254830, 1154605773], + visual_text_color='#000') +sc.render() +``` +![scatter-0-3](https://user-images.githubusercontent.com/19553554/35090364-63f2ef78-fc74-11e7-950b-75ebd13e1f03.gif) + + +**Note:** 请配合 通用配置项 中的 Visualmap 使用 + +散点图默认的坐标轴都为数值轴,如果想实现横坐标为类目轴,可通过 ```xaxis_type``` 修改 +```python +scatter = Scatter("散点图示例") +scatter.add("A", ["a", "b", "c", "d", "e", "f"], v2) +scatter.add("B", ["a", "b", "c", "d", "e", "f"], v1[::-1], xaxis_type="category") +scatter.render() +``` +![scatter-0-3](https://user-images.githubusercontent.com/19553554/35090414-916add4e-fc74-11e7-83c1-d428387e8101.png) + +Scatter 还内置了画画方法 +```python +draw(path, color=None) +''' +将图片上的像素点转换为数组,如 color 为(255,255,255)时只保留非白色像素点的坐标信息 +返回两个 k_lst, v_lst 两个列表刚好作为散点图的数据项 +''' +``` +* path -> str + 转换图片的地址 +* color -> str + 所要排除的颜色 + +首先你需要准备一张图片,如 + +![pyecharts-0](https://user-images.githubusercontent.com/19553554/35104421-c25a02f2-fca3-11e7-868d-d70bd86fdd76.png) + +```python +from pyecharts import Scatter + +scatter = Scatter("散点图示例") +v1, v2 = scatter.draw("../images/pyecharts-0.png") +scatter.add("pyecharts", v1, v2, is_random=True) +scatter.render() +``` +![pyecharts-1](https://user-images.githubusercontent.com/19553554/35104426-c4ac81ce-fca3-11e7-9b46-7fd729ec3ece.png) + + +## Scatter3D(3D 散点图) +Scatter3D.add() 方法签名 +```python +add(name, data, + grid3d_opacity=1, **kwargs) +``` +* name -> str + 图例名称 +* data -> [list], 包含列表的列表 + 数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』 +* grid3d_opacity -> int + 3D 笛卡尔坐标系组的透明度(点的透明度),默认为 1,完全不透明。 + +```python +from pyecharts import Scatter3D + +import random +data = [ + [random.randint(0, 100), + random.randint(0, 100), + random.randint(0, 100)] for _ in range(80) +] +range_color = [ + '#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] +scatter3D = Scatter3D("3D 散点图示例", width=1200, height=600) +scatter3D.add("", data, is_visualmap=True, visual_range_color=range_color) +scatter3D.render() +``` +![scatter3d-0](https://user-images.githubusercontent.com/19553554/35081974-1ece83ca-fc52-11e7-86d7-bec5c4d3e2c8.gif) + +**Note:** 关于 gird3D 部分的设置,请参照通用配置项中的介绍 通用配置项 +**Note:** 可配合 axis3D 通用配置项 一起使用 + + +## ThemeRiver(主题河流图) +> 主题河流图是一种特殊的流图, 它主要用来表示事件或主题等在一段时间内的变化。 +ThemeRiver.add() 方法签名 +```python +add(name, data) +``` +* name -> list + 图例名称,必须为 list 类型,list 中每个值为数据项中的种类。 +* data -> [list], 包含列表的列表 + 数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』。每个数据项至少需要三个维度,如 ['2015/11/08', 10, 'DQ'],分别为 [时间,数值,种类(图例名)] + +```python +from pyecharts import ThemeRiver + +data = [ + ['2015/11/08', 10, 'DQ'], ['2015/11/09', 15, 'DQ'], ['2015/11/10', 35, 'DQ'], + ['2015/11/14', 7, 'DQ'], ['2015/11/15', 2, 'DQ'], ['2015/11/16', 17, 'DQ'], + ['2015/11/17', 33, 'DQ'], ['2015/11/18', 40, 'DQ'], ['2015/11/19', 32, 'DQ'], + ['2015/11/20', 26, 'DQ'], ['2015/11/21', 35, 'DQ'], ['2015/11/22', 40, 'DQ'], + ['2015/11/23', 32, 'DQ'], ['2015/11/24', 26, 'DQ'], ['2015/11/25', 22, 'DQ'], + ['2015/11/08', 35, 'TY'], ['2015/11/09', 36, 'TY'], ['2015/11/10', 37, 'TY'], + ['2015/11/11', 22, 'TY'], ['2015/11/12', 24, 'TY'], ['2015/11/13', 26, 'TY'], + ['2015/11/14', 34, 'TY'], ['2015/11/15', 21, 'TY'], ['2015/11/16', 18, 'TY'], + ['2015/11/17', 45, 'TY'], ['2015/11/18', 32, 'TY'], ['2015/11/19', 35, 'TY'], + ['2015/11/20', 30, 'TY'], ['2015/11/21', 28, 'TY'], ['2015/11/22', 27, 'TY'], + ['2015/11/23', 26, 'TY'], ['2015/11/24', 15, 'TY'], ['2015/11/25', 30, 'TY'], + ['2015/11/26', 35, 'TY'], ['2015/11/27', 42, 'TY'], ['2015/11/28', 42, 'TY'], + ['2015/11/08', 21, 'SS'], ['2015/11/09', 25, 'SS'], ['2015/11/10', 27, 'SS'], + ['2015/11/11', 23, 'SS'], ['2015/11/12', 24, 'SS'], ['2015/11/13', 21, 'SS'], + ['2015/11/14', 35, 'SS'], ['2015/11/15', 39, 'SS'], ['2015/11/16', 40, 'SS'], + ['2015/11/17', 36, 'SS'], ['2015/11/18', 33, 'SS'], ['2015/11/19', 43, 'SS'], + ['2015/11/20', 40, 'SS'], ['2015/11/21', 34, 'SS'], ['2015/11/22', 28, 'SS'], + ['2015/11/14', 7, 'QG'], ['2015/11/15', 2, 'QG'], ['2015/11/16', 17, 'QG'], + ['2015/11/17', 33, 'QG'], ['2015/11/18', 40, 'QG'], ['2015/11/19', 32, 'QG'], + ['2015/11/20', 26, 'QG'], ['2015/11/21', 35, 'QG'], ['2015/11/22', 40, 'QG'], + ['2015/11/23', 32, 'QG'], ['2015/11/24', 26, 'QG'], ['2015/11/25', 22, 'QG'], + ['2015/11/26', 16, 'QG'], ['2015/11/27', 22, 'QG'], ['2015/11/28', 10, 'QG'], + ['2015/11/08', 10, 'SY'], ['2015/11/09', 15, 'SY'], ['2015/11/10', 35, 'SY'], + ['2015/11/11', 38, 'SY'], ['2015/11/12', 22, 'SY'], ['2015/11/13', 16, 'SY'], + ['2015/11/14', 7, 'SY'], ['2015/11/15', 2, 'SY'], ['2015/11/16', 17, 'SY'], + ['2015/11/17', 33, 'SY'], ['2015/11/18', 40, 'SY'], ['2015/11/19', 32, 'SY'], + ['2015/11/20', 26, 'SY'], ['2015/11/21', 35, 'SY'], ['2015/11/22', 4, 'SY'], + ['2015/11/23', 32, 'SY'], ['2015/11/24', 26, 'SY'], ['2015/11/25', 22, 'SY'], + ['2015/11/26', 16, 'SY'], ['2015/11/27', 22, 'SY'], ['2015/11/28', 10, 'SY'], + ['2015/11/08', 10, 'DD'], ['2015/11/09', 15, 'DD'], ['2015/11/10', 35, 'DD'], + ['2015/11/11', 38, 'DD'], ['2015/11/12', 22, 'DD'], ['2015/11/13', 16, 'DD'], + ['2015/11/14', 7, 'DD'], ['2015/11/15', 2, 'DD'], ['2015/11/16', 17, 'DD'], + ['2015/11/17', 33, 'DD'], ['2015/11/18', 4, 'DD'], ['2015/11/19', 32, 'DD'], + ['2015/11/20', 26, 'DD'], ['2015/11/21', 35, 'DD'], ['2015/11/22', 40, 'DD'], + ['2015/11/23', 32, 'DD'], ['2015/11/24', 26, 'DD'], ['2015/11/25', 22, 'DD'] +] +tr = ThemeRiver("主题河流图示例图") +tr.add(['DQ', 'TY', 'SS', 'QG', 'SY', 'DD'], data, is_label_show=True) +tr.render() +``` +![themeriver-0](https://user-images.githubusercontent.com/19553554/35090642-3aaf6eba-fc75-11e7-8560-d36f1d225f6d.gif) + +**Note:** 可以看到,每个数据项中的第三个数值就是该项的种类,而种类可以在 `add()` 第一个参数指定。 + + +## TreeMap(树图) +> 树图是一种常见的表达『层级数据』『树状数据』的可视化形式。它主要用面积的方式,便于突出展现出『树』的各层级中重要的节点。 +TreeMap.add() 方法签名 +```python +add(name, attr, value, + shape="circle", + word_gap=20, + word_size_range=None, + rotate_step=45) +``` +* name -> str + 图例名称 +* data -> list + 树图的数据项是 **一棵树**,每个节点包括`value`, `name`(可选), `children`(也是树,可选)如下所示 + ``` + [ + { + value: 1212, # 数值 + # 子节点 + children: [ + { + # 子节点数值 + value: 2323, + # 子节点名 + name: 'description of this node', + children: [...], + }, + { + value: 4545, + name: 'description of this node', + children: [ + { + value: 5656, + name: 'description of this node', + children: [...] + }, + ... + ] + } + ] + }, + ... + ] + ``` +* treemap_left_depth -> int + leafDepth 表示『展示几层』,层次更深的节点则被隐藏起来。设置了 leafDepth 后,下钻(drill down)功能开启。drill down 功能即点击后才展示子层级。例如,leafDepth 设置为 1,表示展示一层节点。 +* treemap_drilldown_icon -> str + 当节点可以下钻时的提示符。只能是字符。默认为 '▶' +* treemap_visible_min -> int + 如果某个节点的矩形的面积,小于这个数值(单位:px平方),这个节点就不显示。 + +```python +from pyecharts import TreeMap + +data = [ + { + "value": 40, + "name": "我是A", + }, + { + "value": 180, + "name": "我是B", + "children": [ + { + "value": 76, + "name": "我是B.children", + "children": [ + { + "value": 12, + "name": "我是B.children.a", + }, + { + "value": 28, + "name": "我是B.children.b", + }, + { + "value": 20, + "name": "我是B.children.c", + }, + { + "value": 16, + "name": "我是B.children.d", + }] + }]} +] + +treemap = TreeMap("树图-默认示例", width=1200, height=600) +treemap.add("演示数据", data, is_label_show=True, label_pos='inside') +treemap.render() +``` +![treemap-0](https://user-images.githubusercontent.com/19553554/35082247-b6f5ff88-fc53-11e7-84ca-bcb1f621ec68.png) + +```python +treemap = TreeMap("树图-下钻示例", width=1200, height=600) +treemap.add("演示数据", data, is_label_show=True, label_pos='inside', + treemap_left_depth=1) +treemap.render() +``` +![treemap-1](https://user-images.githubusercontent.com/19553554/35082249-b862ecf0-fc53-11e7-85eb-8021de696a66.gif) + +```python +from pyecharts import TreeMap + +treemap = TreeMap("树图示例", width=1200, height=600) +import os +import json +with open(os.path.join("..", "json", "treemap.json"), "r", encoding="utf-8") as f: + data = json.load(f) +treemap.add("演示数据", data, is_label_show=True, label_pos='inside') +treemap.render() +``` +![treemap-2](https://user-images.githubusercontent.com/19553554/35082251-b9e23982-fc53-11e7-8341-e7da1842389f.gif) + + +## WordCloud(词云图) +WordCloud.add() 方法签名 +```python +add(name, attr, value, + shape="circle", + word_gap=20, + word_size_range=None, + rotate_step=45) +``` +* name -> str + 图例名称 +* attr -> list + 属性名称 +* value -> list + 属性所对应的值 +* shape -> list + 词云图轮廓,有'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon', 'star'可选 +* word_gap -> int + 单词间隔,默认为 20。 +* word_size_range -> list + 单词字体大小范围,默认为 [12, 60]。 +* rotate_step -> int + 旋转单词角度,默认为 45 + +```python +from pyecharts import WordCloud + +name = [ + 'Sam S Club', 'Macys', 'Amy Schumer', 'Jurassic World', 'Charter Communications', + 'Chick Fil A', 'Planet Fitness', 'Pitch Perfect', 'Express', 'Home', 'Johnny Depp', + 'Lena Dunham', 'Lewis Hamilton', 'KXAN', 'Mary Ellen Mark', 'Farrah Abraham', + 'Rita Ora', 'Serena Williams', 'NCAA baseball tournament', 'Point Break'] +value = [ + 10000, 6181, 4386, 4055, 2467, 2244, 1898, 1484, 1112, + 965, 847, 582, 555, 550, 462, 366, 360, 282, 273, 265] +wordcloud = WordCloud(width=1300, height=620) +wordcloud.add("", name, value, word_size_range=[20, 100]) +wordcloud.render() +``` +![wordcloud-0](https://user-images.githubusercontent.com/19553554/35081546-cfe57770-fc4f-11e7-878a-e76d274afcbd.png) + +```python +wordcloud = WordCloud(width=1300, height=620) +wordcloud.add("", name, value, word_size_range=[30, 100], + shape='diamond') +wordcloud.render() +``` +![wordcloud-1](https://user-images.githubusercontent.com/19553554/35081549-d2bde37e-fc4f-11e7-98b2-4cdc019433b1.png) + +**Note:** 当且仅当 shape 为默认的'circle'时 rotate_step 参数才生效 + + +# 用户自定义 + +## Grid:并行显示多张图 +> 用户可以自定义结合 Line/Bar/Kline/Scatter/EffectScatter/Pie/HeatMap/Boxplot 图表,将不同类型图表画在多张图上。第一个图需为 有 x/y 轴的图,即不能为 Pie,其他位置顺序任意。 + +Grid 类的使用: +1. 引入 `Grid` 类,`from pyecharts import Grid` +2. 实例化 Grid 类,`grid = Grid()` ,可指定 `page_title`, `width`, `height`, `jhost` 参数。 +3. 使用 `add()` 向 `grid` 中添加图,至少需要设置一个 `grid_top`, `grid_bottom`, `grid_left`, `grid_right` 四个参数中的一个。`grid_width` 和 `grid_height` 一般不用设置,默认即可。 +4. 使用 `render()` 渲染生成 .html 文件 + +**Note:** `Overlap` 可类放入 `Grid` 类中,不过有个前提,`Overlap` 不可为多 x 轴或者多 y 轴,否则会出现坐标轴索引混乱问题 + +Grid 类中其他方法: +* `render_embed()`:在 Flask&Django 中可以使用该方法渲染 +* `show_config()`:打印输出所有配置项 +* `chart`:chart 属性返回图形实例 +* 在 Jupyter-notebook 中直接调用 Grid 实例即可显示图表 + +Grid.add() 方法签名 +```python +add(chart, + grid_width=None, + grid_height=None, + grid_top=None, + grid_bottom=None, + grid_left=None, + grid_right=None) +``` +* chart -> chart instance + 图表实例 +* grid_width -> str/int + grid 组件的宽度。默认自适应。 +* grid_height -> str/int + grid 组件的高度。默认自适应。 +* grid_top -> str/int + grid 组件离容器顶部的距离。默认为 None, 有'top', 'center', 'middle'可选,也可以为百分数或者整数 +* grid_bottom -> str/int + grid 组件离容器底部的距离。默认为 None, 有'top', 'center', 'middle'可选,也可以为百分数或者整数 +* grid_left -> str/int + grid 组件离容器左侧的距离。默认为 None, 有'left', 'center', 'right'可选,也可以为百分数或者整数 +* grid_right -> str/int + grid 组件离容器右侧的距离。默认为 None, 有'left', 'center', 'right'可选,也可以为百分数或者整数 + + +上下类型,Bar + Line +```python +from pyecharts import Bar, Line, Grid + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +bar = Bar("柱状图示例", height=720) +bar.add("商家A", attr, v1, is_stack=True) +bar.add("商家B", attr, v2, is_stack=True) +line = Line("折线图示例", title_top="50%") +attr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] +line.add("最高气温", attr, [11, 11, 15, 13, 12, 13, 10], + mark_point=["max", "min"], mark_line=["average"]) +line.add("最低气温", attr, [1, -2, 2, 5, 3, 2, 0], + mark_point=["max", "min"], mark_line=["average"], + legend_top="50%") + +grid = Grid() +grid.add(bar, grid_bottom="60%") +grid.add(line, grid_top="60%") +grid.render() +``` +![grid-0](https://user-images.githubusercontent.com/19553554/35089722-c80f84fa-fc72-11e7-93b0-4fff14a371a5.gif) + +左右类型,Scatter + EffectScatter +```python +from pyecharts import Scatter, EffectScatter, Grid + +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +scatter = Scatter(width=1200) +scatter.add("散点图示例", v1, v2, legend_pos="70%") +es = EffectScatter() +es.add("动态散点图示例", [11, 11, 15, 13, 12, 13, 10], [1, -2, 2, 5, 3, 2, 0], + effect_scale=6, legend_pos="20%") + +grid = Grid() +grid.add(scatter, grid_left="60%") +grid.add(es, grid_right="60%") +grid.render() +``` +![grid-1](https://user-images.githubusercontent.com/19553554/35089730-ca173c70-fc72-11e7-915e-34ce5c79ead7.gif) + +上下左右类型,Bar + Line + Scatter + EffectScatter +```python +from pyecharts import Bar, Line, Scatter, EffectScatter, Grid + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +bar = Bar("柱状图示例", height=720, width=1200, title_pos="65%") +bar.add("商家A", attr, v1, is_stack=True) +bar.add("商家B", attr, v2, is_stack=True, legend_pos="80%") +line = Line("折线图示例") +attr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] +line.add("最高气温", attr, [11, 11, 15, 13, 12, 13, 10], + mark_point=["max", "min"], mark_line=["average"]) +line.add("最低气温", attr, [1, -2, 2, 5, 3, 2, 0], + mark_point=["max", "min"], mark_line=["average"], + legend_pos="20%") +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +scatter = Scatter("散点图示例", title_top="50%", title_pos="65%") +scatter.add("scatter", v1, v2, legend_top="50%", legend_pos="80%") +es = EffectScatter("动态散点图示例", title_top="50%") +es.add("es", [11, 11, 15, 13, 12, 13, 10], [1, -2, 2, 5, 3, 2, 0], + effect_scale=6, legend_top="50%", legend_pos="20%") + +grid = Grid() +grid.add(bar, grid_bottom="60%", grid_left="60%") +grid.add(line, grid_bottom="60%", grid_right="60%") +grid.add(scatter, grid_top="60%", grid_left="60%") +grid.add(es, grid_top="60%", grid_right="60%") +grid.render() +``` +![grid-2](https://user-images.githubusercontent.com/19553554/35089731-cb044614-fc72-11e7-930c-be269b1f1589.gif) + +Line + Pie +```python +from pyecharts import Line, Pie, Grid + +line = Line("折线图示例", width=1200) +attr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] +line.add("最高气温", attr, [11, 11, 15, 13, 12, 13, 10], + mark_point=["max", "min"], mark_line=["average"]) +line.add("最低气温", attr, [1, -2, 2, 5, 3, 2, 0], + mark_point=["max", "min"], mark_line=["average"], + legend_pos="20%") +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [11, 12, 13, 10, 10, 10] +pie = Pie("饼图示例", title_pos="55%") +pie.add("", attr, v1, radius=[45, 65], center=[65, 50], + legend_pos="80%", legend_orient='vertical') + +grid = Grid() +grid.add(line, grid_right="55%") +grid.add(pie, grid_left="60%") +grid.render() +``` +![grid-3](https://user-images.githubusercontent.com/19553554/35089737-ccc1c01c-fc72-11e7-874d-8ba8b89572eb.png) + +**Note:** 可以通过设置 center 参数改变 Pie 图的位置,如 [v1, v2], 要求 v1 > v2。 + +Line + Kline +```python +from pyecharts import Line, Kline, Grid + +line = Line("折线图示例", width=1200) +attr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] +line.add("最高气温", attr, [11, 11, 15, 13, 12, 13, 10], + mark_point=["max", "min"], mark_line=["average"]) +line.add("最低气温", attr, [1, -2, 2, 5, 3, 2, 0], + mark_point=["max", "min"], mark_line=["average"], + legend_pos="20%") +v1 = [[2320.26, 2320.26, 2287.3, 2362.94], + [2300, 2291.3, 2288.26, 2308.38], + [2295.35, 2346.5, 2295.35, 2345.92], + [2347.22, 2358.98, 2337.35, 2363.8], + [2360.75, 2382.48, 2347.89, 2383.76], + [2383.43, 2385.42, 2371.23, 2391.82], + [2377.41, 2419.02, 2369.57, 2421.15], + [2425.92, 2428.15, 2417.58, 2440.38], + [2411, 2433.13, 2403.3, 2437.42], + [2432.68, 2334.48, 2427.7, 2441.73], + [2430.69, 2418.53, 2394.22, 2433.89], + [2416.62, 2432.4, 2414.4, 2443.03], + [2441.91, 2421.56, 2418.43, 2444.8], + [2420.26, 2382.91, 2373.53, 2427.07], + [2383.49, 2397.18, 2370.61, 2397.94], + [2378.82, 2325.95, 2309.17, 2378.82], + [2322.94, 2314.16, 2308.76, 2330.88], + [2320.62, 2325.82, 2315.01, 2338.78], + [2313.74, 2293.34, 2289.89, 2340.71], + [2297.77, 2313.22, 2292.03, 2324.63], + [2322.32, 2365.59, 2308.92, 2366.16], + [2364.54, 2359.51, 2330.86, 2369.65], + [2332.08, 2273.4, 2259.25, 2333.54], + [2274.81, 2326.31, 2270.1, 2328.14], + [2333.61, 2347.18, 2321.6, 2351.44], + [2340.44, 2324.29, 2304.27, 2352.02], + [2326.42, 2318.61, 2314.59, 2333.67], + [2314.68, 2310.59, 2296.58, 2320.96], + [2309.16, 2286.6, 2264.83, 2333.29], + [2282.17, 2263.97, 2253.25, 2286.33], + [2255.77, 2270.28, 2253.31, 2276.22]] +kline = Kline("K 线图示例", title_pos="60%") +kline.add("日K", ["2017/7/{}".format(i + 1) for i in range(31)], v1, + legend_pos="80%") + +grid = Grid() +grid.add(line, grid_right="60%") +grid.add(kline, grid_left="55%") +grid.render() +``` +![grid-4](https://user-images.githubusercontent.com/19553554/35089740-ce510c6c-fc72-11e7-84eb-6ae3dddece76.png) + +HeatMap + Bar +```python +import random +x_axis = [ + "12a", "1a", "2a", "3a", "4a", "5a", "6a", "7a", "8a", "9a", "10a", "11a", + "12p", "1p", "2p", "3p", "4p", "5p", "6p", "7p", "8p", "9p", "10p", "11p"] +y_axis = [ + "Saturday", "Friday", "Thursday", "Wednesday", "Tuesday", "Monday", "Sunday"] +data = [[i, j, random.randint(0, 50)] for i in range(24) for j in range(7)] +heatmap = HeatMap("热力图示例", height=700) +heatmap.add("热力图直角坐标系", x_axis, y_axis, data, is_visualmap=True, + visual_top="45%", visual_text_color="#000", + visual_orient='horizontal') +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +bar = Bar("柱状图示例", title_top="52%") +bar.add("商家A", attr, v1, is_stack=True) +bar.add("商家B", attr, v2, is_stack=True, legend_top="50%") + +grid = Grid() +grid.add(heatmap, grid_bottom="60%") +grid.add(bar, grid_top="60%") +grid.render() +``` +![grid-5](https://user-images.githubusercontent.com/19553554/35089741-cfca19bc-fc72-11e7-8c3b-2f20d054d3fc.gif) +Bar 会受 HeatMap 影响,很有趣。 + +datazoom 组件同时控制多个图 +```python +line = Line("折线图示例", width=1200, height=700) +attr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] +line.add("最高气温", attr, [11, 11, 15, 13, 12, 13, 10], + mark_point=["max", "min"], mark_line=["average"]) +line.add("最低气温", attr, [1, -2, 2, 5, 3, 2, 0], + mark_point=["max", "min"], legend_top="50%", mark_line=["average"], + # 设置 dataZoom 控制索引为 0,1 的 x 轴,即第一个和第二个 + is_datazoom_show=True, datazoom_xaxis_index=[0, 1]) + +v1 = [[2320.26, 2320.26, 2287.3, 2362.94], + [2300, 2291.3, 2288.26, 2308.38], + [2295.35, 2346.5, 2295.35, 2345.92], + [2347.22, 2358.98, 2337.35, 2363.8], + [2360.75, 2382.48, 2347.89, 2383.76], + [2383.43, 2385.42, 2371.23, 2391.82], + [2377.41, 2419.02, 2369.57, 2421.15], + [2425.92, 2428.15, 2417.58, 2440.38], + [2411, 2433.13, 2403.3, 2437.42], + [2432.68, 2334.48, 2427.7, 2441.73], + [2430.69, 2418.53, 2394.22, 2433.89], + [2416.62, 2432.4, 2414.4, 2443.03], + [2441.91, 2421.56, 2418.43, 2444.8], + [2420.26, 2382.91, 2373.53, 2427.07], + [2383.49, 2397.18, 2370.61, 2397.94], + [2378.82, 2325.95, 2309.17, 2378.82], + [2322.94, 2314.16, 2308.76, 2330.88], + [2320.62, 2325.82, 2315.01, 2338.78], + [2313.74, 2293.34, 2289.89, 2340.71], + [2297.77, 2313.22, 2292.03, 2324.63], + [2322.32, 2365.59, 2308.92, 2366.16], + [2364.54, 2359.51, 2330.86, 2369.65], + [2332.08, 2273.4, 2259.25, 2333.54], + [2274.81, 2326.31, 2270.1, 2328.14], + [2333.61, 2347.18, 2321.6, 2351.44], + [2340.44, 2324.29, 2304.27, 2352.02], + [2326.42, 2318.61, 2314.59, 2333.67], + [2314.68, 2310.59, 2296.58, 2320.96], + [2309.16, 2286.6, 2264.83, 2333.29], + [2282.17, 2263.97, 2253.25, 2286.33], + [2255.77, 2270.28, 2253.31, 2276.22]] +kline = Kline("K 线图示例", title_top="50%") +kline.add("日K", ["2017/7/{}".format(i + 1) for i in range(31)], + v1, is_datazoom_show=True) + +grid = Grid() +grid.add(line, grid_top="60%") +grid.add(kline, grid_bottom="60%") +grid.render() +``` +![grid-6](https://user-images.githubusercontent.com/19553554/35089743-d13a3502-fc72-11e7-9c6a-21aeb7415c2b.gif) + +倒映直角坐标系 +```python +import random + +attr = ['{}天'.format(i) for i in range(1, 31)] +line_top = Line("折线图示例", width=1200, height=700) +line_top.add("最高气温", attr, [random.randint(20, 100) for i in range(30)], + mark_point=["max", "min"], mark_line=["average"], legend_pos='38%') +line_bottom = Line() +line_bottom.add("最低气温", attr, [random.randint(20, 100) for i in range(30)], + mark_point=["max", "min"], mark_line=["average"], + is_yaxis_inverse=True, xaxis_pos='top') + +grid = Grid() +grid.add(line_top, grid_bottom='60%') +grid.add(line_bottom, grid_top='50%') +grid.render() +``` +![grid-7](https://user-images.githubusercontent.com/19553554/35089748-d2952178-fc72-11e7-9e1f-105733f793b9.gif) + +Grid+Overlap +```python +from pyecharts import Overlap, Bar, Line, Grid + +grid = Grid() + +attr = ["{}月".format(i) for i in range(1, 13)] +v1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3] +v2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3] +v3 = [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2] + +bar = Bar(width=1200, height=600, title="Overlap+Grid 示例", title_pos="40%") +bar.add("蒸发量", attr, v1) +bar.add("降水量", attr, v2, yaxis_formatter=" ml", yaxis_max=250, + legend_pos="85%", legend_orient="vertical", legend_top="45%") +line = Line() +line.add("平均温度", attr, v3, yaxis_formatter=" °C") +overlap = Overlap() +overlap.add(bar) +overlap.add(line, is_add_yaxis=True, yaxis_index=1) + +grid.add(overlap, grid_right='20%') +grid.render() +``` +![grid-8](https://user-images.githubusercontent.com/19553554/35089754-d62726c4-fc72-11e7-836b-c8cd597e2b71.png) + +**Note:** `Overlap` 放入 `Grid` 可以利用其 grid 网格调整布局,例如上图将图例放在右边,这种情况在**图例名字过长**时很有用。 + + +## Overlap:结合不同类型图表叠加画在同张图上 +> 用户可以自定义结合 Line/Bar/Kline, Scatter/EffectScatter 图表,将不同类型图表画在一张图上。利用第一个图表为基础,往后的数据都将会画在第一个图表上。 +Overlap 类的使用: +1. 引入 `Overlap` 类,`from pyecharts import Overlap` +2. 实例化 `Overlap` 类,`overlap = Overlap()` ,可指定 `page_title`, `width`, `height`, `jhost` 参数。 +3. 使用 `add()` 向 `overlap` 中添加图 +4. 使用 `render()` 渲染生成 .html 文件 + +Overlap.add() 方法签名 +```python +add(chart, + xaxis_index=0, + yaxis_index=0, + is_add_xaxis=False, + is_add_yaxis=False) +``` +* chart -> chart instance + 图表示例 +* xaxis_index -> int + x 坐标轴索引,默认为 0 +* yaxis_index -> int + y 坐标轴索引,默认为 0 +* is_add_xaxis -> bool + 是否新增一个 x 坐标轴,默认为 False +* is_add_yaxis -> bool + 是否新增一个 y 坐标轴,默认为 False + +Overlap 类中其他方法: +* `render_embed()`:在 Flask&Django 中可以使用该方法渲染 +* `show_config()`:打印输出所有配置项 +* `chart`:返回图形实例 +* 在 Jupyter-notebook 中直接调用 Overlap 实例即可显示图表 + +Line + Bar +```python +from pyecharts import Bar, Line, Overlap + +attr = ['A', 'B', 'C', 'D', 'E', 'F'] +v1 = [10, 20, 30, 40, 50, 60] +v2 = [38, 28, 58, 48, 78, 68] +bar = Bar("Line - Bar 示例") +bar.add("bar", attr, v1) +line = Line() +line.add("line", attr, v2) + +overlap = Overlap() +overlap.add(bar) +overlap.add(line) +overlap.render() +``` +![overlap-0](https://user-images.githubusercontent.com/19553554/35090251-0b4c6390-fc74-11e7-829c-079c9cd8c3e5.gif) + +Scatter + EffectScatter +```python +from pyecharts import Scatter, EffectScatter, Overlap + +v1 = [10, 20, 30, 40, 50, 60] +v2 = [30, 30, 30, 30, 30, 30] +v3 = [50, 50, 50, 50, 50, 50] +v4 = [10, 10, 10, 10, 10, 10] +es = EffectScatter("Scatter - EffectScatter 示例") +es.add("es", v1, v2) +scatter = Scatter() +scatter.add("scatter", v1, v3) +es_1 = EffectScatter() +es_1.add("es_1", v1, v4, symbol='pin', effect_scale=5) + +overlap = Overlap() +overlap.add(es) +overlap.add(scatter) +overlap.add(es_1) +overlap.render() +``` +![overlap-1](https://user-images.githubusercontent.com/19553554/35090256-0c49bf54-fc74-11e7-9422-da3296f842e4.gif) + +Kline + Line +```python +import random +from pyecharts import Line, Kline, Overlap + +v1 = [[2320.26, 2320.26, 2287.3, 2362.94], + [2300, 2291.3, 2288.26, 2308.38], + [2295.35, 2346.5, 2295.35, 2345.92], + [2347.22, 2358.98, 2337.35, 2363.8], + [2360.75, 2382.48, 2347.89, 2383.76], + [2383.43, 2385.42, 2371.23, 2391.82], + [2377.41, 2419.02, 2369.57, 2421.15], + [2425.92, 2428.15, 2417.58, 2440.38], + [2411, 2433.13, 2403.3, 2437.42], + [2432.68, 2334.48, 2427.7, 2441.73], + [2430.69, 2418.53, 2394.22, 2433.89], + [2416.62, 2432.4, 2414.4, 2443.03], + [2441.91, 2421.56, 2418.43, 2444.8], + [2420.26, 2382.91, 2373.53, 2427.07], + [2383.49, 2397.18, 2370.61, 2397.94], + [2378.82, 2325.95, 2309.17, 2378.82], + [2322.94, 2314.16, 2308.76, 2330.88], + [2320.62, 2325.82, 2315.01, 2338.78], + [2313.74, 2293.34, 2289.89, 2340.71], + [2297.77, 2313.22, 2292.03, 2324.63], + [2322.32, 2365.59, 2308.92, 2366.16], + [2364.54, 2359.51, 2330.86, 2369.65], + [2332.08, 2273.4, 2259.25, 2333.54], + [2274.81, 2326.31, 2270.1, 2328.14], + [2333.61, 2347.18, 2321.6, 2351.44], + [2340.44, 2324.29, 2304.27, 2352.02], + [2326.42, 2318.61, 2314.59, 2333.67], + [2314.68, 2310.59, 2296.58, 2320.96], + [2309.16, 2286.6, 2264.83, 2333.29], + [2282.17, 2263.97, 2253.25, 2286.33], + [2255.77, 2270.28, 2253.31, 2276.22]] +attr = ["2017/7/{}".format(i + 1) for i in range(31)] +kline = Kline("Kline - Line 示例") +kline.add("日K", attr, v1) +line_1 = Line() +line_1.add("line-1", attr, [random.randint(2400, 2500) for _ in range(31)]) +line_2 = Line() +line_2.add("line-2", attr, [random.randint(2400, 2500) for _ in range(31)]) + +overlap = Overlap() +overlap.add(kline) +overlap.add(line_1) +overlap.add(line_2) +overlap.render() +``` +![overlap-2](https://user-images.githubusercontent.com/19553554/35090261-0e00e804-fc74-11e7-9cae-213f7ea73bd9.png) + +Line + EffectScatter +```python +from pyecharts import Line, EffectScatter, Overlap + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 10, 100] +line = Line("line - es 示例") +line.add("", attr, v1, is_random=True) +es = EffectScatter() +es.add("", attr, v1, effect_scale=8) + +overlap = Overlap() +overlap.add(line) +overlap.add(es) +overlap.render() +``` +![overlap-4](https://user-images.githubusercontent.com/19553554/35090267-10e673fe-fc74-11e7-981d-7c9db110fbfb.gif) + + +如果想改变轴索引,使其有多 X 轴或者多 Y 轴的话。请看下面 +```python +from pyecharts import Line, Bar, Overlap + +attr = ["{}月".format(i) for i in range(1, 13)] +v1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3] +v2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3] +v3 = [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2] + +bar = Bar(width=1200, height=600) +bar.add("蒸发量", attr, v1) +bar.add("降水量", attr, v2, yaxis_formatter=" ml", + yaxis_interval=50, yaxis_max=250) + +line = Line() +line.add("平均温度", attr, v3, yaxis_formatter=" °C", yaxis_interval=5) + +overlap = Overlap() +# 默认不新增 x y 轴,并且 x y 轴的索引都为 0 +overlap.add(bar) +# 新增一个 y 轴,此时 y 轴的数量为 2,第二个 y 轴的索引为 1(索引从 0 开始),所以设置 yaxis_index = 1 +# 由于使用的是同一个 x 轴,所以 x 轴部分不用做出改变 +overlap.add(line, yaxis_index=1, is_add_yaxis=True) +overlap.render() +``` +![overlap-3](https://user-images.githubusercontent.com/19553554/35090266-0f7d7d96-fc74-11e7-9851-d56777b4114d.gif) + +**Note:** 关于双 Y 轴对齐,可以使用 `yaxis_force_interval` 参数,强制分割成相同份数的刻度。这里有个小技巧,可以先设置 y 轴最大值。举个例子,如果双 y 轴一个最大值为 700,一个最大值为 400。那你可以把两个的 `yaxis_force_interval` 参数分别设置为 140 和 80,那就会都分成均等的 5 份了。 + +如果只是想在单个 .html 按顺序展示图表,推荐使用 ```Page()``` 类 + +## Page:同一网页按顺序展示多图 +> Grid/Timeline/Overlap 都可在 Page 中正常展示,把其当做一个图加入到 Page 中即可 + +Page 类的使用: +1. 引入 `Page` 类,`from pyecharts import Page` +2. 实例化 `Page` 类,`page = Page()` ,可指定 `page_title`, `jhost` 参数。 +3. 使用 `add()` 向 `page` 中添加图,可以是单个图实例,也可以是一个图实例列表。 +4. 使用 `render()` 渲染生成 .html 文件 + +Page 类中其他方法: +* `render_embed()`:在 Flask&Django 中可以使用该方法渲染 +* `show_config()`:打印输出所有配置项 +* `chart`:chart 属性返回图形实例 +* 在 Jupyter-notebook 中直接调用 Page 实例即可显示图表 + +```python +#coding=utf-8 +from __future__ import unicode_literals + +from pyecharts import Bar, Scatter3D +from pyecharts import Page + + +page = Page() # step 1 + +# bar +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +bar = Bar("柱状图数据堆叠示例") +bar.add("商家A", attr, v1, is_stack=True) +bar.add("商家B", attr, v2, is_stack=True) +page.add(bar) # step 2 + +# scatter3D +import random +data = [ + [random.randint(0, 100), + random.randint(0, 100), + random.randint(0, 100)] for _ in range(80) +] +range_color = [ + '#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] +scatter3D = Scatter3D("3D 散点图示例", width=1200, height=600) +scatter3D.add("", data, is_visualmap=True, visual_range_color=range_color) +page.add(scatter3D) # step 2 + +page.render() # step 3 +``` +运行之后,你会发现 render.html 已经按顺序显示了两个图: + +![multiple-charts-0](https://user-images.githubusercontent.com/19553554/35104303-658f9654-fca3-11e7-9a05-5e2e13d1a4c4.gif) + +当然,更多图也是可以的 +```python +#coding=utf-8 +from __future__ import unicode_literals + +from pyecharts import Line, Pie, Kline, Radar +from pyecharts import Page + + +page = Page() + +# line +attr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] +line = Line("折线图示例") +line.add("最高气温", attr, [11, 11, 15, 13, 12, 13, 10], + mark_point=["max", "min"], mark_line=["average"]) +line.add("最低气温", attr, [1, -2, 2, 5, 3, 2, 0], + mark_point=["max", "min"], mark_line=["average"]) +page.add(line) + +# pie +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [11, 12, 13, 10, 10, 10] +pie = Pie("饼图-圆环图示例", title_pos='center') +pie.add("", attr, v1, radius=[40, 75], label_text_color=None, + is_label_show=True, legend_orient='vertical', legend_pos='left') +page.add(pie) + +# kline +v1 = [[2320.26, 2320.26, 2287.3, 2362.94], + [2300, 2291.3, 2288.26, 2308.38], + [2295.35, 2346.5, 2295.35, 2345.92], + [2347.22, 2358.98, 2337.35, 2363.8], + [2360.75, 2382.48, 2347.89, 2383.76], + [2383.43, 2385.42, 2371.23, 2391.82], + [2377.41, 2419.02, 2369.57, 2421.15], + [2425.92, 2428.15, 2417.58, 2440.38], + [2411, 2433.13, 2403.3, 2437.42], + [2432.68, 2334.48, 2427.7, 2441.73], + [2430.69, 2418.53, 2394.22, 2433.89], + [2416.62, 2432.4, 2414.4, 2443.03], + [2441.91, 2421.56, 2418.43, 2444.8], + [2420.26, 2382.91, 2373.53, 2427.07], + [2383.49, 2397.18, 2370.61, 2397.94], + [2378.82, 2325.95, 2309.17, 2378.82], + [2322.94, 2314.16, 2308.76, 2330.88], + [2320.62, 2325.82, 2315.01, 2338.78], + [2313.74, 2293.34, 2289.89, 2340.71], + [2297.77, 2313.22, 2292.03, 2324.63], + [2322.32, 2365.59, 2308.92, 2366.16], + [2364.54, 2359.51, 2330.86, 2369.65], + [2332.08, 2273.4, 2259.25, 2333.54], + [2274.81, 2326.31, 2270.1, 2328.14], + [2333.61, 2347.18, 2321.6, 2351.44], + [2340.44, 2324.29, 2304.27, 2352.02], + [2326.42, 2318.61, 2314.59, 2333.67], + [2314.68, 2310.59, 2296.58, 2320.96], + [2309.16, 2286.6, 2264.83, 2333.29], + [2282.17, 2263.97, 2253.25, 2286.33], + [2255.77, 2270.28, 2253.31, 2276.22]] +kline = Kline("K 线图示例") +kline.add("日K", ["2017/7/{}".format(i + 1) for i in range(31)], v1) +page.add(kline) + +# radar +schema = [ + ("销售", 6500), ("管理", 16000), ("信息技术", 30000), + ("客服", 38000), ("研发", 52000), ("市场", 25000) +] +v1 = [[4300, 10000, 28000, 35000, 50000, 19000]] +v2 = [[5000, 14000, 28000, 31000, 42000, 21000]] +radar = Radar("雷达图示例") +radar.config(schema) +radar.add("预算分配", v1, is_splitline=True, is_axisline_show=True) +radar.add("实际开销", v2, label_color=["#4e79a7"], is_area_show=False, + legend_selectedmode='single') +page.add(radar) + +page.render() +``` +![multiple-charts-1](https://user-images.githubusercontent.com/19553554/35104305-66f2a766-fca3-11e7-8ffd-8e85911fdea5.gif) + + +## Timeline:提供时间线轮播多张图 + +Timeline 类的使用: +1. 引入 `Timeline` 类,`from pyecharts import Timeline` +2. 实例化 `Timeline` 类 +3. 使用 `add()` 向 `timeline` 中添加图。如 `add(bar, '2013')` 接受两个参数,第一个为图实例,第二个为时间线的 ”时间点“。 +4. 使用 `render()` 渲染生成 .html 文件 + +实例化 Timeline 类时接受设置参数: + +* page_title -> str + 生成 html 文件的 `<title>` 标签的值,默认为'Echarts' +* width -> int + 画布宽度,默认为 800 +* height -> int + 画布高度,默认为 400 +* jhost -> str + 自定义每个实例的 JavaScript host +* is_auto_play -> bool + 是否自动播放,默认为 Flase +* is_loop_play -> bool + 是否循环播放,默认为 True +* is_rewind_play -> bool + 是否方向播放,默认为 Flase +* is_timeline_show -> bool + 是否显示 timeline 组件。默认为 True,如果设置为false,不会显示,但是功能还存在。 +* timeline_play_interval -> int + 播放的速度(跳动的间隔),单位毫秒(ms)。 +* timeline_symbol -> str + 标记的图形。ECharts 提供的标记类型包括 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow' +* timeline_symbol_size -> int/list + 标记的图形大小,可以设置成诸如 10 这样单一的数字,也可以用数组分开表示宽和高,例如 [20, 10] 表示标记宽为 20,高为 10。 +* timeline_left -> int/str + timeline 组件离容器左侧的距离。 + left 的值可以是像 20 这样的具体像素值,可以是像 '20%' 这样相对于容器高宽的百分比,也可以是 'left', 'center', 'right'。如果 left 的值为'left', 'center', 'right',组件会根据相应的位置自动对齐。 +* timeline_right -> int/str + timeline 组件离容器右侧的距离。同 left +* timeline_top -> int/str + timeline 组件离容器顶侧的距离。同 left +* timeline_bottom -> int/str + timeline 组件离容器底侧的距离。同 left + +Timeline 类中其他方法: +* `render_embed()`:在 Flask&Django 中可以使用该方法渲染 +* `show_config()`:打印输出所有配置项 +* `chart`:chart 属性返回图形实例 +* Timeline 在 Jupyter-notebook 中显示有问题(无法正常显示动画) + +```python +from pyecharts import Bar, Timeline + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +bar_1 = Bar("2012 年销量", "数据纯属虚构") +bar_1.add("春季", attr, [randint(10, 100) for _ in range(6)]) +bar_1.add("夏季", attr, [randint(10, 100) for _ in range(6)]) +bar_1.add("秋季", attr, [randint(10, 100) for _ in range(6)]) +bar_1.add("冬季", attr, [randint(10, 100) for _ in range(6)]) + +bar_2 = Bar("2013 年销量", "数据纯属虚构") +bar_2.add("春季", attr, [randint(10, 100) for _ in range(6)]) +bar_2.add("夏季", attr, [randint(10, 100) for _ in range(6)]) +bar_2.add("秋季", attr, [randint(10, 100) for _ in range(6)]) +bar_2.add("冬季", attr, [randint(10, 100) for _ in range(6)]) + +bar_3 = Bar("2014 年销量", "数据纯属虚构") +bar_3.add("春季", attr, [randint(10, 100) for _ in range(6)]) +bar_3.add("夏季", attr, [randint(10, 100) for _ in range(6)]) +bar_3.add("秋季", attr, [randint(10, 100) for _ in range(6)]) +bar_3.add("冬季", attr, [randint(10, 100) for _ in range(6)]) + +bar_4 = Bar("2015 年销量", "数据纯属虚构") +bar_4.add("春季", attr, [randint(10, 100) for _ in range(6)]) +bar_4.add("夏季", attr, [randint(10, 100) for _ in range(6)]) +bar_4.add("秋季", attr, [randint(10, 100) for _ in range(6)]) +bar_4.add("冬季", attr, [randint(10, 100) for _ in range(6)]) + +bar_5 = Bar("2016 年销量", "数据纯属虚构") +bar_5.add("春季", attr, [randint(10, 100) for _ in range(6)]) +bar_5.add("夏季", attr, [randint(10, 100) for _ in range(6)]) +bar_5.add("秋季", attr, [randint(10, 100) for _ in range(6)]) +bar_5.add("冬季", attr, [randint(10, 100) for _ in range(6)], is_legend_show=True) + +timeline = Timeline(is_auto_play=True, timeline_bottom=0) +timeline.add(bar_1, '2012 年') +timeline.add(bar_2, '2013 年') +timeline.add(bar_3, '2014 年') +timeline.add(bar_4, '2015 年') +timeline.add(bar_5, '2016 年') +timeline.render() +``` +![timeline-0](https://user-images.githubusercontent.com/19553554/35082279-e111743c-fc53-11e7-9362-580160593715.gif) + +```python +from pyecharts import Pie, Timeline + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +pie_1 = Pie("2012 年销量比例", "数据纯属虚构") +pie_1.add("秋季", attr, [randint(10, 100) for _ in range(6)], + is_label_show=True, radius=[30, 55], rosetype='radius') + +pie_2 = Pie("2013 年销量比例", "数据纯属虚构") +pie_2.add("秋季", attr, [randint(10, 100) for _ in range(6)], + is_label_show=True, radius=[30, 55], rosetype='radius') + +pie_3 = Pie("2014 年销量比例", "数据纯属虚构") +pie_3.add("秋季", attr, [randint(10, 100) for _ in range(6)], + is_label_show=True, radius=[30, 55], rosetype='radius') + +pie_4 = Pie("2015 年销量比例", "数据纯属虚构") +pie_4.add("秋季", attr, [randint(10, 100) for _ in range(6)], + is_label_show=True, radius=[30, 55], rosetype='radius') + +pie_5 = Pie("2016 年销量比例", "数据纯属虚构") +pie_5.add("秋季", attr, [randint(10, 100) for _ in range(6)], + is_label_show=True, radius=[30, 55], rosetype='radius') + +timeline = Timeline(is_auto_play=True, timeline_bottom=0) +timeline.add(pie_1, '2012 年') +timeline.add(pie_2, '2013 年') +timeline.add(pie_3, '2014 年') +timeline.add(pie_4, '2015 年') +timeline.add(pie_5, '2016 年') +timeline.render() +``` +![timeline-1](https://user-images.githubusercontent.com/19553554/35082282-e517c842-fc53-11e7-8727-0e53686c3703.gif) + +```python +from pyecharts import Bar, Line, Timeline, Overlap + +attr = ["{}月".format(i) for i in range(1, 7)] +bar = Bar("1 月份数据", "数据纯属虚构") +bar.add("bar", attr, [randint(10, 50) for _ in range(6)]) +line = Line() +line.add("line", attr, [randint(50, 80) for _ in range(6)]) +overlap = Overlap() +overlap.add(bar) +overlap.add(line) + +bar_1 = Bar("2 月份数据", "数据纯属虚构") +bar_1.add("bar", attr, [randint(10, 50) for _ in range(6)]) +line_1 = Line() +line_1.add("line", attr, [randint(50, 80) for _ in range(6)]) +overlap_1 = Overlap() +overlap_1.add(bar_1) +overlap_1.add(line_1) + +bar_2 = Bar("3 月份数据", "数据纯属虚构") +bar_2.add("bar", attr, [randint(10, 50) for _ in range(6)]) +line_2 = Line() +line_2.add("line", attr, [randint(50, 80) for _ in range(6)]) +overlap_2 = Overlap() +overlap_2.add(bar_2) +overlap_2.add(line_2) + +bar_3 = Bar("4 月份数据", "数据纯属虚构") +bar_3.add("bar", attr, [randint(10, 50) for _ in range(6)]) +line_3 = Line() +line_3.add("line", attr, [randint(50, 80) for _ in range(6)]) +overlap_3 = Overlap() +overlap_3.add(bar_3) +overlap_3.add(line_3) + +bar_4 = Bar("5 月份数据", "数据纯属虚构") +bar_4.add("bar", attr, [randint(10, 50) for _ in range(6)]) +line_4 = Line() +line_4.add("line", attr, [randint(50, 80) for _ in range(6)]) +overlap_4 = Overlap() +overlap_4.add(bar_4) +overlap_4.add(line_4) + +timeline = Timeline(timeline_bottom=0) +timeline.add(overlap.chart, '1 月') +timeline.add(overlap_1.chart, '2 月') +timeline.add(overlap_2.chart, '3 月') +timeline.add(overlap_3.chart, '4 月') +timeline.add(overlap_4.chart, '5 月') +timeline.render() +``` +![timeline-2](https://user-images.githubusercontent.com/19553554/35082284-e704cfa6-fc53-11e7-8790-f92eb6b2315f.gif) + + +# 统一风格 +> 为了简化配置项编写,提供了一个 Style 类,可用于在同一个图或者多个图内保持统一的风格 + +### 初始化图时 +```python +from pyecharts import Style + +style = Style( + title_color="#fff", + title_pos="center", + width=1100, + height=600, + background_color='#404a59' +) +# style,init_style 会返回类初始化的风格配置字典 +geo = Geo("全国主要城市空气质量", "data from pm2.5", **style.init_style) +``` + +### 增加图例时 +```python +pie = Pie('各类电影中"好片"所占的比例', "数据来着豆瓣", title_pos='center') +# 使用 Style.add() 可配置增加图例的风格配置字典 +pie_style = style.add( + radius=[18, 24], + label_pos="center", + is_label_show=True, + label_text_color=None +) +pie.add("", ["剧情", ""], [25, 75], center=[10, 30], **pie_style) +pie.add("", ["奇幻", ""], [24, 76], center=[30, 30], **pie_style) +pie.add("", ["爱情", ""], [14, 86], center=[50, 30], **pie_style) +pie.add("", ["惊悚", ""], [11, 89], center=[70, 30], **pie_style) +``` +这样会使得每个图例都会按照设定的风格 + +# 关于项目 + +* 欢迎提交 ISSUE 和 PR +* 如有想单独讨论的话可以使用邮箱 -> chenjiandongx@qq.com +* 关注 [changelog.md](https://github.com/pyecharts/pyecharts/blob/master/changelog.md) diff --git a/docs/zh-cn/customize_map.md b/docs/zh-cn/customize_map.md new file mode 100644 index 000000000..90e5a29d2 --- /dev/null +++ b/docs/zh-cn/customize_map.md @@ -0,0 +1,231 @@ +> 地图自定义篇:考虑到项目更好的通用性,以及更好可扩展性,所以决定对地图部分提供自定义模式。适用在 pyecharts v0.1.9.7 以后的版本。 + +> Echarts 官方地图下载地址 [download-map](http://echarts.baidu.com/download-map.html) 已经暂时关闭 + +## 如何获得更多地图 + +自从 0.3.2 开始,为了缩减项目本身的体积以及维持 pyecharts 项目的轻量化运行,pyecharts 将不再自带地图 js 文件。如用户需要用到地图图表,可自行安装对应的地图文件包。下面介绍如何安装。 + +1. [全球国家地图](https://echarts-maps.github.io/echarts-countries-js/): [echarts-countries-pypkg](https://github.com/pyecharts/echarts-countries-pypkg) (1.9MB): 世界地图和 213 个国家,包括中国地图 +2. [中国省级地图](https://echarts-maps.github.io/echarts-china-provinces-js/): [echarts-china-provinces-pypkg](https://github.com/pyecharts/echarts-china-provinces-pypkg) (730KB):23 个省,5 个自治区 +3. [中国市级地图](https://echarts-maps.github.io/echarts-china-cities-js/): [echarts-china-cities-pypkg](https://github.com/pyecharts/echarts-china-cities-pypkg) (3.8MB):370 个中国城市 + +需要这些地图的朋友,可以装 pip 命令行: + +``` +pip install echarts-countries-pypkg +pip install echarts-china-provinces-pypkg +pip install echarts-china-cities-pypkg +``` + +特别注明,中国地图在 echarts-countries-pypkg 里。 + + +## 如何制作自己的地图扩展 + +你需要做两个 github 项目:一个是 npm 项目,提供所有的 javascript 脚本;另一个是 python 项目,把前一个项目变成可以用 pip 装的 python 包。 + +### npm 项目 + +这个项目首先必须是一个 npm 的项目,并已经启动 gh-pages 来提供地图库。如果未启动 gh-pages , 那么 +你的 jupyter 用户不能把 ipynb 下载成 html ,因为下载之后地图将无法显示。 + +首先,你需要得到以下的项目: + +``` +pip install yehua +git clone https://github.com/echarts-maps/echarts-js-mobans.git +export YEHUA_FILE=/ABSOLUTE/PATH/TO/echarts-js-mobans/yehua.yml +``` + +然后你需要移步到你的工作文件夹,以 echarts-united-kingdom-js 为例子运行这个命令 + +``` +$ yh +Yehua will walk you through creating a echarts-maps js package. +Press ^C to quit at any time. + +project name: echarts-united-kingdom-js +description: UK maps for echarts +license: MIT +author: C.W. +All done!! project echarts-united-kingdom-js is created +``` + +文件已经产生了,让我们看看是哪些文件: + +``` +pyecharts-host:tmp chfw$ cd echarts-united-kingdom-js/ +pyecharts-host:echarts-united-kingdom-js chfw$ ls +echarts-united-kingdom-js package.json registry.json +``` + +现在讲原理。一个 echarts-js 包需要以下的文件结构 + + +``` ++ echarts-united-kingdom-js + + registry.json + + package.json + + echarts-united-kingdom-js + + london.js + + manchester.js + + index.js + + other files +``` + +在 registry.json 里,需要填写的东西是和 pyecharts 衔接的必要信息。 +``` +{ + "JUPYTER_URL": "/nbextensions/echarts-united-kingdom-js", + "GITHUB_URL": "https://your.github.io/echarts-united-kingdom-js/echarts-united-kingdoms-js", + "JUPYTER_ENTRY": "echarts-united-kingdom-js/index", + "JS_FOLDER": "echarts-united-kingdoms-js", + "PINYIN_MAP": { + "伦敦": "lundun", + "曼彻斯特": "manqiesite" + }, + "FILE_MAP": { + "lundun": "london", + "manqiesite": "manchester" + } +} +``` + +index.js 只为 jupyter notebook 而存在 +``` +define(["require", "exports"], function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var version = '1.0.0'; + function load_ipython_extension() { + console.log("echarts-united-kingdom-js " + version + " has been loaded"); + } + exports.load_ipython_extension = load_ipython_extension; +}); + +好了,在 echarts-united-kingdom-js 子文件夹里就需要放地图文件了。每放一个呢,请记住更新 PINYI_MAP 和 FILE_MAP。 + +``` + +### python 项目 + +首先,你需要得到以下的项目: + +``` +pip install yehua +git clone https://github.com/pyecharts/pypkg-mobans.git +export YEHUA_FILE=/ABSOLUTE/PATH/TO/pypkg-mobans/yehua.yml +``` + +然后你需要移步到你的工作文件夹,以 echarts-united-kingdom-pykg 为例子运行这个命令 + +``` +$ yh +Yehua will walk you through creating a pyecharts pypkg package. +Press ^C to quit at any time. + +project name: echarts-united-kingdom-pypkg +npm project name: echarts-united-kingdom-js +description: pyecharts map extension - united kingdom maps - python package +license: MIT +author: C.W. +contact email: wangc_2011@hotmail.com +github profile/organisation: chfw +copyright owner: C.W. +Cloning into 'mobans'... +remote: Counting objects: 214, done. +remote: Compressing objects: 100% (11/11), done. +remote: Total 214 (delta 8), reused 12 (delta 5), pack-reused 198 +Receiving objects: 100% (214/214), 30.31 KiB | 17.00 KiB/s, done. +Resolving deltas: 100% (126/126), done. +Templating CUSTOM_README.rst.jj2 to README.rst +Templating custom_setup.py.jj2 to setup.py +Templating requirements.txt.jj2 to requirements.txt +Templating tests/custom_requirements.txt.jj2 to tests/requirements.txt +Templating docs/source/conf.py.jj2 to docs/source/conf.py +Templating test.script.jj2 to test.sh +Templating _version.py.jj2 to echarts_united_kingdom_pypkg/_version.py +Templating gitignore.jj2 to .gitignore +Templating travis.yml.jj2 to .travis.yml +Templated 9 files. +Initialized empty Git repository in /private/tmp/echarts-united-kingdom-pypkg/.git/ +Please review changes before commit! +``` + +这个时候,这个扩展包的骨架就已经做好了。我们现在做最后一步: + + +``` +pyecharts-host:tmp chfw$ cd echarts-united-kingdom-pypkg/ +git submodule add https://github.com/your/npm/project your_project_name_pypkg/resources +git submodule init +``` + +请把需要的文件加入 git, 然后做: + +``` +git commit +``` + +这样呢,这个包就可以放在 github 上了。 + + +## 如何手动添加(0.1.9.7+) +下面就以广东省汕头市南澳县地图为例,说明如何自行添加地图。 + +### 保存地图文件 +先下载南澳县地图的 JS 文件,请更名为 nanao.js。将其保存在项目安装目录下的 templates/js/echarts 文件夹中。Windows 下一般为 Lib/site-packages/pyecharts/templates/js/echarts + +然后呢,在你的代码里需要加下面的两行 + +``` +import pyecharts.constants as constants + +constants.CITY_NAME_PINYIN_MAP['南澳县'] = 'nanao' +``` + +请注意格式:关键词是“南澳县”,对应的文件名是"nanao", 并且不加'js'后缀。下面是所有的代码 + +```python +# coding=utf-8 +from __future__ import unicode_literals + +from pyecharts import Map +import pyecharts.constants as constants + +constants.CITY_NAME_PINYIN_MAP['南澳县']='nanao' + +value = [] +attr = [] +map = Map("南澳县地图示例", width=1200, height=600) +map.add("", attr, value, maptype='南澳县', is_visualmap=True, visual_text_color='#000') +map.render() +``` + +如果只是使用 render() 生成 .html 文件的话到这里就可以了。还想要在 jupyter-notebook 上展示地图的话,还需要下面一个步骤。 + +``` +$ jupyter nbextensions install --user [python lib dir]/site-packages/pyecharts/templates/js/echarts +... +Copying: .../echarts/nanao.js -> /.../jupyter/nbextensions/echarts/nanao.js +... + To initialize this nbextension in the browser every time the notebook (or other app) loads: + + jupyter nbextension enable <the entry point> +``` + +请特别注意,`[python lib dir]/site-packages/pyecharts/templates/js/echarts`路径后面不加`/`. + +你可以选择性的执行下面的语句。如果你已经装了 0.1.9.7+ 在你现在的 Python 环境,就可以跳过 + +``` +jupyter nbextension enable echarts/main +``` + +然后,让我们检查以下是否已经装上了。请先运行 Jupyter-notebook,再打开这个链接:http://localhost:8889/nbextensions/echarts/nanao.js。 +如果能下载到,那就祝贺你,成功了。否则,请检查你的步骤。 + +![customize-map-2](https://user-images.githubusercontent.com/19553554/35104708-9d88455a-fca4-11e7-8fb1-1aff8e0066ef.png) + + diff --git a/docs/zh-cn/developer.md b/docs/zh-cn/developer.md new file mode 100644 index 000000000..5bf37498b --- /dev/null +++ b/docs/zh-cn/developer.md @@ -0,0 +1,70 @@ +> 开发者篇:本文档介绍了关于 pyecharts 开发的一些情况。 + +## 开始研发 pyecharts + +请用下面命令 +``` +git clone https://github.com/pyecharts/pyecharts.git +pip install -r requirements.txt +python setup.py install +``` + +## pyecharts 0.3.2+ 的扩展包 + +现在 pyecharts 所有的 js 库均由 lml 管理,由 pip 组装。 Jupyter notebook 用户不用担心,javascript 库装机的时候,会被 pyecharts-jupyter-installer 一齐装上。 + +![map-extension-architecture-diagram](https://github.com/chenjiandongx/pyecharts/blob/master/images/map-extension-architecture.png) + +如果有更多需求,比如世界各国地图,请关注本项目。 + +## pyecharts 0.3.2+ 的扩展包启动顺序 + +[lml](http://lml.readthedocs.io/en/latest/index.html) 是支持松散包管理的 python 包。它的特点是支持扩展包搭积木式的架构:装了某包,就增加功能;不装,不影响主体库的运转。主体包启动的时候,lml 提供扩展包搜索程序,实现扩展包的动态合体。 + +![map-extension-architecture-diagram](https://github.com/chenjiandongx/pyecharts/blob/master/images/loading_sequence.png) + +需要更多信息,请看[教学实例](http://lml.readthedocs.io/en/latest/api_tutorial.html)。 + +jupyter-echarts 是一个前端项目,如果你对前端这方面还不太熟悉的话,建议找相关的教程学习一下。 + +### 向 jupyter-echarts 中新增你的内容 + +克隆远程仓库 + +``` +git clone https://github.com/chfw/jupyter-echarts.git +``` + +然后执行 + +``` +npm install --save your_javascript_library +``` + +编辑 gulp.js 文件 + +``` +... +FILES = [ + './node_modules/echarts/dist/echarts.min.js', + './node_modules/echarts/map/js/china.js', + './node_modules/your_library/dist/min_version.js' <--- +``` + +最后运行 + +``` +$ gulp +``` + +最重要的是提交更新内容,你需要将它同步至 jupyter-echarts,如果没有权限的话,那就提交一个 PR 吧。 + +## 前端编程与 Python + +在前端编程领域,没有人会去手动下载和更新 js/css 文件。[npm](https://docs.npmjs.com/getting-started/what-is-npm) 是一个 node.js 的包管理助手,用于帮助前端编程人员去自动化管理 js/css 模块。 + +当然,还有其他优秀的类似的工具 如 [bower](https://bower.io), [jspm](https://jspm.io) 等等。[gulp](https://gulpjs.com) 是 node.js 中的 `make` 命令,gulpfile.js 是 gulp 的 `Makefile`,你将会使用 js 来编写这些命令。这些优秀的工具可以帮助你自动化管理 js/css 模块,就像 Python 世界的 `pip` 工具。 + +那现在的前端编程主要在码些什么呢?答案就是 [pug file](https://pugjs.org/api/getting-started.html)/[HAML file](http://haml.info), [sass file](http://sass-lang.com) 和 [coffeescript](http://coffeescript.org)/[typescript](http://www.typescriptlang.org) ,编写这些文件经编译后就会成为 html/css/js 文件了,现在编写网页变成是一个软件工程师干的活了。而面向对象编程,代码复用以及设计 css 属性接口这些事才是前端编程人员的日常工作。 + +以上是对前端编程的一个简介,node.js 世界有很多很棒的项目,工具以及开发者。期待你去挖掘和发现更多精彩的东西! \ No newline at end of file diff --git a/docs/zh-cn/django.md b/docs/zh-cn/django.md new file mode 100644 index 000000000..4bdd457b5 --- /dev/null +++ b/docs/zh-cn/django.md @@ -0,0 +1,202 @@ +> 本指南按照 Django [官方教程](https://docs.djangoproject.com/en/1.11/intro/tutorial01/),通过完成一个 Django 小项目来说明如何在 Django 中使用 pyecharts。如果对 Django 还不太熟悉的开发者,可仔细阅读官方提供的最新文档。 + + +## Step 0: 使用新的 virtualenv 环境 +建议开发者使用 1.11.4 版本的 Django + +```shell +$ virtualenv --no-site-packages pyecharts-env +$ source pyecharts-env/bin/activate +$ pip install django==1.11.4 +$ pip install pyecharts +``` + + +## Step 1: 新建一个 django 项目 + +```shell +$ django-admin startproject myechartsite +``` + +创建一个应用程序 + +```shell +$ python manage.py startapp myfirstvis +$ ls +db.sqlite3 manage.py myechartsite myfirstvis +``` + +在 `myechartsite/settings.py` 中注册应用程序 + +```python +# myechartsite/settings.py +... +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'myfirstvis' # <--- +] +... +``` + + +我们先编辑 urls.py.这文件在 Django 里的功能是把前段的 HTTP 需求和后台服务函数挂钩。在 Step3,我们再引入后端服务函数 + +```python +# myfirstvis/urls.py +from django.conf.urls import url + +from . import views + +urlpatterns = [ + url(r'^$', views.index, name='index'), +] +``` + +在 `myechartsite/urls.py` 中新增 'myfirstvis.urls' + +```python +myechartsite/urls.py +from django.conf.urls import include, url +from django.contrib import admin + +urlpatterns = [ + url(r'^admin/', admin.site.urls), + url(r'myfirstvis/', include('myfirstvis.urls')) # <--- +] +``` + + +## Step 2: 处理视图功能部分 + +将下列代码保存到 `myfirstvis/views.py` 中。 + +```python +from __future__ import unicode_literals +import math + +from django.http import HttpResponse +from django.template import loader +from pyecharts import Line3D + + +REMOTE_HOST = "https://pyecharts.github.io/assets/js" + + +def index(request): + template = loader.get_template('myfirstvis/pyecharts.html') + l3d = line3d() + context = dict( + myechart=l3d.render_embed(), + host=REMOTE_HOST, + script_list=l3d.get_js_dependencies() + ) + return HttpResponse(template.render(context, request)) + + +def line3d(): + _data = [] + for t in range(0, 25000): + _t = t / 1000 + x = (1 + 0.25 * math.cos(75 * _t)) * math.cos(_t) + y = (1 + 0.25 * math.cos(75 * _t)) * math.sin(_t) + z = _t + 2.0 * math.sin(75 * _t) + _data.append([x, y, z]) + range_color = [ + '#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] + line3d = Line3D("3D line plot demo", width=1200, height=600) + line3d.add("", _data, is_visualmap=True, + visual_range_color=range_color, visual_range=[0, 30], + is_grid3D_rotate=True, grid3D_rotate_speed=180) + return line3d +``` + +`script_list` 是 Page() 类渲染网页所需要依赖的 echarts js 库,依赖的库的数量取决于所要渲染的图形种类。 + +`host` 是 echarts js 库的地址,默认提供的地址为 https://pyecharts.github.io/assets/js 当然,如果你愿意你也可以改变这个地址,先克隆 https://github.com/pyecharts/assets 然后将 `js` 文件夹挂载在你自己的服务器上即可。 + + + +## Step 3: 为项目提供自己的模板 + +前面的步骤是按照 [tutorial part 1](https://docs.djangoproject.com/en/1.11/intro/tutorial01/),接下来我们跳到 [tutorial part 3](https://docs.djangoproject.com/en/1.11/intro/tutorial03/) + + +Linux/macos 系统 +```shell +$ mkdir templates/myfirstvis -p +``` + +Windows 系统 +在 myfirstvis 目录下,新建 templates/myfirstvis 子目录 + +myfirstvis 目录 +``` +─ myfirstvis + ├── admin.py + ├── apps.py + ├── __init__.py + ├── migrations + │   ├── __init__.py + ├── models.py + ├── templates + │   └── myfirstvis + │   └── pyecharts.html + ├── tests.py + ├── urls.py + └── views.py +``` +将下面 html 模板代码保存为 pyecharts.html,请确保 pyecharts.html 文件的绝对路径为 `<project root>/myfirstvis/templates/myfirstvis` + + +``` +<!-- myfirstvis/templates/pyecharts.html --> +<!DOCTYPE html> +<html> + +<head> + <meta charset="utf-8"> + <title>Proudly presented by PycCharts + {% for jsfile_name in script_list %} + + {% endfor %} + + + + {{ myechart|safe }} + + + +``` + + +## Step 4: 运行项目 + +```shell +$ cd myechartsite +$ python manage.py runserver + +You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. +Run 'python manage.py migrate' to apply them. + +August 08, 2017 - 05:48:38 +Django version 1.11.4, using settings 'myechartsite.settings' +Starting development server at http://127.0.0.1:8000/ +Quit the server with CONTROL-C. +``` + +访问 [http://localhost:8000/myfirstvis/](http://localhost:8000/myfirstvis/),你就可以看到酷炫的 3D 图了 + +![django-0](https://user-images.githubusercontent.com/19553554/35081440-21efcf58-fc4f-11e7-8427-ed73306533e8.gif) + + +## 小结 + +看到了吧,只需要简单的几步就可以使用 pyecharts 创建可视化的图表。Django 官方教程需要七步的这里我们三步就搞定了。 + +具体文档可以参考 pyecharts/docs 文件夹。 diff --git a/docs/zh-cn/donate.md b/docs/zh-cn/donate.md new file mode 100644 index 000000000..42ecac67e --- /dev/null +++ b/docs/zh-cn/donate.md @@ -0,0 +1,12 @@ +> 如果你觉得这个项目帮助到了你,你可以帮作者们买一杯咖啡表示感谢! + +
+   +
+ +
+chfw-zhifubao +chfw-wechat +
+ +这是这个项目的 [赞助者名单](zh-cn/donors),你可以在赞助后将你的 Github 账号发邮件(chenjiandongx@qq.com, wangc_2011@hotmail.com)给作者,作者会将你的名字补充在名单上! diff --git a/docs/zh-cn/donors.md b/docs/zh-cn/donors.md new file mode 100644 index 000000000..8332da44c --- /dev/null +++ b/docs/zh-cn/donors.md @@ -0,0 +1,36 @@ +## 赞助者名单 + +> 感谢大家对 pyecharts 项目的慷慨捐赠!下面是名单,排名不分先后! + +* https://github.com/liuhui9312 +* https://github.com/sssdjj +* https://github.com/rubinliudongpo +* https://github.com/xixihhhhh +* https://github.com/levylll +* https://github.com/AlexanderLiuzm +* https://github.com/ywq111 +* https://github.com/jihu9 +* https://github.com/zhangyudong0215 +* https://github.com/terrylim1986 +* https://github.com/Zurzark +* https://github.com/sunhailin-Leo +* https://github.com/pythoninessence +* https://github.com/yueguangguang +* https://github.com/rovedream +* https://github.com/dhlic +* https://github.com/hust100 +* https://github.com/babybear1992 +* https://github.com/giserpan +* https://github.com/Andor-Z +* https://github.com/virgilliu +* https://github.com/VencentCheung +* https://github.com/zhangyi7456 +* https://github.com/Kunwuwu +* https://github.com/landidu +* https://github.com/tonychenxinyue +* https://github.com/danyubaoqi +* https://github.com/Rayww +* https://github.com/Koooooo-7 +* https://github.com/morgengu +* https://github.com/cmcc11 + diff --git a/docs/zh-cn/faq.md b/docs/zh-cn/faq.md new file mode 100644 index 000000000..bb0906ef1 --- /dev/null +++ b/docs/zh-cn/faq.md @@ -0,0 +1,94 @@ +> FAQ 篇:本文档主要介绍一些常见问题及解决方案 + +**Q:jupyter 绘画大量图后,图表无法显示,并提示 temporarily stop sending output ?** + +A:jupyter-notebook console output 具体提示信息如下: + +``` +IOPub data rate exceeded. + The notebook server will temporarily stop sending output + to the client in order to avoid crashing it. + To change this limit, set the config variable + `--NotebookApp.iopub_data_rate_limit`. +``` + +根据以上的提示,需要修改找到配置文件(通常为 jupyter_notebook_config.py),并修改 iopub_data_rate_limit 为更大的数值。 + +``` +## (bytes/sec) Maximum rate at which messages can be sent on iopub before they +# are limited. +c.NotebookApp.iopub_data_rate_limit = 10000000 +``` + +**Q:在 Jupyter Notebook 使用 download-as 导出 ipynb/png/pdf 等文件后,图表无法显示?** + +A:由于使用 download-as 后,便脱离了 Jupyter Notebook 的环境,无法引用其内的相关 js 文件,因此应当使用在线模式,引用来自 [jupyter-echarts](https://github.com/pyecharts/jupyter-echarts) 或其他有效的远程 js 库。 + +```python +from pyecharts import online + +online() +``` + +**Q:jupyter-notebook 输出问题** + +jupyter notebook 输出后,你的 notebook 离开了本地 jupyter 环境,图片就不能显示了。 +为了解决这个问题,再画图之前,你可以多加两个语句: + +```python +... +from pyecharts import online + +online() +... +``` + +这样,所有的脚本会从 github 下载。如果你连不上 Github, 你可以先把 https://github.com/pyecharts/assets 克隆一下。然后在你自己的服务器上,把整个 js 文件夹挂上去。 + +下面我简单示范一下 + +``` +$ git clone https://github.com/pyecharts/assets +$ cd js +$ python -m http.server # for python 2, use python -m SimpleHTTPServer +Serving HTTP on 0.0.0.0 port 8000 ... +``` + +然后,再把本地服务器加进前面的语句: + +```python +... +from pyecharts import online + +online(host="http://localhost:8000) +... +``` +**Q:Python2 编码问题** +默认的编码类型为 UTF-8,在 Python3 中是没什么问题的,Python3 对中文的支持好很多。但是在 Python2 中,请应用下面的语句,保证没有编码问题: +``` +#!/usr/bin/python +#coding=utf-8 +from __future__ import unicode_literals +``` +前两句告知你的编辑器你用 UTF-8 ([PEP-0263](https://www.python.org/dev/peps/pep-0263/)). 最后一句告知 Python 所有字符是 UTF-8 ([unicode literals](http://python-future.org/unicode_literals.html)) + +**Q:pyecharts 是否支持 jupyterlab?** + +A: 暂不支持。 jupyterlab 应该是下一代 jupyter notebook 的雏形。欢迎大家提交相关 PR。 + +**Q:怎么设置 echarts 主题?** + +A: 主题功能暂时不支持。 + +**Q:如何设置 tooltip 的 formatter 选项为回调函数?** + +A: 目前暂时无法支持。因为暂无法将 python 函数通过 json 转换对应的 js 函数。 + +**Q:为什么安装后还是无法 import Bar,Line 等图形** + +A:请检查是否将测试文件命名为 pyecharts.py,如若是请重命名该文件。 + +**Q:使用 pyinstaller 的单文件模式打包后无法加载 js 等静态文件?** + +A:目前 pyecharts 暂时未开放这部分的API,没有考虑到打包后的资源文件路径的兼容问题。建议使用文件夹/多文件模式。 +如果确实需要使用单文件模式,可参考 [《Python打包工具》](https://kinegratii.github.io/2016/04/23/python-package/) 这篇文章了解相关原理后进行源码修改。 \ No newline at end of file diff --git a/docs/zh-cn/flask.md b/docs/zh-cn/flask.md new file mode 100644 index 000000000..367f211d8 --- /dev/null +++ b/docs/zh-cn/flask.md @@ -0,0 +1,224 @@ +> 本指南会以一个小的 Flask 项目为例,说明如何在 Flask 中使用 pyecharts。请确保你已经安装 Flask,还没安装请执行 ```pip install flask``` 或其他方式安装。 + +## Step 0: 首先新建一个 Flask 项目 + +* Linux/macos 系统 +```shell +$ mkdir flask-echarts +$ cd flask-echarts +$ mkdir templates +``` + +* Windows 系统 +新建一个 flask-echarts 文件夹,在其下新建 templates 子文件夹。 + +## Step 1: 为项目提供自己的模板 + +将下面 html 模板代码保存为 pyecharts.html 文件并移至上一步新建的 templates 文件夹中。 + +```html + + + + + + Proudly presented by ECharts + {% for jsfile_name in script_list %} + + {% endfor %} + + + + {{ myechart|safe }} + + + +``` + +## Step 2: 调用 chart_instance.render_embed() 方法渲染图表 + +请将下面的代码保存为 server.py 文件并移至项目的根目录下。 + +```python +import random + +from pyecharts import Scatter3D +from flask import Flask, render_template + + +app = Flask(__name__) + + +REMOTE_HOST = "https://pyecharts.github.io/assets/js" + +@app.route("/") +def hello(): + s3d = scatter3d() + return render_template('pyecharts.html', + myechart=s3d.render_embed(), + host=REMOTE_HOST, + script_list=s3d.get_js_dependencies()) + + +def scatter3d(): + data = [generate_3d_random_point() for _ in range(80)] + range_color = [ + '#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] + scatter3D = Scatter3D("3D scattering plot demo", width=1200, height=600) + scatter3D.add("", data, is_visualmap=True, visual_range_color=range_color) + return scatter3D + + +def generate_3d_random_point(): + return [random.randint(0, 100), + random.randint(0, 100), + random.randint(0, 100)] +``` +`script_list` 是 Page() 类渲染网页所需要依赖的 echarts js 库,依赖的库的数量取决于所要渲染的图形种类。 + + +`host` 是 echarts js 库的地址,默提供的地址为 https://pyecharts.github.io/assets/js 当然,如果你愿意你也可以改变这个地址,先克隆 https://github.com/pyecharts/assets 然后将 `js` 文件夹挂载在你自己的服务器上即可。 + +此时 flask-echarts 目录下为 +``` +├── server.py +└── templates + └── pyecharts.html +``` + + +## Step 3: 运行项目 + +Linux/macos 系统 +```shell +$ export FLASK_APP=server.py +$ flask run +* Serving Flask app "server" +* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) +``` + +Windows 系统 +```shell +$ set FLASK_APP=server.py +$ flask run +* Serving Flask app "server" +* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) +``` + +效果 + +![flask-0](https://user-images.githubusercontent.com/19553554/35081158-3faa7c34-fc4d-11e7-80c9-2de79371374f.gif) + +## 模板扩展 + +这里对模板进行一些说明,实际上 {{ myechart|safe }} 封装的是 + +```html +
+ +``` + +所以实际组合起来的模板是这样的 + +```html + + + + + + Proudly presented by ECharts + {% for jsfile_name in script_list %} + + {% endfor %} + + + +
+ + + + +``` + +有需要的开发者可以对模板进行更改,这里演示如何使 pyecharts 生成的图可自适应宽度,利用 `resize` 方法。模板修改为如下所示 + +```html + + + + + + Proudly presented by ECharts + {% for jsfile_name in script_list %} + + {% endfor %} + + + +
+ + + + +``` + +代码修改为如下所示 + +```python +from pyecharts import Bar +from pyecharts.utils import json_dumps +from flask import Flask, render_template + + +REMOTE_HOST = "https://pyecharts.github.io/assets/js" + +app = Flask(__name__) + + +@app.route("/") +def hello(): + _bar = bar_chart() + return render_template('pyecharts.html', + chart_id=_bar.chart_id, + host=REMOTE_HOST, + my_width="100%", + my_height=600, + my_option=json_dumps(_bar.options), + script_list=_bar.get_js_dependencies()) + + +def bar_chart(): + bar = Bar("我的第一个图表", "这里是副标题") + bar.add("服装", + ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], + [5, 20, 36, 10, 75, 90]) + return bar + +``` + +效果 + +![flask-1](https://user-images.githubusercontent.com/19553554/35081437-1f42073a-fc4f-11e7-8479-ca2a0581d966.gif) +## 小结 + +可以看到,在 Flask app 中加入 pyecharts 图表只需要简单的几个步骤而已,欢迎尝试更多的图表类型。具体文档可以参考 ```pyecharts/docs``` 文件夹。 diff --git a/docs/zh-cn/gallery.md b/docs/zh-cn/gallery.md new file mode 100644 index 000000000..89b221e89 --- /dev/null +++ b/docs/zh-cn/gallery.md @@ -0,0 +1,108 @@ +用极坐标系画出一个爱心 +```python +import math +from pyecharts import Polar + +data = [] +for i in range(101): + theta = i / 100 * 360 + r = 5 * (1 + math.sin(theta / 180 * math.pi)) + data.append([r, theta]) +hour = [i for i in range(1, 25)] +polar = Polar("极坐标系示例", width=1200, height=600) +polar.add("Love", data, angle_data=hour, boundary_gap=False,start_angle=0) +polar.render() +``` +![example-0](https://user-images.githubusercontent.com/19553554/35080754-8a01a508-fc4a-11e7-8be4-5da46e27103d.png) + + +用极坐标系画出一朵小花 +```python +import math +from pyecharts import Polar + +data = [] +for i in range(361): + t = i / 180 * math.pi + r = math.sin(2 * t) * math.cos(2 * t) + data.append([r, i]) +polar = Polar("极坐标系示例", width=1200, height=600) +polar.add("Flower", data, start_angle=0, symbol=None, axis_range=[0, None]) +polar.render() +``` +![example-1](https://user-images.githubusercontent.com/19553554/35080781-b029db60-fc4a-11e7-8789-a4070845d56a.png) + + +还可以给小花涂上颜色 +```python +import math +from pyecharts import Polar + +data = [] +for i in range(361): + t = i / 180 * math.pi + r = math.sin(2 * t) * math.cos(2 * t) + data.append([r, i]) +polar = Polar("极坐标系示例", width=1200, height=600) +polar.add("Color-Flower", data, start_angle=0, symbol=None, + axis_range=[0, None], area_color="#f71f24", area_opacity=0.6) +polar.render() +``` +![example-2](https://user-images.githubusercontent.com/19553554/35080790-c61a8ac8-fc4a-11e7-9a47-8e352b944358.png) + + +用散点图画出一个爱心 +```python +from pyecharts import Scatter + +scatter = Scatter("散点图示例", width=800, height=480) +v1 ,v2 = scatter.draw("../images/love.png") +scatter.add("Love", v1, v2) +scatter.render() +``` +![example-3](https://user-images.githubusercontent.com/19553554/35080813-eda5885e-fc4a-11e7-9f77-3856dced269e.png) + + +用散点图画出一个火辣的 Bra +```python +from pyecharts import Scatter + +scatter = Scatter("散点图示例", width=1000, height=480) +v1 ,v2 = scatter.draw("../images/cup.png") +scatter.add("Cup", v1, v2) +scatter.render() +``` +![example-4](https://user-images.githubusercontent.com/19553554/35080804-e0a587e4-fc4a-11e7-9b38-f4defac97b37.png) + + +用散点图画出一个性感的 Bra +```python +from pyecharts import Scatter + +scatter = Scatter("散点图示例", width=1000, height=480) +v1 ,v2 = scatter.draw("../images/cup.png") +scatter.add("Cup", v1, v2, label_color=["#000"]) +scatter.render() +``` +![example-5](https://user-images.githubusercontent.com/19553554/35080805-e1eec020-fc4a-11e7-8aa2-2d9d58fce144.png) + + +用极坐标系画出一个蜗牛壳 +```python +import math +from pyecharts import Polar + +data = [] +for i in range(5): + for j in range(101): + theta = j / 100 * 360 + alpha = i * 360 + theta + r = math.pow(math.e, 0.003 * alpha) + data.append([r, theta]) +polar = Polar("极坐标系示例") +polar.add("", data, symbol_size=0, symbol='circle', start_angle=-25, + is_radiusaxis_show=False, area_color="#f3c5b3", + area_opacity=0.5, is_angleaxis_show=False) +polar.render() +``` +![example-6](https://user-images.githubusercontent.com/19553554/35080856-3cc8eaf2-fc4b-11e7-8ba8-5fdc9e3c64e8.png) diff --git a/docs/zh-cn/jupyter_notebook.md b/docs/zh-cn/jupyter_notebook.md new file mode 100644 index 000000000..8e5421da5 --- /dev/null +++ b/docs/zh-cn/jupyter_notebook.md @@ -0,0 +1,61 @@ +# pyecharts 文档 - Jupyter Notebook + +## 概述 + +pyecharts 支持在 Jupyter Notebook 环境中显示渲染图表以及导出其他形式的文件。 + +## 安装 + +在使用以下的命令安装 pyecharts ,如果系统检查有 Jupyter Notebook 环境,将默认的 echarts.min 等文件自动安装到 Jupyter notebook 插件/扩展;否则将跳过这一步骤。 + +```shell +pip install pyecharts +``` + +在之后的开发中也可以使用下列的命令自行安装。 + +```shell +$ git clone https://github.com/pyecharts/jupyter-echarts.git +$ cd jupyter-echarts +$ jupyter nbextension install echarts --user +``` + +无论使用何种方式,均可通过以下的命令测试是否安装成功。 + +```shell +$ jupyter nbextension list +Known nbextensions: + config dir: /Users/jaska/.jupyter/nbconfig + notebook section + echarts/main enabled + - Validating: OK +``` + + + +## 显示图表 + +在 Cell 中,可以直接调用实例本身实例来显示图表,目前所有的类已经实现了 [IPython Rich Display](http://ipython.readthedocs.io/en/stable/config/integrating.html#rich-display) 的 `_repr_html_` 方法。 + +![pandas-numpy](https://user-images.githubusercontent.com/19553554/35104252-3e36cee2-fca3-11e7-8e43-09bbe8dbbd1e.png) + +## 导出功能 + +可以使用 Notebook 默认的 "download as" 导出其他形式的文件,比如 ipynb或者图片。 + +**重要** :由于导出后的文件脱离了原有 Jupyter Notebook 环境,为了能够完整的显示图表,应当使用远程 jshost 库。 + +```python +from pyecharts import online + +online(host='https://my-site.com') +``` + +## 示例 + +参见 [pyecharts示例](https://github.com/pyecharts/pyecharts-users-cases) 。 + +## jupyterlab + +[jupyterlab](https://github.com/jupyterlab/jupyterlab) 是下一代 Jupyter Notebook ,目前尚处于发展的雏形之中。我们将进一步关注项目发展,尽可能第一时间实现 pyecharts 的适配,敬请期待。 + diff --git a/docs/zh-cn/prepare.md b/docs/zh-cn/prepare.md new file mode 100644 index 000000000..d8a81ef3f --- /dev/null +++ b/docs/zh-cn/prepare.md @@ -0,0 +1,151 @@ +[TOC] + +### 第一个示例 + +**Note:** 推荐使用 pyecharts 的最新版本!! + +首先开始来绘制你的第一个图表 +```python +from pyecharts import Bar + +bar = Bar("我的第一个图表", "这里是副标题") +bar.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90]) +bar.print_echarts_options() +bar.render() +``` +![guide-0](https://user-images.githubusercontent.com/19553554/35103909-3ee41ba2-fca2-11e7-87be-1a3585b9e0fa.png) + + +* ```add()``` + 主要方法,用于添加图表的数据和设置各种配置项 +* ```show_config()``` + 打印输出图表的所有配置项 +* ```render()``` + 默认将会在根目录下生成一个 render.html 的文件,支持 path 参数,设置文件保存位置,如 render(r"e:\my_first_chart.html"),文件用浏览器打开。 + +**Note:** 可以按右边的下载按钮将图片下载到本地,如果想要提供更多实用工具按钮,请在 `add()` 中设置 `is_more_utils` 为 True + +```python +from pyecharts import Bar + +bar = Bar("我的第一个图表", "这里是副标题") +bar.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90], + is_more_utils=True) +bar.render() +``` +![guide-1](https://user-images.githubusercontent.com/19553554/35104150-f31e1b7c-fca2-11e7-81cf-a12bf1629e02.png) + +### 使用 pyecharts-snapshot 插件 +如果想直接将图片保存为 png, pdf, gif 格式的文件,可以使用 [pyecharts-snapshot](https://github.com/pyecharts/pyecharts-snapshot)。使用该插件请确保你的系统上已经安装了 node.js 环境,如果没有,请到这里下载 [https://nodejs.org/en/download/](https://nodejs.org/en/download/) + +1. 安装 phantomjs + `npm install -g phantomjs-prebuilt` +2. 安装 pyecharts-snapshot + `pip install pyecharts-snapshot` +3. 引入 pyecharts-snapshot + `from pyecharts_snapshot.main import make_a_snapshot` +4. 调用方法 + `make_a_snapshot('render.html', 'snapshot.png')` + make_a_snapshot() 第一个参数为生成的 .html 文件,第二个参数为要保存的文件,可以为 png/pdf/gif + +更多内容请移步至 [pyecharts-snapshot](https://github.com/pyecharts/pyecharts-snapshot) + + +### 图形绘制过程 +基本上所有的图表类型都是这样绘制的: +1. ```chart_name = Type()``` 初始化具体类型图表。 +2. ```add()``` 添加数据及配置项。 +3. ```render()``` 生成 .html 文件。 + +```add()``` 数据一般为两个列表(长度一致)。 +如果你的数据是字典或者是带元组的字典。可利用 ```cast()``` 方法转换。 + +```python +@staticmethod +cast(seq) +转换数据序列,将带字典和元组类型的序列转换为 k_lst,v_lst 两个列表 +``` +1. 元组列表 + [(A1, B1), (A2, B2), (A3, B3), (A4, B4)] --> k_lst[ A[i1, i2...] ], v_lst[ B[i1, i2...] ] +2. 字典列表 + [{A1: B1}, {A2: B2}, {A3: B3}, {A4: B4}] --> k_lst[ A[i1, i2...] ], v_lst[ B[i1, i2...] ] +3. 字典 + {A1: B1, A2: B2, A3: B3, A4: B4} -- > k_lst[ A[i1, i2...] ], v_lst[ B[i1, i2...] ] + +### 多次显示图表 + +> v0.4.0 更新 + +在 pyecharts 可以连续使用 `chart.render` 在同一个脚本中显示多个图表。 + +```python +from pyecharts import Bar, Line + +bar = Bar("我的第一个图表", "这里是副标题") +bar.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90]) +bar.render(path='bar.html') + +line = Line("我的第一个图表", "这里是副标题") +line.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90]) +line.render(path='line.html') +``` + +从 v0.4.0 开始,pyecharts 重构了渲染的内部逻辑,改善效率。推荐使用以下方式显示多个图表。 + +```python +from pyecharts import Bar, Line +from pyecharts.engine import create_default_environment + +bar = Bar("我的第一个图表", "这里是副标题") +bar.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90]) + +line = Line("我的第一个图表", "这里是副标题") +line.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90]) + +env = create_default_environment() + +env.render_chart_to_file(bar, path='bar.html') +env.render_chart_to_file(line, path='line.html') +``` + +相比第一个例子,该代码只是使用同一个引擎对象,减少了部分重复操作,速度有所提高。 + + +### Pandas&Numpy 简单示例 +如果使用的是 Numpy 或者 Pandas,可以参考这个示例 + +![pandas-numpy](https://user-images.githubusercontent.com/19553554/35104252-3e36cee2-fca3-11e7-8e43-09bbe8dbbd1e.png) + +**Note:** 使用 Pandas&Numpy 时,整数类型请确保为 int,而不是 numpy.int32 + +**当然你也可以采用更加酷炫的方式,使用 Jupyter Notebook 来展示图表,matplotlib 有的,pyecharts 也会有的** +**Note:** 从 v0.1.9.2 版本开始,废弃 ```render_notebook()``` 方法,现已采用更加 pythonic 的做法。直接调用本身实例就可以了。 + +比如这样 + +![notebook-0](https://user-images.githubusercontent.com/19553554/35104153-f6256212-fca2-11e7-854c-bacc61eabf6f.gif) + +还有这样 + +![notebook-1](https://user-images.githubusercontent.com/19553554/35104157-fa39e170-fca2-11e7-9738-1547e22914a6.gif) + +如果使用的是自定义类,直接调用自定义类示例即可 + +![notebook-2](https://user-images.githubusercontent.com/19553554/35104165-fe9765da-fca2-11e7-8126-920158616b99.gif) + +更多 Jupyter notebook 的例子请参考 [notebook-use-cases](https://github.com/pyecharts/pyecharts-users-cases)。可下载后运行看看。 + +如需使用 Jupyter Notebook 来展示图表,只需要调用自身实例即可,同时兼容 Python2 和 Python3 的 Jupyter Notebook 环境。所有图表均可正常显示,与浏览器一致的交互体验,这下展示报告连 PPT 都省了!! + + +### 如果在没有互联网的情况下安装 pyecharts 0.3.2 + + +首先,您需要通过有互联网的计算机得到这三个包:pyecharts, pyecharts-jupyter-installer, 和 jupyter-echarts-pypkg. + +然后,按照这个顺序组装: + +``` +pip install pyecharts-jupyter-installer.tar.gz +pip install jupyter-echarts-pypkg.tar.gz +pip install pyecharts.tar.gz +``` diff --git a/docs/zh-cn/release-note/README.md b/docs/zh-cn/release-note/README.md new file mode 100644 index 000000000..c8c0399d8 --- /dev/null +++ b/docs/zh-cn/release-note/README.md @@ -0,0 +1,4 @@ +# 版本日志 + +- [v0.3.2](zh-cn/release-note/v032) +- [v0.3.0](zh-cn/release-note/v030) \ No newline at end of file diff --git a/docs/zh-cn/release-note/_sidebar.md b/docs/zh-cn/release-note/_sidebar.md new file mode 100644 index 000000000..728d9904c --- /dev/null +++ b/docs/zh-cn/release-note/_sidebar.md @@ -0,0 +1,2 @@ +- [v0.3.2](zh-cn/release-note/v032) +- [v0.3.0](zh-cn/release-note/v030) \ No newline at end of file diff --git a/docs/zh-cn/release-note/v030.md b/docs/zh-cn/release-note/v030.md new file mode 100644 index 000000000..5078fba17 --- /dev/null +++ b/docs/zh-cn/release-note/v030.md @@ -0,0 +1,126 @@ +# pyecharts V0.3.0 发布日志 + +pyecharts V0.3.0 发布,这是一个重大更新的版本,新增 **自定义模板** 、 **模板函数** 和 **web 框架整合** 等功能,并修正了一些 Bug。 + + pyecharts V0.3.0 对整个图表渲染和使用场景进行重新思考和设计,重写大量的底层逻辑,使得功能更加明确,代码更加整洁有序。 + +## 1 开放底层模板引擎类 API,支持模板函数 + +新增模板引擎类 `pyecharts.engine.EchartsEnvironment` 和配置类 `pyecharts.conf.PyEchartsConfig`。 + +```python +# coding=utf8 + +from __future__ import unicode_literals + +from pyecharts import Bar +from pyecharts.conf import PyEchartsConfig +from pyecharts.engine import EchartsEnvironment +from pyecharts.utils import write_utf8_html_file + +attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +v1 = [5, 20, 36, 10, 75, 90] +v2 = [10, 25, 8, 60, 20, 80] +bar = Bar("柱状图数据堆叠示例") +bar.add("商家A", attr, v1, is_stack=True) +bar.add("商家B", attr, v2, is_stack=True) +config = PyEchartsConfig(echarts_template_dir='my_tpl', jshost='https://cdn.bootcss.com/echarts/3.6.2') +env = EchartsEnvironment(pyecharts_config=config) +tpl = env.get_template('tpl_demo.html') +html = tpl.render(bar=bar) +write_utf8_html_file('my_tpl_demo2.html', html) +``` + +pyecharts V0.3.0 提供了一些模板函数,这些函数通常接收一个或多个的 `Chart` 或 `Page` 的参数,详细的调用形式见下表。 + +| 标签/调用形式 | F(chart) | F(page) | F(chart1,chart2,...)/F(*page) | +| ----------------------------- | -------- | ------- | ----------------------------- | +| echarts_js_dependencies | ✓ | ✓ | ✓ | +| echarts_js_dependencies_embed | ✓ | ✓ | ✓ | +| echarts_container | ✓ | | | +| echarts_js_content | ✓ | ✓ | ✓ | +| echarts_js_content_wrap | ✓ | ✓ | ✓ | + +## 2 重写图表 render 函数逻辑,新增自定义模板文件 + +render 函数签名为: + +```python +Chart.render( + path='render.html', + template_name='simple_chart.html', + object_name='chart', + extra_context=None +) +``` + +各参数的意义如下: + +- path :最终生成文件名称 +- template_name: 模板文件名称,其目录可通过 `pyecharts.configure()` 全局函数进行配置 +- object_name: 模板文件中,该图表类所使用变量的名称 +- extra_context 额外数据字典。 + +内部实现逻辑也有所变化: + +- 现在每次调用 `render` 函数都会重新创建一个新的模板引擎对象(`jinja2.Environment` 的子类),这在同时渲染多个图表时,耗时有所增加,如果对耗时有所考虑,可依据第1节所述的方式自行创建模板引擎对象。 +- 现在 Python 函数传递给模板的是图表实例本身,而不再是其属性组成的字典。 + +## 3 新增统一配置函数 pyecharts.configure + +新增统一的配置函数 `pyecharts.configure` ,在构建渲染图表之前使用该函数可统一配置你所需要的参数,每个参数都有默认值。 + +原有的 online 不再推荐使用,可用 configure 函数代替。 + +```python +# 旧版本 +pyecharts.online('http://demo') +# 新版本 +pyecharts.configure(jshost='http://demo') +``` + +## 4 支持 js 文件外链引用方式 + +在 HTML 代码中,js 引入方式共有两种,外部链接方式 + +```python + +``` + +内部嵌入方式 + +```python + +``` + +在 V0.2.X 中,pyecharts 只支持内部嵌入方式,即使通过 `pyecharts.online('https://cdn.bootcss.com/echarts/3.7.0')` ,将 js 仓库设置为远程地址,最后生成的 HTML 代码也是使用内部嵌入方式,这不利于 web 项目的整合工作。 + +在 V0.3.0 中,上述行为将默认采用外部链接方式引入 js 文件,但其 js 文件有效性需由使用者自行保证;同时也可以通过 `force_embed` 参数强制采用内部嵌入方式。 + +## 5 Page 支持列表协议和自定义布局 + +`pyecharts.custom.Page` 直接继承 list 类,也能支持长度(len)、索引(index)、切片(splice)、添加(append)、扩展(extend)等操作。 + +相应的,Page 类移除了 charts 属性,目前可直接迭代 Page 对象本身。 + +Page 默认采用纵向列表布局渲染多个图表,可以通过使用自己的模板文件来采用其他布局。 + +## 6 更容易整合 web 框架 + +pyecharts 现在和 web 框架的整合工作变得十分容易,无论你是刚开始开发 web 项目还是整合已有的项目。这主要得益于 python 语言的灵活性和面向对象特点,使得整合工作不会破坏原有的功能和代码层次结构。 + +pyecharts 已经开放内部的 jinja2 模板引擎相关接口,因此从理论上来说,pyecharts 能够胜任那些使用 jinja2 模板引擎的 web 框架。 + +## 7 其他改变 + +其他微小变更,包括变量重命名、函数定义改变等。 + +- `pyecharts.utils.get_resource_dir(*paths)` 目前支持不定参数调用。 +- 图表 width 和 height 支持 '50%' 、'78px' 等其他 css 有效长度形式。 +- `pyecharts.base.json_dumps` 移到 `pyecharts.utils.json_dumps` 。 +- 移除 `pyecharts.template.JINJA2_EVN` 对象。 +- 移除 `pyecharts.constants.CONFIGURATION` 。 + diff --git a/docs/zh-cn/release-note/v032.md b/docs/zh-cn/release-note/v032.md new file mode 100644 index 000000000..b4d1fe796 --- /dev/null +++ b/docs/zh-cn/release-note/v032.md @@ -0,0 +1,62 @@ +# pyecharts V0.3.2 发布日志 + +> pyecharts V0.3.2 发布,这是一个重大更新的版本。 + +## 1 全面重构地图加载方式 + +从本版本开始,为了缩减项目本身的体积以及维持 pyecharts 项目的轻量化运行,pyecharts 将不再自带地图 js 文件。如用户需要用到地图图表,可自行安装对应的地图文件包。下面介绍如何安装。 + +地图文件被分成了国家、省、市三个 Python 包,分别为 + +1. [全球国家地图](https://echarts-maps.github.io/echarts-countries-js/): [echarts-countries-pypkg](https://github.com/pyecharts/echarts-countries-pypkg) (1.9MB): 世界地图和213个国家,包括中国地图 +2. [中国省级地图](https://echarts-maps.github.io/echarts-china-provinces-js/): [echarts-china-provinces-pypkg](https://github.com/pyecharts/echarts-china-provinces-pypkg) (730KB):23个省,5个自治区 +3. [中国市级地图](https://echarts-maps.github.io/echarts-china-cities-js/): [echarts-china-cities-pypkg](https://github.com/pyecharts/echarts-china-cities-pypkg) (3.8MB):370个中国城市 + +安装方式也很简单,可以仅选择所需要的包,也可以全部安装 +``` +$ pip install echarts-countries-pypkg +$ pip install echarts-china-provinces-pypkg +$ pip install echarts-china-cities-pypkg +``` + +地图包由 [lml](https://github.com/chfw/lml) 负责管理和识别, lml 是一个松散的包管理工具,有兴趣的同学可以前往了解。三个包也同时会将 js 文件带入到 notebook 环境中去。 + + +## 2 恢复 online 函数的使用 + +由于考虑到不少用户有将 notebook 保存为 html 文件的做法,所以恢复 online 函数的使用,使用户 .html 即使脱离 notebook 环境也可以挂载到 Github host,确保图形可以正常显示。 + + +## 3 为 Kline 提供 Candlestick 别名 + +现在可以引入 Candlestick 类 +``` +from pyecharts import Candlestick +candlestick = Candlestick("K 线图-自定义标记点风格") +candlestick.add("日K", DATE, data, mark_point=["min", "max"], + mark_point_symbolsize=80, + datazoom_orient='vertical', + mark_line_valuedim=['lowest', 'highest']) +candlestick.render() +``` + +## 4 加入 AppVeyor CI + +一直以来 pyecharts 都只有 Travis CI,而 Travis 又只是针对 Linux 测试,现在加入了 AppVeyor CI,提供了 Windows 平台的测试功能。 + +## 5 pyecharts/assets + +自本版本开始,将不再为 Flask/Django/.. 等 WEB 框架提供 DEFAULT_HOST,但我们为开发者新建了 pyecharts/assets 库挂载 pyecharts 所需要的所有 js 文件,可以使用下面语句替换原来的 DEFAULT_HOST +``` +REMOTE_HOST = "https://pyecharts.github.io/assets/js" +``` + + +## 5 修复了若干 BUG +* [issue#322](https://github.com/pyecharts/pyecharts/issues/322) 修复在 timeline 中不能设置多个 legend 的 bug +* [issue#357](https://github.com/pyecharts/pyecharts/issues/357) 修复 Line 图 symbol 大小不能调整的 bug +* [issue#371](https://github.com/pyecharts/pyecharts/issues/371) 修复 Parallel 图 Line 样式失效的 bug +* [issue#378](https://github.com/pyecharts/pyecharts/issues/378) 修复 Geo 图中当多次 render 时相同 value 值会被叠加的 bug +* [issue#338](https://github.com/pyecharts/pyecharts/issues/338) 修复 timeline 中 map 的 visualmap 组件不能正常显示的 bug + +更多细节内容可移步至 [changelog](http://pyecharts.org/#/zh-cn/changelog) 做进一步了解 diff --git a/docs/zh-cn/release-note/v040.md b/docs/zh-cn/release-note/v040.md new file mode 100644 index 000000000..ede102ed6 --- /dev/null +++ b/docs/zh-cn/release-note/v040.md @@ -0,0 +1,5 @@ +# pyecharts V0.4.0 发布日志 + +> pyecharts V0.4.0 发布,这是一个重大更新的版本。 + +## 1 支持 SVG diff --git a/docs/zh-cn/team.md b/docs/zh-cn/team.md new file mode 100644 index 000000000..57657366a --- /dev/null +++ b/docs/zh-cn/team.md @@ -0,0 +1,27 @@ +# 作者 + +## 开发团队 + +主页: https://github.com/pyecharts + +| 头像 | 用户 | 角色 | +| ------ | ------ | ------ | +| ![chenjiandongx](https://avatars3.githubusercontent.com/u/19553554?s=60&v=4) | [chenjiandongx](https://github.com/chenjiandongx) | Owner | +| |[chfw](https://github.com/chfw) | Member | +| ![kinegratii](https://avatars2.githubusercontent.com/u/9875406?s=60&v=4) | [kinegratii](https://github.com/kinegratii) | Member | + +## 贡献者 + +> 感谢以下童鞋的贡献! + +| 头像 | 用户 | +| ------ | ------ | +| landpack | [landpack](https://github.com/landpack) | +| muxuezi | [muxuezi](https://github.com/muxuezi) | +| 647-coder | [647-coder](https://github.com/647-coder) | +| sd8089730 | [sd8089730](https://github.com/sd8089730) | +| MiracleXYZ | [MiracleXYZ](https://github.com/MiracleXYZ) | +| mowujilun | [mowujilun](https://github.com/mowujilun) | +| xbanke | [xbanke](https://github.com/xbanke) | +| shkey | [shkey](https://github.com/shkey) | +| crispgm | [crispgm](https://github.com/crispgm) | \ No newline at end of file diff --git a/docs/zh-cn/web_integration.md b/docs/zh-cn/web_integration.md new file mode 100644 index 000000000..eedbdd397 --- /dev/null +++ b/docs/zh-cn/web_integration.md @@ -0,0 +1,117 @@ +> 阅读指引: +> +> 1. 本文所述的整合方式适用于 V0.3.0 及其以上的版本。 +> 2. 本文不是一个教程性质的文档,仅描述关键步骤和原理文档。因此在阅读之前,你应当对相关的 web 框架有所了解或者参考示例项目。 + +pyecharts 现在和 web 框架的整合工作变得十分容易,无论你是刚开始开发 web 项目还是整合已有的项目。这主要得益于 python 语言的灵活性和面向对象特点,使得整合工作不会破坏原有的功能和代码层次结构。 + +pyecharts 已经开放内部的 jinja2 模板引擎相关接口,因此从理论上来说,pyecharts 能够胜任那些使用 jinja2 模板引擎的 web 框架。 + +整合工作依据不同的框架和使用场景有不同的具体方法。本文将以 Django 和 Flask 这两个主流框架描述不同方式的整合过程,其他 web 框架可以以此为参考。 + +## Flask + +### 自定义模板引擎 + +Flask 默认采用 jinja2 作为其模板引擎。根据 Flask 文档,可以在 `Flask.jinja_environment` ,指定自己实现的模板引擎类,以实现特定功能。 + +在 Flask 中可按下列步骤实现自己的模板引擎类: + +- 创建一个继承自 `flask.templating.Environment` 的模板引擎类`FlaskEchartsEnvironment` 。 +- 在构造函数 `__init__` 中,为该类添加 `pyecharts_config` 属性, 添加模板函数到全局字典中。 +- 在自己的 Flask 应用类中指定 `FlaskEchartsEnvironment` 为默认模板引擎。 + +```python +from flask import Flask, render_template +from flask.templating import Environment + +from pyecharts import HeatMap +from pyecharts.engine import ECHAERTS_TEMPLATE_FUNCTIONS +from pyecharts.conf import PyEchartsConfig + +class FlaskEchartsEnvironment(Environment): + def __init__(self, *args, **kwargs): + super(FlaskEchartsEnvironment, self).__init__(*args, **kwargs) + self.pyecharts_config = PyEchartsConfig(jshost='https://cdn.bootcss.com/echarts/3.7.2') + self.globals.update(ECHAERTS_TEMPLATE_FUNCTIONS) + +class MyFlask(Flask): + jinja_environment = FlaskEchartsEnvironment + +app = MyFlask(__name__) +``` + +### 模板函数 + +在模板文件中可以使用 `echarts_*` 系列模板函数。 + +```html + + + + + 自定义模板 + {{ echarts_js_dependencies(hm) }} + + +

在 Flask 下使用 echarts_* 系列模板函数(Template Functions)渲染页面。

+ {{ echarts_container(hm) }} + {{ echarts_js_content(hm) }} + + +``` + +上述例子使用 boot CDN 的 js 文件,因此在最后生成 HTML 文件代码时,使用了下面的外链形式。不过需要注意的是,最好请确保你挂载的的服务器有 pyecharts 所需要的所有 js 文件,如对应的地图,3D 图等的 js 文件,这些文件均在 pyecharts/template/js 文件夹里面。 + +```html + +``` + +使用外链形式优点在于: + +- 减少最后生成文件大小 +- 更容易与 web 框架整合,便于大型项目开发 + +### 示例项目 + +示例项目可参考 [Flask_demo](https://github.com/kinegratii/flask_demo), 该项目完全使用本地 echarts 文件。可基于该项目继续开发。 + +## Django + +### 自定义模板引擎 + +自 v1.8 起,Django 支持多模板引擎,内置了对 Jinja2 的支持。pyecharts 内部也是使用 Jinja2 作为其默认的模板引擎。因此二者的整合是非常简单的。 + +首先,需要实现一个返回一个 `jinja2.Environment` 对象的回调函数。下面是仿造 [官方例子](https://docs.djangoproject.com/en/1.11/topics/templates/#django.template.backends.jinja2.Jinja2) 实现的一个例子: + +```python +from django.contrib.staticfiles.storage import staticfiles_storage +from django.urls import reverse + +from pyecharts.conf import PyEchartsConfig +from pyecharts.engine import BaseEnvironment + + +def environment(**options): + env = BaseEnvironment(pyecharts_config=PyEchartsConfig(jshost='/static/'), **options) + # Add template functions to the environment object + env.globals.update({ + 'static': staticfiles_storage.url, + 'url': reverse, + }) + return env + +``` + +其余按照 Django 文档配置 `settings.TEMPLATES` 等变量值。 + +## 总结 + +在整合过程中,主要有两种方式实现自己的模板引擎类: + +- 直接继承 `pyecharts.engine.BaseEnvironment` :如 Django。用于可以直接使用的场景。 +- 手动添加模板函数:如 Flask ,Flask 引擎类`flask.templating.Environment` 重写了 `jinja2.Environment` 相关逻辑,因此应当继承该类,并且手动添加相关模板函数 + +## 其他 + +- 关于 Django 使用了自己的模板引擎,可参考 [django-echarts](https://github.com/kinegratii/django-echarts) 项目。 \ No newline at end of file diff --git a/images/class-relationship-diagram.png b/images/class-relationship-diagram.png new file mode 100644 index 000000000..50b2ef889 Binary files /dev/null and b/images/class-relationship-diagram.png differ diff --git a/images/cup.png b/images/cup.png new file mode 100644 index 000000000..c25cf32d3 Binary files /dev/null and b/images/cup.png differ diff --git a/images/installation-path.png b/images/installation-path.png new file mode 100644 index 000000000..ac646228c Binary files /dev/null and b/images/installation-path.png differ diff --git a/images/loading_sequence.png b/images/loading_sequence.png new file mode 100644 index 000000000..8c0b203b7 Binary files /dev/null and b/images/loading_sequence.png differ diff --git a/images/logo.png b/images/logo.png new file mode 100644 index 000000000..2d4fd1807 Binary files /dev/null and b/images/logo.png differ diff --git a/images/love.png b/images/love.png new file mode 100644 index 000000000..ac8b7fa55 Binary files /dev/null and b/images/love.png differ diff --git a/images/map-extension-architecture.png b/images/map-extension-architecture.png new file mode 100644 index 000000000..9ce615356 Binary files /dev/null and b/images/map-extension-architecture.png differ diff --git a/make.bat b/make.bat new file mode 100644 index 000000000..e5ebac7f6 --- /dev/null +++ b/make.bat @@ -0,0 +1,2 @@ +cd test +nosetests --with-coverage --cover-package pyecharts --cover-package test && cd .. && flake8 --exclude docs --builtins=unicode,xrange,long \ No newline at end of file diff --git a/pyecharts/__init__.py b/pyecharts/__init__.py index 5a5290f77..6b140940d 100644 --- a/pyecharts/__init__.py +++ b/pyecharts/__init__.py @@ -1,18 +1,46 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 +# flake8: noqa +from pyecharts._version import __version__, __author__ + +# charts from pyecharts.charts.bar import Bar +from pyecharts.charts.bar3D import Bar3D +from pyecharts.charts.boxplot import Boxplot from pyecharts.charts.effectscatter import EffectScatter from pyecharts.charts.funnel import Funnel from pyecharts.charts.gauge import Gauge from pyecharts.charts.geo import Geo +from pyecharts.charts.geolines import GeoLines from pyecharts.charts.graph import Graph +from pyecharts.charts.heatmap import HeatMap + +from pyecharts.charts.kline import Kline +Candlestick = Kline + from pyecharts.charts.line import Line +from pyecharts.charts.line3D import Line3D +from pyecharts.charts.liquid import Liquid from pyecharts.charts.map import Map from pyecharts.charts.parallel import Parallel from pyecharts.charts.pie import Pie from pyecharts.charts.polar import Polar from pyecharts.charts.radar import Radar +from pyecharts.charts.sankey import Sankey from pyecharts.charts.scatter import Scatter +from pyecharts.charts.scatter3D import Scatter3D +from pyecharts.charts.themeriver import ThemeRiver +from pyecharts.charts.treemap import TreeMap from pyecharts.charts.wordcloud import WordCloud + +# custom component +from pyecharts.custom.grid import Grid +from pyecharts.custom.overlap import Overlap +from pyecharts.custom.page import Page +from pyecharts.custom.timeline import Timeline + +# misc +from pyecharts.conf import online +from pyecharts.conf import configure +from pyecharts.style import Style + diff --git a/pyecharts/__version__.py b/pyecharts/__version__.py deleted file mode 100644 index 812001999..000000000 --- a/pyecharts/__version__.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 - -__title__ = 'pyecharts' -__description__ = 'Python echarts, make charting easier' -__url__ = 'https://github.com/chenjiandongx/pyecharts' -__version__ = '1.1.4' -__author__ = 'chenjiandongx' -__author_email__ = 'chenjiandongx@qq.com' -__license__ = 'MIT' -__requires__ = ['pprint'] -__packages__ = ['pyecharts', 'pyecharts/charts'] -__keywords__ = ['echarts', 'charts'] \ No newline at end of file diff --git a/pyecharts/_version.py b/pyecharts/_version.py new file mode 100644 index 000000000..01fec8983 --- /dev/null +++ b/pyecharts/_version.py @@ -0,0 +1,2 @@ +__version__ = '0.4.1' +__author__ = 'chenjiandongx' diff --git a/pyecharts/base.py b/pyecharts/base.py index 879c1cdd5..3a047be61 100644 --- a/pyecharts/base.py +++ b/pyecharts/base.py @@ -1,430 +1,161 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 -import json +import uuid +import warnings -from pprint import pprint -from pyecharts.option import get_all_options +from jinja2 import Markup + +import pyecharts.constants as constants +import pyecharts.engine as engine +import pyecharts.utils as utils +from pyecharts.conf import CURRENT_CONFIG class Base(object): + """ + `Base`类是所有图形类的基类,提供部分初始化参数和基本的方法 + """ - def __init__(self, title, subtitle, + def __init__(self, width=800, height=400, - title_pos="auto", - title_color="#000", - subtitle_color="#aaa", - title_text_size=18, - subtitle_text_size=12, - background_color="#fff"): + renderer=constants.CANVAS_RENDERER, + page_title=constants.PAGE_TITLE): """ - :param title: - 主标题文本,支持 \n 换行 - :param subtitle: - 副标题文本,支持 \n 换行 :param width: - 画布宽度 + 画布宽度,默认为 800(px) :param height: - 画布高度 - :param title_pos: - 标题位置,有 auto,left,right,center 可选 - :param title_color: - 主标题文本颜色 - :param subtitle_color: - 副标题文本颜色 - :param title_text_size: - 主标题文本字体大小 - :param subtitle_text_size: - 副标题文本字体大小 - :param background_color: - 画布背景颜色 + 画布高度,默认为 400(px) + :param renderer: + 指定使用渲染方式,有 'svg' 和 'canvas' 可选,默认为 'canvas'。 + 3D 图仅能使用 'canvas'。 + :param page_title: + 指定生成的 html 文件中 标签的值。默认为 'Echarts' """ self._option = {} - self._width, self._height = width, height - self._colorlst = ['#c23531', '#2f4554', '#61a0a8', '#d48265', '#749f83', - '#ca8622', '#bda29a', '#6e7074', '#546570', '#c4ccd3'] - self._option.update( - title={ - "text": title, - "subtext": subtitle, - "left": title_pos, - "textStyle": {"color": title_color, "fontSize": title_text_size}, - "subtextStyle": {"color": subtitle_color, "fontSize": subtitle_text_size} - }, - toolbox={ - "show": True, - "orient": "vertical", - "left": "right", - "top": "center", - "feature": {"saveAsImage": {"show": True}} - }, - tooltip={}, - series=[], - legend={"data": []}, - backgroundColor=background_color - ) + self._js_dependencies = set() + self._chart_id = uuid.uuid4().hex + self.width, self.height = width, height + self.renderer = renderer + self._page_title = page_title + self._js_dependencies = {'echarts'} - def add(self, angle_data=None, - angle_range=None, - area_color=None, - area_opacity=None, - border_color=None, - boundary_gap=None, - center=None, - clockwise=None, - edge_length=None, - effect_brushtype=None, - effect_period=None, - effect_scale=None, - formatter=None, - geo_emphasis_color=None, - geo_normal_color=None, - gravity=None, - interval=None, - is_area_show=None, - is_axisline_show=None, - is_calculable=None, - is_convert=None, - is_emphasis=None, - is_fill=None, - is_focusnode=None, - is_label_show=None, - is_legend_show=None, - is_random=None, - is_roam=None, - is_rotatelabel=None, - is_smooth=None, - is_splitline_show=None, - is_stack=None, - is_step=None, - is_symbol_show=None, - is_visualmap=None, - item_color=None, - label_color=None, - label_pos=None, - label_text_color=None, - label_text_size=None, - layout=None, - legend_orient=None, - legend_pos=None, - line_curve=None, - line_opacity=None, - line_type=None, - line_width=None, - maptype=None, - mark_line=None, - mark_point=None, - namegap=None, - rader_text_color=None, - radius_data=None, - radius=None, - repulsion=None, - rosetype=None, - rotate_step=None, - scale_range=None, - shape=None, - start_angle=None, - symbol_size=None, - symbol=None, - type=None, - visual_range_color=None, - visual_range_text=None, - visual_range=None, - visual_text_color=None, - word_gap=None, - word_size_range=None, - x_axis=None, - xaxis_name_pos=None, - xaxis_name=None, - xy_font_size=None, - yaxis_name_pos=None, - yaxis_name=None): - """ base 父类的 add 方法只是为了提供提示选项 """ - pass + @property + def chart_id(self): + return self._chart_id - def custom(self, series): - """ 追加自定义图表类型 + @chart_id.setter + def chart_id(self, chart_id): + self._chart_id = chart_id - :param series: - 追加图表类型的 series 数据 - """ - _name, _series = series - for n in _name: - self._option.get('legend').get('data').append(n) - for s in _series: - self._option.get('series').append(s) + @property + def options(self): + return self._option - def get_series(self): - """ 获取图表的 series 数据 """ - return self._option.get('legend').get('data'), self._option.get('series') + @property + def js_dependencies(self): + return utils.merge_js_dependencies(self._js_dependencies) + + @property + def page_title(self): + return self._page_title + + def print_echarts_options(self): + """ 打印输出图形所有配置项 + """ + print(utils.json_dumps(self._option, indent=4)) def show_config(self): - """ 打印输出 option 所有配置项 """ - pprint(self._option) + """ 打印输出图形所有配置项 + """ + deprecated_tpl = 'The {} is deprecated, please use {} instead!' + warnings.warn( + deprecated_tpl.format('show_config', 'print_echarts_options'), + DeprecationWarning + ) + self.print_echarts_options() - def cast(self, seq): - """ 转换数据序列,将带字典和元祖类型的序列转换为 k_lst,v_lst 两个列表 - 1.[(A1, B1),(A2, B2),(A3, B3),(A4, B4)] --> k_lst[A[i1,i2...]], v_lst[B[i1,i2...]] - 2.[{A1: B1},{A2: B2},{A3: B3},{A4: B4}] --> k_lst[A[i1,i2...]], v_lst[B[i1,i2...]] - 3.{A1: B1, A2: B2, A3: B3, A4: B4} -- > k_lst[A[i1,i2...]], v_lst[B[i1,i2...]] + def render_embed(self): + """ 渲染图表的所有配置项,为 web pages 服务,不过需先提供 + 所需要的js 依赖文件 + """ + env = engine.create_default_environment() + html = env.render_container_and_echarts_code(self) + return Markup(html) + + def get_js_dependencies(self): + """ 声明所有的 js 文件路径 + """ + return CURRENT_CONFIG.produce_html_script_list(self._js_dependencies) + + def render(self, + path='render.html', + template_name='simple_chart.html', + object_name='chart', + extra_context=None): + env = engine.create_default_environment() + env.render_chart_to_file( + chart=self, + object_name=object_name, + path=path, + template_name=template_name, + extra_context=extra_context + ) + + @staticmethod + def cast(seq): + """ 转换数据序列,将带字典和元组类型的序列转换为 k_lst,v_lst 两个列表 + + 元组列表 + [(A1, B1), (A2, B2), ...] --> + k_lst[ A[i1, i2...] ], v_lst[ B[i1, i2...] ] + 字典列表 + [{A1: B1}, {A2: B2}, ...] --> + k_lst[ A[i1, i2...] ], v_lst[ B[i1, i2...] ] + 字典 + {A1: B1, A2: B2, ...} -- > + k_lst[ A[i1, i2...] ], v_lst[ B[i1, i2...] ] :param seq: - 转换的序列 + 待转换的序列 :return: """ k_lst, v_lst = [], [] if isinstance(seq, list): for s in seq: - try: - if isinstance(s, tuple): - _attr, _value = s - k_lst.append(_attr) - v_lst.append(_value) - elif isinstance(s, dict): - for k, v in s.items(): - k_lst.append(k) - v_lst.append(v) - except: - raise + if isinstance(s, tuple): + _attr, _value = s + k_lst.append(_attr) + v_lst.append(_value) + elif isinstance(s, dict): + for k, v in s.items(): + k_lst.append(k) + v_lst.append(v) elif isinstance(seq, dict): - for k, v in seq.items(): - k_lst.append(k) - v_lst.append(v) + for key in sorted(list(seq.keys())): + k_lst.append(key) + v_lst.append(seq[key]) return k_lst, v_lst - def _legend_visualmap_colorlst(self, is_visualmap=False, **kwargs): - """ 配置 legend,visualmap 以及 colorlst - - :param is_visualmap: - 是否显示 visualmap 组件 - :param kwargs: + def _repr_html_(self): + """ 渲染配置项并将图形显示在 notebook 中 + chart/page => charts + chart.js_dependencies => require_config => config_items, libraries + :return A unicode string. """ - kwargs.update(colorlst=self._colorlst) - chart = get_all_options(**kwargs) - if is_visualmap: - self._option.update(visualMap=chart['visual_map']) - self._option.get('legend').update(chart['legend']) - self._option.update(color=chart['color']) - - def render(self, path="render.html"): - """ 渲染数据项,生成 html 文件 - - :param path: - 生成 html 文件保存路径 - """ - from pyecharts import temple as Tp - temple = Tp._temple - series = self._option.get("series") - for s in series: - if s.get('type') == "wordCloud": - temple = Tp._temple_wd - break - if s.get('type') in ("scatter", "pie", "bar", "line") and 'coordinateSystem' not in s: - temple = Tp.temple - break - my_option = json.dumps(self._option, indent=4, ensure_ascii=False) - __op = temple\ - .replace("myOption", my_option)\ - .replace("myWidth", str(self._width))\ - .replace("myHeight", str(self._height)) - with open(path, "w+") as f: - f.write(__op) + require_config = CURRENT_CONFIG.produce_require_configuration( + self.js_dependencies + ) + config_items = require_config['config_items'] + libraries = require_config['libraries'] + env = engine.create_default_environment() + return env.render_chart_to_notebook( + charts=(self,), + config_items=config_items, + libraries=libraries + ) - @property - def _geo_cities(self): - """ 返回 geo 组件中国各大城市经纬度 """ - return { - "海门": [121.15, 31.89], - "鄂尔多斯": [109.781327, 39.608266], - "招远": [120.38, 37.35], - "舟山": [122.207216, 29.985295], - "齐齐哈尔": [123.97, 47.33], - "盐城": [120.13, 33.38], - "赤峰": [118.87, 42.28], - "青岛": [120.33, 36.07], - "乳山": [121.52, 36.89], - "金昌": [102.188043, 38.520089], - "泉州": [118.58, 24.93], - "莱西": [120.53, 36.86], - "日照": [119.46, 35.42], - "胶南": [119.97, 35.88], - "南通": [121.05, 32.08], - "拉萨": [91.11, 29.97], - "云浮": [112.02, 22.93], - "梅州": [116.1, 24.55], - "文登": [122.05, 37.2], - "上海": [121.48, 31.22], - "攀枝花": [101.718637, 26.582347], - "威海": [122.1, 37.5], - "承德": [117.93, 40.97], - "厦门": [118.1, 24.46], - "汕尾": [115.375279, 22.786211], - "潮州": [116.63, 23.68], - "丹东": [124.37, 40.13], - "太仓": [121.1, 31.45], - "曲靖": [103.79, 25.51], - "烟台": [121.39, 37.52], - "福州": [119.3, 26.08], - "瓦房店": [121.979603, 39.627114], - "即墨": [120.45, 36.38], - "抚顺": [123.97, 41.97], - "玉溪": [102.52, 24.35], - "张家口": [114.87, 40.82], - "阳泉": [113.57, 37.85], - "莱州": [119.942327, 37.177017], - "湖州": [120.1, 30.86], - "汕头": [116.69, 23.39], - "昆山": [120.95, 31.39], - "宁波": [121.56, 29.86], - "湛江": [110.359377, 21.270708], - "揭阳": [116.35, 23.55], - "荣成": [122.41, 37.16], - "连云港": [119.16, 34.59], - "葫芦岛": [120.836932, 40.711052], - "常熟": [120.74, 31.64], - "东莞": [113.75, 23.04], - "河源": [114.68, 23.73], - "淮安": [119.15, 33.5], - "泰州": [119.9, 32.49], - "南宁": [108.33, 22.84], - "营口": [122.18, 40.65], - "惠州": [114.4, 23.09], - "江阴": [120.26, 31.91], - "蓬莱": [120.75, 37.8], - "韶关": [113.62, 24.84], - "嘉峪关": [98.289152, 39.77313], - "广州": [113.23, 23.16], - "延安": [109.47, 36.6], - "太原": [112.53, 37.87], - "清远": [113.01, 23.7], - "中山": [113.38, 22.52], - "昆明": [102.73, 25.04], - "寿光": [118.73, 36.86], - "盘锦": [122.070714, 41.119997], - "长治": [113.08, 36.18], - "深圳": [114.07, 22.62], - "珠海": [113.52, 22.3], - "宿迁": [118.3, 33.96], - "咸阳": [108.72, 34.36], - "铜川": [109.11, 35.09], - "平度": [119.97, 36.77], - "佛山": [113.11, 23.05], - "海口": [110.35, 20.02], - "江门": [113.06, 22.61], - "章丘": [117.53, 36.72], - "肇庆": [112.44, 23.05], - "大连": [121.62, 38.92], - "临汾": [111.5, 36.08], - "吴江": [120.63, 31.16], - "石嘴山": [106.39, 39.04], - "沈阳": [123.38, 41.8], - "苏州": [120.62, 31.32], - "茂名": [110.88, 21.68], - "嘉兴": [120.76, 30.77], - "长春": [125.35, 43.88], - "胶州": [120.03336, 36.264622], - "银川": [106.27, 38.47], - "张家港": [120.555821, 31.875428], - "三门峡": [111.19, 34.76], - "锦州": [121.15, 41.13], - "南昌": [115.89, 28.68], - "柳州": [109.4, 24.33], - "三亚": [109.511909, 18.252847], - "自贡": [104.778442, 29.33903], - "吉林": [126.57, 43.87], - "阳江": [111.95, 21.85], - "泸州": [105.39, 28.91], - "西宁": [101.74, 36.56], - "宜宾": [104.56, 29.77], - "呼和浩特": [111.65, 40.82], - "成都": [104.06, 30.67], - "大同": [113.3, 40.12], - "镇江": [119.44, 32.2], - "桂林": [110.28, 25.29], - "张家界": [110.479191, 29.117096], - "宜兴": [119.82, 31.36], - "北海": [109.12, 21.49], - "西安": [108.95, 34.27], - "金坛": [119.56, 31.74], - "东营": [118.49, 37.46], - "牡丹江": [129.58, 44.6], - "遵义": [106.9, 27.7], - "绍兴": [120.58, 30.01], - "扬州": [119.42, 32.39], - "常州": [119.95, 31.79], - "潍坊": [119.1, 36.62], - "重庆": [106.54, 29.59], - "台州": [121.420757, 28.656386], - "南京": [118.78, 32.04], - "滨州": [118.03, 37.36], - "贵阳": [106.71, 26.57], - "无锡": [120.29, 31.59], - "本溪": [123.73, 41.3], - "克拉玛依": [84.77, 45.59], - "渭南": [109.5, 34.52], - "马鞍山": [118.48, 31.56], - "宝鸡": [107.15, 34.38], - "焦作": [113.21, 35.24], - "句容": [119.16, 31.95], - "北京": [116.46, 39.92], - "徐州": [117.2, 34.26], - "衡水": [115.72, 37.72], - "包头": [110, 40.58], - "绵阳": [104.73, 31.48], - "乌鲁木齐": [87.68, 43.77], - "枣庄": [117.57, 34.86], - "杭州": [120.19, 30.26], - "淄博": [118.05, 36.78], - "鞍山": [122.85, 41.12], - "溧阳": [119.48, 31.43], - "库尔勒": [86.06, 41.68], - "安阳": [114.35, 36.1], - "开封": [114.35, 34.79], - "济南": [117, 36.65], - "德阳": [104.37, 31.13], - "温州": [120.65, 28.01], - "九江": [115.97, 29.71], - "邯郸": [114.47, 36.6], - "临安": [119.72, 30.23], - "兰州": [103.73, 36.03], - "沧州": [116.83, 38.33], - "临沂": [118.35, 35.05], - "南充": [106.110698, 30.837793], - "天津": [117.2, 39.13], - "富阳": [119.95, 30.07], - "泰安": [117.13, 36.18], - "诸暨": [120.23, 29.71], - "郑州": [113.65, 34.76], - "哈尔滨": [126.63, 45.75], - "聊城": [115.97, 36.45], - "芜湖": [118.38, 31.33], - "唐山": [118.02, 39.63], - "平顶山": [113.29, 33.75], - "邢台": [114.48, 37.05], - "德州": [116.29, 37.45], - "济宁": [116.59, 35.38], - "荆州": [112.239741, 30.335165], - "宜昌": [111.3, 30.7], - "义乌": [120.06, 29.32], - "丽水": [119.92, 28.45], - "洛阳": [112.44, 34.7], - "秦皇岛": [119.57, 39.95], - "株洲": [113.16, 27.83], - "石家庄": [114.48, 38.03], - "莱芜": [117.67, 36.19], - "常德": [111.69, 29.05], - "保定": [115.48, 38.85], - "湘潭": [112.91, 27.87], - "金华": [119.64, 29.12], - "岳阳": [113.09, 29.37], - "长沙": [113, 28.21], - "衢州": [118.88, 28.97], - "廊坊": [116.7, 39.53], - "菏泽": [115.480656, 35.23375], - "合肥": [117.27, 31.86], - "武汉": [114.31, 30.52], - "大庆": [125.03, 46.58] - } \ No newline at end of file + def _add_chinese_map(self, map_name_in_chinese): + name_in_pinyin = CURRENT_CONFIG.chinese_to_pinyin(map_name_in_chinese) + self._js_dependencies.add(name_in_pinyin) diff --git a/pyecharts/chart.py b/pyecharts/chart.py new file mode 100644 index 000000000..cfb02604d --- /dev/null +++ b/pyecharts/chart.py @@ -0,0 +1,368 @@ +# coding=utf-8 + +import random + +from pyecharts.option import get_all_options +from pyecharts.base import Base +import pyecharts.constants as constants + + +class Chart(Base): + """ + `Chart`类是所有非自定义类的基类,继承自 `Base` 类 + """ + def __init__(self, title, subtitle, + width=800, + height=400, + title_pos="auto", + title_top="auto", + title_color="#000", + subtitle_color="#aaa", + title_text_size=18, + subtitle_text_size=12, + background_color="#fff", + page_title=constants.PAGE_TITLE, + renderer=constants.CANVAS_RENDERER): + """ + + :param title: + 主标题文本,支持 \n 换行,默认为 "" + :param subtitle: + 副标题文本,支持 \n 换行,默认为 "" + :param width: + 画布宽度,默认为 800(px) + :param height: + 画布高度,默认为 400(px) + :param title_pos: + 标题距离左侧距离,默认为'left',有'auto', 'left', 'right', + 'center'可选,也可为百分比或整数 + :param title_top: + 标题距离顶部距离,默认为'top',有'top', 'middle', 'bottom'可选, + 也可为百分比或整数 + :param title_color: + 主标题文本颜色,默认为 '#000' + :param subtitle_color: + 副标题文本颜色,默认为 '#aaa' + :param title_text_size: + 主标题文本字体大小,默认为 18 + :param subtitle_text_size: + 副标题文本字体大小,默认为 12 + :param background_color: + 画布背景颜色,默认为 '#fff' + :param page_title: + 指定生成的 html 文件中 <title> 标签的值。默认为 'Echarts' + :param renderer: + 指定使用渲染方式,有 'svg' 和 'canvas' 可选,默认为 'canvas'。 + 3D 图仅能使用 'canvas'。 + """ + super(Chart, self).__init__( + width=width, height=height, + renderer=renderer, + page_title=page_title + ) + self._colorlst = [ + '#c23531', '#2f4554', '#61a0a8', '#d48265', '#749f83', + '#ca8622', '#bda29a', '#6e7074', '#546570', '#c4ccd3', + '#f05b72', '#ef5b9c', '#f47920', '#905a3d', '#fab27b', + '#2a5caa', '#444693', '#726930', '#b2d235', '#6d8346', + '#ac6767', '#1d953f', '#6950a1', '#918597', '#f6f5ec'] + self._option.update( + title=[{ + "text": title, + "subtext": subtitle, + "left": title_pos, + "top": title_top, + "textStyle": { + "color": title_color, + "fontSize": title_text_size + }, + "subtextStyle": { + "color": subtitle_color, + "fontSize": subtitle_text_size + } + }], + toolbox={ + "show": True, + "orient": "vertical", + "left": "95%", + "top": "center", + "feature": { + "saveAsImage": { + "show": True, + "title": "下载图片" + }, + "restore": {"show": True}, + "dataView": {"show": True}, + } + }, + series_id=random.randint(1, 9000000), + tooltip={}, + series=[], + legend=[{"data": []}], + backgroundColor=background_color + ) + + def add(self, angle_data=None, + angle_range=None, + area_color=None, + area_opacity=None, + axis_range=None, + bar_category_gap=None, + border_color=None, + boundary_gap=None, + center=None, + calendar_date_range=None, + calendar_cell_size=None, + datazoom_type=None, + datazoom_range=None, + datazoom_orient=None, + datazoom_xaxis_index=None, + datazoom_yaxis_index=None, + effect_brushtype=None, + effect_period=None, + effect_scale=None, + extra_data=None, + geo_emphasis_color=None, + geo_normal_color=None, + geo_cities_coords=None, + geo_effect_period=None, + geo_effect_traillength=None, + geo_effect_color=None, + geo_effect_symbol=None, + geo_effect_symbolsize=None, + graph_layout=None, + graph_gravity=None, + graph_edge_length=None, + graph_repulsion=None, + graph_edge_symbol=None, + graph_edge_symbolsize=None, + grid_width=None, + grid_height=None, + grid_top=None, + grid_bottom=None, + grid_left=None, + grid_right=None, + grid3d_width=None, + grid3d_height=None, + grid3d_depth=None, + grid3d_opacity=None, + grid3d_shading=None, + grid3d_rotate_speed=None, + grid3d_rotate_sensitivity=None, + is_angleaxis_show=None, + is_area_show=None, + is_axisline_show=None, + is_calculable=None, + is_calendar_heatmap=None, + is_clockwise=None, + is_convert=None, + is_datazoom_show=None, + is_fill=None, + is_focusnode=None, + is_geo_effect_show=None, + is_grid3d_rotate=None, + is_label_show=None, + is_label_emphasis=None, + is_legend_show=None, + is_liquid_animation=None, + is_liquid_outline_show=None, + is_more_utils=None, + is_map_symbol_show=None, + is_piecewise=None, + is_radiusaxis_show=None, + is_random=None, + is_roam=None, + is_rotatelabel=None, + is_smooth=None, + is_splitline_show=None, + is_stack=None, + is_step=None, + is_symbol_show=None, + is_toolbox_show=None, + is_visualmap=None, + is_xaxislabel_align=None, + is_yaxislabel_align=None, + is_xaxis_inverse=None, + is_yaxis_inverse=None, + is_xaxis_boundarygap=None, + is_yaxis_boundarygap=None, + is_xaxis_show=None, + is_yaxis_show=None, + item_color=None, + label_color=None, + label_pos=None, + label_text_color=None, + label_text_size=None, + label_formatter=None, + label_emphasis_textcolor=None, + label_emphasis_textsize=None, + label_emphasis_pos=None, + legend_orient=None, + legend_pos=None, + legend_top=None, + legend_selectedmode=None, + legend_text_size=None, + legend_text_color=None, + line_curve=None, + line_opacity=None, + line_type=None, + line_width=None, + line_color=None, + liquid_color=None, + maptype=None, + mark_line=None, + mark_line_symbolsize=None, + mark_line_valuedim=None, + mark_line_coords=None, + mark_point=None, + mark_point_symbol=None, + mark_point_symbolsize=None, + mark_point_textcolor=None, + mark_point_valuedim=None, + pieces=None, + radius_data=None, + radius=None, + rosetype=None, + rotate_step=None, + scale_range=None, + shape=None, + start_angle=None, + symbol_size=None, + symbol=None, + sankey_node_width=None, + sankey_node_gap=None, + type=None, + tooltip_tragger=None, + tooltip_tragger_on=None, + tooltip_axispointer_type=None, + tooltip_formatter=None, + tooltip_text_color=None, + tooltip_font_size=None, + tooltip_background_color=None, + tooltip_border_color=None, + tooltip_border_width=None, + treemap_left_depth=None, + treemap_drilldown_icon=None, + treemap_visible_min=None, + visual_orient=None, + visual_range_color=None, + visual_range_size=None, + visual_range_text=None, + visual_range=None, + visual_text_color=None, + visual_pos=None, + visual_top=None, + visual_type=None, + visual_split_number=None, + visual_dimension=None, + word_gap=None, + word_size_range=None, + x_axis=None, + xaxis_margin=None, + xaxis_interval=None, + xaxis_force_interval=None, + xaxis_pos=None, + xaxis_name_gap=None, + xaxis_name_size=None, + xaxis_name_pos=None, + xaxis_name=None, + xaxis_rotate=None, + xaxis_min=None, + xaxis_max=None, + xaxis_type=None, + xaxis_label_textsize=None, + xaxis_label_textcolor=None, + xaxis3d_name=None, + xaxis3d_name_size=None, + xaxis3d_name_gap=None, + xaxis3d_min=None, + xaxis3d_max=None, + xaxis3d_interval=None, + xaxis3d_margin=None, + yaxis_margin=None, + yaxis_interval=None, + yaxis_force_interval=None, + yaxis_pos=None, + yaxis_formatter=None, + yaxis_rotate=None, + yaxis_min=None, + yaxis_max=None, + yaxis_name_gap=None, + yaxis_name_size=None, + yaxis_name_pos=None, + yaxis_type=None, + yaxis_name=None, + yaxis_label_textsize=None, + yaxis_label_textcolor=None, + yaxis3d_name=None, + yaxis3d_name_size=None, + yaxis3d_name_gap=None, + yaxis3d_min=None, + yaxis3d_max=None, + yaxis3d_interval=None, + yaxis3d_margin=None, + zaxis3d_name=None, + zaxis3d_name_size=None, + zaxis3d_name_gap=None, + zaxis3d_min=None, + zaxis3d_max=None, + zaxis3d_margin=None, **kwargs): + """ `add()` 方法只是用于提供自动参数补全 """ + pass + + def _config_components(self, is_visualmap=False, + is_more_utils=False, + is_toolbox_show=True, + **kwargs): + """ 图形组件配置项 + + :param is_visualmap: + 指定是否使用 visualMap 组件 + :param is_datazoom_show: + 指定是否使用 dataZoom 组件 + :param is_more_utils: + 指定是否提供更多的实用小工具 + :param is_toolbox_show: + 指定是否显示工具箱 + :param kwargs: + """ + kwargs.update(colorlst=self._colorlst) + chart = get_all_options(**kwargs) + self._option.update(color=chart['color']) + + # legend + self._option.get('legend')[0].update(chart['legend']) + + # tooltip + self._option.update(tooltip=chart['tooltip']) + + # dataZoom,勿改动 + if kwargs.get('is_datazoom_show', None) is True: + self._option.update(dataZoom=chart['datazoom']) + + # visualMap + if is_visualmap: + self._option.update(visualMap=chart['visual_map']) + + # toolbox + if is_more_utils: + self._option.get('toolbox').get('feature').update( + magicType={ + "show": True, + "type": ['line', 'bar', 'stack', 'tiled'], + "title": { + "line": "折线图", + "bar": "柱状图", + "stack": "堆叠", + "tiled": "平铺" + }}, + dataZoom={ + "show": True, + "title": { + "zoom": "区域缩放", + "back": "缩放还原" + }} + ) + + if not is_toolbox_show: + self._option.pop("toolbox", None) diff --git a/pyecharts/charts/__init__.py b/pyecharts/charts/__init__.py index 3dc0ab560..e69de29bb 100644 --- a/pyecharts/charts/__init__.py +++ b/pyecharts/charts/__init__.py @@ -1,3 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 \ No newline at end of file diff --git a/pyecharts/charts/bar.py b/pyecharts/charts/bar.py index 3226dcf62..1be2b9c2a 100644 --- a/pyecharts/charts/bar.py +++ b/pyecharts/charts/bar.py @@ -1,14 +1,14 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 -from pyecharts.base import Base +from pyecharts.chart import Chart from pyecharts.option import get_all_options -class Bar(Base): + +class Bar(Chart): """ - <<< 柱状/条形图 >>> - 柱状/条形图 通过 柱形的高度/条形的宽度 来表现数据的大小。 + <<< 柱状图/条形图 >>> + + 柱状/条形图,通过柱形的高度/条形的宽度来表现数据的大小。 """ def __init__(self, title="", subtitle="", **kwargs): @@ -19,36 +19,41 @@ def add(self, *args, **kwargs): def __add(self, name, x_axis, y_axis, is_stack=False, + bar_category_gap="20%", **kwargs): """ :param name: - 图例名称 + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 :param x_axis: - x 坐标轴数据 + x 坐标轴数据。 :param y_axis: - y 坐标轴数据 + y 坐标轴数据。 :param is_stack: - 数据堆叠,同个类目轴上系列配置相同的 stack 值可以堆叠放置 + 数据堆叠,同个类目轴上系列配置相同的 stack 值可以堆叠放置。默认为 False。 :param kwargs: """ - if isinstance(x_axis, list) and isinstance(y_axis, list): - assert len(x_axis) == len(y_axis) - kwargs.update(x_axis=x_axis) - chart = get_all_options(**kwargs) - is_stack = "stack" if is_stack else "" - xaxis, yaxis = chart['xy_axis'] - self._option.update(xAxis=xaxis, yAxis=yaxis) - self._option.get('legend').get('data').append(name) - self._option.get('series').append({ - "type": "bar", - "name": name, - "data": y_axis, - "stack": is_stack, - "label": chart['label'], - "markPoint": chart['mark_point'], - "markLine": chart['mark_line'] - }) - self._legend_visualmap_colorlst(**kwargs) + assert len(x_axis) == len(y_axis) + kwargs.update(x_axis=x_axis) + chart = get_all_options(**kwargs) + + if is_stack: + is_stack = "stack_" + str(self._option['series_id']) else: - raise TypeError("x_axis and y_axis must be list") + is_stack = "" + xaxis, yaxis = chart['xy_axis'] + self._option.update(xAxis=xaxis, yAxis=yaxis) + self._option.get('legend')[0].get('data').append(name) + + self._option.get('series').append({ + "type": "bar", + "name": name, + "data": y_axis, + "stack": is_stack, + "barCategoryGap": bar_category_gap, + "label": chart['label'], + "markPoint": chart['mark_point'], + "markLine": chart['mark_line'], + "seriesId": self._option.get('series_id'), + }) + self._config_components(**kwargs) diff --git a/pyecharts/charts/bar3D.py b/pyecharts/charts/bar3D.py new file mode 100644 index 000000000..d096797da --- /dev/null +++ b/pyecharts/charts/bar3D.py @@ -0,0 +1,72 @@ +# coding=utf-8 + +from pyecharts.chart import Chart +from pyecharts.option import get_all_options +import pyecharts.constants as constants + + +class Bar3D(Chart): + """ + <<< 3D 柱状图 >>> + """ + + def __init__(self, title="", subtitle="", **kwargs): + kwargs['renderer'] = constants.CANVAS_RENDERER + super(Bar3D, self).__init__(title, subtitle, **kwargs) + self._js_dependencies.add('echartsgl') + + def add(self, *args, **kwargs): + self.__add(*args, **kwargs) + + def __add(self, name, x_axis, y_axis, data, + grid3d_opacity=1, + grid3d_shading='color', + **kwargs): + """ + + :param name: + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 + :param x_axis: + x 坐标轴数据。需为类目轴,也就是不能是数值。 + :param y_axis: + y 坐标轴数据。需为类目轴,也就是不能是数值。 + :param data: + 数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』。 + :param grid3d_opacity: + 3D 笛卡尔坐标系组的透明度(柱状的透明度),默认为 1,完全不透明。 + :param grid3d_shading: + 三维柱状图中三维图形的着色效果。 + color: + 只显示颜色,不受光照等其它因素的影响。 + lambert: + 通过经典的 lambert 着色表现光照带来的明暗。 + realistic: + 真实感渲染,配合 light.ambientCubemap 和 postEffect 使用可以让 + 展示的画面效果和质感有质的提升。ECharts GL 中使用了基于物理的渲 + 染(PBR)来表现真实感材质。 + :param kwargs: + """ + kwargs.update(xaxis3d_type='category', + yaxis3d_type='category', + zaxis3d_type='value') + chart = get_all_options(**kwargs) + + self._option.get('legend')[0].get('data').append(name) + self._option.update( + xAxis3D=chart['xaxis3D'], + yAxis3D=chart['yaxis3D'], + zAxis3D=chart['zaxis3D'], + grid3D=chart['grid3D'] + ) + self._option.get('xAxis3D').update(data=x_axis) + self._option.get('yAxis3D').update(data=y_axis) + + self._option.get('series').append({ + "type": "bar3D", + "name": name, + "data": data, + "label": chart['label'], + "shading": grid3d_shading, + "itemStyle": {"opacity": grid3d_opacity} + }) + self._config_components(**kwargs) diff --git a/pyecharts/charts/boxplot.py b/pyecharts/charts/boxplot.py new file mode 100644 index 000000000..82d4ceb15 --- /dev/null +++ b/pyecharts/charts/boxplot.py @@ -0,0 +1,82 @@ +# coding=utf-8 + +from pyecharts.chart import Chart +from pyecharts.option import get_all_options + + +class Boxplot(Chart): + """ + <<< 箱形图 >>> + + 箱形图是一种用作显示一组数据分散情况资料的统计图。它能显示出一组数据 + 的最大值、最小值、中位数、下四分位数及上四分位数。 + """ + + def __init__(self, title="", subtitle="", **kwargs): + super(Boxplot, self).__init__(title, subtitle, **kwargs) + + def add(self, *args, **kwargs): + self.__add(*args, **kwargs) + + def __add(self, name, x_axis, y_axis, **kwargs): + """ + + :param name: + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 + :param x_axis: + x 坐标轴数据。 + :param y_axis: + y 坐标轴数据,二维数组的每一数组项(上例中的每行)是渲染一个 box。 + 它含有五个量值,依次是:[min, Q1, median (or Q2), Q3, max]。 + :param kwargs: + """ + kwargs.update(x_axis=x_axis) + chart = get_all_options(**kwargs) + + xaxis, yaxis = chart['xy_axis'] + self._option.update(xAxis=xaxis, yAxis=yaxis) + self._option.get('legend')[0].get('data').append(name) + + self._option.get('series').append({ + "type": "boxplot", + "name": name, + "data": y_axis, + "label": chart['label'], + "markPoint": chart['mark_point'], + "markLine": chart['mark_line'], + "seriesId": self._option.get('series_id'), + }) + self._config_components(**kwargs) + + @staticmethod + def prepare_data(data): + """ 将传入的嵌套列表中的数据转换为嵌套的 [min, Q1, median (or Q2), Q3, max] + + :param data: + 待转换的数据列表 + :return: + 转换后的数组 + """ + _data = [] + for d in data: + try: + _d, _result = sorted(d), [] + for i in range(1, 4): + n = i * (len(_d) + 1) / 4 + m = n - int(n) + if m == 0: + _result.append(_d[int(n) - 1]) + elif m == 1 / 4: + _result.append( + _d[int(n) - 1] * 0.75 + _d[int(n)] * 0.25) + elif m == 1 / 2: + _result.append(_d[int(n) - 1] * 0.5 + _d[int(n)] * 0.5) + elif m == 3 / 4: + _result.append( + _d[int(n) - 1] * 0.25 + _d[int(n)] * 0.75) + _result.insert(0, _d[0]) # 最小值 + _result.append(_d[-1]) # 最大值 + _data.append(_result) + except Exception: + pass + return _data diff --git a/pyecharts/charts/effectscatter.py b/pyecharts/charts/effectscatter.py index be339c9fe..76cab6102 100644 --- a/pyecharts/charts/effectscatter.py +++ b/pyecharts/charts/effectscatter.py @@ -1,13 +1,13 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 from pyecharts.charts.scatter import Scatter from pyecharts.option import get_all_options + class EffectScatter(Scatter): """ <<< 带有涟漪特效动画的散点图 >>> + 利用动画特效可以将某些想要突出的数据进行视觉突出。 """ def __init__(self, title="", subtitle="", **kwargs): @@ -16,38 +16,38 @@ def __init__(self, title="", subtitle="", **kwargs): def add(self, *args, **kwargs): self.__add(*args, **kwargs) - def __add(self, name, x_value, y_value, + def __add(self, name, x_axis, y_axis, symbol_size=10, **kwargs): """ :param name: - 图例名称 + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 :param x_axis: - x 坐标轴数据 + x 坐标轴数据。 :param y_axis: - y 坐标轴数据 + y 坐标轴数据。 :param symbol_size: - 标记图形大小 + 标记图形大小。 :param kwargs: """ - if isinstance(x_value, list) and isinstance(y_value, list): - assert len(x_value) == len(y_value) - kwargs.update(type="scatter") - chart = get_all_options(**kwargs) - xaxis, yaxis = chart['xy_axis'] - self._option.update(xAxis=xaxis, yAxis=yaxis) - self._option.get('legend').get('data').append(name) - self._option.get('series').append({ - "type": "effectScatter", - "name": name, - "showEffectOn":"render", - "rippleEffect": chart['effect'], - "symbol": chart['symbol'], - "symbolSize": symbol_size, - "data": [list(z) for z in zip(x_value, y_value)], - "label": chart['label'], - }) - self._legend_visualmap_colorlst(**kwargs) - else: - raise TypeError("x_axis and y_axis must be list") + assert len(x_axis) == len(y_axis) + kwargs.update(type="scatter") + chart = get_all_options(**kwargs) + + xaxis, yaxis = chart['xy_axis'] + self._option.update(xAxis=xaxis, yAxis=yaxis) + self._option.get('legend')[0].get('data').append(name) + + self._option.get('series').append({ + "type": "effectScatter", + "name": name, + "showEffectOn": "render", + "rippleEffect": chart['effect'], + "symbol": chart['symbol'], + "symbolSize": symbol_size, + "data": [list(z) for z in zip(x_axis, y_axis)], + "label": chart['label'], + "seriesId": self._option.get('series_id'), + }) + self._config_components(**kwargs) diff --git a/pyecharts/charts/funnel.py b/pyecharts/charts/funnel.py index 748d1a480..94eb0a7b0 100644 --- a/pyecharts/charts/funnel.py +++ b/pyecharts/charts/funnel.py @@ -1,11 +1,10 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 -from pyecharts.base import Base +from pyecharts.chart import Chart from pyecharts.option import get_all_options -class Funnel(Base): + +class Funnel(Chart): """ <<< 漏斗图 >>> """ @@ -19,28 +18,29 @@ def __add(self, name, attr, value, **kwargs): """ :param name: - 图例名称 + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 :param attr: - 属性名称 + 属性名称。 :param value: - 属性所对应的值 + 属性所对应的值。 :param kwargs: """ - if isinstance(attr, list) and isinstance(value, list): - assert len(attr) == len(value) - chart = get_all_options(**kwargs) - _data = [] - for data in zip(attr, value): - _name, _value = data - _data.append({"name": _name, "value": _value}) - for a in attr: - self._option.get('legend').get('data').append(a) - self._option.get('series').append({ - "type": "funnel", - "name": name, - "data": _data, - "label": chart['label'], - }) - self._legend_visualmap_colorlst(**kwargs) - else: - raise TypeError("attr and value must be list") + assert len(attr) == len(value) + chart = get_all_options(**kwargs) + + _data = [] + for data in zip(attr, value): + _name, _value = data + _data.append({"name": _name, "value": _value}) + for a in attr: + self._option.get('legend')[0].get('data').append(a) + _dset = set(self._option.get('legend')[0].get('data')) + self._option.get('legend')[0].update(data=list(_dset)) + + self._option.get('series').append({ + "type": "funnel", + "name": name, + "data": _data, + "label": chart['label'] + }) + self._config_components(**kwargs) diff --git a/pyecharts/charts/gauge.py b/pyecharts/charts/gauge.py index 90a9e8e61..854ade184 100644 --- a/pyecharts/charts/gauge.py +++ b/pyecharts/charts/gauge.py @@ -1,10 +1,9 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 -from pyecharts.base import Base +from pyecharts.chart import Chart -class Gauge(Base): + +class Gauge(Chart): """ <<< 仪表盘 >>> """ @@ -21,28 +20,30 @@ def __add(self, name, attr, value, """ :param name: - 图例名称 + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 :param attr: - 属性名称 + 属性名称。 :param value: - 属性所对应的值 + 属性所对应的值。 :param scale_range: - 仪表盘数据范围 + 仪表盘数据范围。默认为 [0, 100]。 :param angle_range: - 仪表盘角度范围 + 仪表盘角度范围。默认为 [225, -45]。 :param kwargs: """ - # 数据范围默认为 [0,100] + kwargs.update(type="gauge") _min, _max = 0, 100 if scale_range: if len(scale_range) == 2: _min, _max = scale_range - # 角度范围默认为 [225,-45] + _start, _end = 225, -45 if angle_range: if len(angle_range) == 2: _start, _end = angle_range - self._option.get('legend').get('data').append(name) + + self._option.get('legend')[0].get('data').append(name) + self._option.get('series').append({ "type": "gauge", "detail": {"formatter": '{value}%'}, @@ -51,7 +52,9 @@ def __add(self, name, attr, value, "max": _max, "startAngle": _start, "endAngle": _end, - "data": [{"value": value, "name": attr}] + "data": [{ + "value": value, + "name": attr + }] }) - self._option.update(tooltip={"formatter": "{a} <br/>{b} : {c}%"}) - self._legend_visualmap_colorlst(**kwargs) + self._config_components(**kwargs) diff --git a/pyecharts/charts/geo.py b/pyecharts/charts/geo.py index 8b7331c5e..50327bc46 100644 --- a/pyecharts/charts/geo.py +++ b/pyecharts/charts/geo.py @@ -1,13 +1,16 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 -from pyecharts.base import Base +import copy + +from pyecharts.chart import Chart from pyecharts.option import get_all_options +from pyecharts.constants import CITY_GEO_COORDS + -class Geo(Base): +class Geo(Chart): """ - <<< 地理坐标系组件 >>> + <<< 地理坐标系 >>> + 地理坐标系组件用于地图的绘制,支持在地理坐标系上绘制散点图,线集。 """ def __init__(self, title="", subtitle="", **kwargs): @@ -23,72 +26,114 @@ def __add(self, name, attr, value, border_color="#111", geo_normal_color="#323c48", geo_emphasis_color="#2a333d", + geo_cities_coords=None, + is_roam=True, **kwargs): """ :param name: - 图例名称 + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 :param attr: - 属性名称 + 属性名称。 :param value: - 属性所对应的值 + 属性所对应的值。 :param type: - 图例类型,有 scatter/effectscatter 可选 + 图例类型,有'scatter', 'effectscatter', 'heatmap'可选。 :param maptype: - 地图类型,目前只有 china 可选 + 地图类型。 支持 china、world、安徽、澳门、北京、重庆、福建、福建、甘肃、 + 广东,广西、广州、海南、河北、黑龙江、河南、湖北、湖南、江苏、江西、吉林、 + 辽宁、内蒙古、宁夏、青海、山东、上海、陕西、山西、四川、台湾、天津、香港、 + 新疆、西藏、云南、浙江,以及 [363个二线城市](https://github.com/chfw/ + echarts-china-cities-js#featuring-citiesor-for-single-download]地图。 + 提醒: + 在画市级地图的时候,城市名字后面的‘市’要省去了,比如,石家庄市的 + ‘市’不要提,即‘石家庄’就可以了。 :param symbol_size: - 标记图形大小 + 标记图形大小。 :param border_color: - 地图边界颜色 + 地图边界颜色。 :param geo_normal_color: - 正常状态下地图区域的颜色 + 正常状态下地图区域的颜色。 :param geo_emphasis_color: - 高亮状态下地图区域的颜色 + 高亮状态下地图区域的颜色。 + :param geo_cities_coords: + 用户自定义地区经纬度,类似如 {'阿城': [126.58, 45.32],} 这样的字典,当用 + 于提供了该参数时,将会覆盖原有预存的区域坐标信息。 + :param is_roam: + 是否开启鼠标缩放和平移漫游。默认为 True。 + 如果只想要开启缩放或者平移,可以设置成'scale'或者'move'。设置成 True 为都开启。 :param kwargs: """ - if isinstance(attr, list) and isinstance(value, list): - assert len(attr) == len(value) - chart = get_all_options(**kwargs) - _data = [] - for data in zip(attr, value): - _name, _value = data - if _name in self._geo_cities: - _v = self._geo_cities.get(_name) - _v.append(_value) - _value = list(_v) - _data.append({"name": _name, "value": _value}) - self._option.update( - geo={ - "map": maptype, - "label": {}, - "itemStyle": {"normal": { - "areaColor": geo_normal_color, - "borderColor": border_color}, - "emphasis":{"areaColor": geo_emphasis_color}} - }) - self._option.get('legend').get('data').append(name) - if type == "scatter": - self._option.get('series').append({ - "type": type, - "name": name, - "coordinateSystem": 'geo', - "symbol": chart['symbol'], - "symbolSize": symbol_size, - "data": _data, - "label": chart['label'], - }) - elif type == "effectScatter": - self._option.get('series').append({ - "type": type, - "name": name, - "coordinateSystem": 'geo', - "showEffectOn": "render", - "rippleEffect": chart['effect'], - "symbol": chart['symbol'], - "symbolSize": symbol_size, - "data": _data, - "label": chart['label'], - }) - self._legend_visualmap_colorlst(**kwargs) + assert len(attr) == len(value) + kwargs.update(type="geo") + chart = get_all_options(**kwargs) + + if geo_cities_coords: + _geo_cities_coords = copy.deepcopy(geo_cities_coords) else: - raise TypeError("attr and value must be list") + _geo_cities_coords = copy.deepcopy(CITY_GEO_COORDS) + + _data = [] + for _name, _value in zip(attr, value): + if _name in _geo_cities_coords: + city_coordinate = _geo_cities_coords.get(_name) + city_coordinate.append(_value) + _data.append({"name": _name, "value": city_coordinate}) + else: + print("%s coordinates is not found" % _name) + self._option.update( + geo={ + "map": maptype, + "roam": is_roam, + "label": { + "emphasis": { + "show": True, + "textStyle": { + "color": "#eee" + } + }}, + "itemStyle": { + "normal": { + "areaColor": geo_normal_color, + "borderColor": border_color + }, + "emphasis": { + "areaColor": geo_emphasis_color + }} + }) + self._option.get('legend')[0].get('data').append(name) + + if type == "scatter": + self._option.get('series').append({ + "type": type, + "name": name, + "coordinateSystem": 'geo', + "symbol": chart['symbol'], + "symbolSize": symbol_size, + "data": _data, + "label": chart['label'], + }) + + elif type == "effectScatter": + self._option.get('series').append({ + "type": type, + "name": name, + "coordinateSystem": 'geo', + "showEffectOn": "render", + "rippleEffect": chart['effect'], + "symbol": chart['symbol'], + "symbolSize": symbol_size, + "data": _data, + "label": chart['label'], + }) + + elif type == "heatmap": + self._option.get('series').append({ + "type": type, + "name": name, + "coordinateSystem": 'geo', + "data": _data, + }) + + self._add_chinese_map(maptype) + self._config_components(**kwargs) diff --git a/pyecharts/charts/geolines.py b/pyecharts/charts/geolines.py new file mode 100644 index 000000000..24a23a05f --- /dev/null +++ b/pyecharts/charts/geolines.py @@ -0,0 +1,167 @@ +# coding=utf-8 + +from pyecharts.chart import Chart +from pyecharts.option import get_all_options +from pyecharts.constants import (CITY_GEO_COORDS, SYMBOL) + + +class GeoLines(Chart): + """ + <<< 地理坐标系线图 >>> + + 用于带有起点和终点信息的线数据的绘制,主要用于地图上的航线,路线的可视化。 + """ + def __init__(self, title="", subtitle="", **kwargs): + super(GeoLines, self).__init__(title, subtitle, **kwargs) + self._zlevel = 1 + + def add(self, *args, **kwargs): + self.__add(*args, **kwargs) + + def __add(self, name, data, + maptype='china', + symbol=None, + symbol_size=12, + border_color="#111", + geo_normal_color="#323c48", + geo_emphasis_color="#2a333d", + geo_cities_coords=None, + geo_effect_period=6, + geo_effect_traillength=0, + geo_effect_color='#fff', + geo_effect_symbol='circle', + geo_effect_symbolsize=5, + is_geo_effect_show=True, + is_roam=True, + **kwargs): + """ + + :param name: + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 + :param data: + 数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』。每一行包含两个数据, + 如 ["广州", "北京"],则指定从广州到北京。 + :param maptype: + 地图类型。 支持 china、world、安徽、澳门、北京、重庆、福建、福建、甘肃、 + 广东,广西、广州、海南、河北、黑龙江、河南、湖北、湖南、江苏、江西、吉林、 + 辽宁、内蒙古、宁夏、青海、山东、上海、陕西、山西、四川、台湾、天津、香港、 + 新疆、西藏、云南、浙江,以及 [363个二线城市](https://github.com/chfw/ + echarts-china-cities-js#featuring-citiesor-for-single-download]地图。 + 提醒: + 在画市级地图的时候,城市名字后面的‘市’要省去了,比如,石家庄市的 + ‘市’不要提,即‘石家庄’就可以了。 + :param symbol: + 线两端的标记类型,可以是一个数组分别指定两端,也可以是单个统一指定。 + :param symbol_size: + 线两端的标记大小,可以是一个数组分别指定两端,也可以是单个统一指定。 + :param border_color: + 地图边界颜色。 + :param geo_normal_color: + 正常状态下地图区域的颜色。 + :param geo_emphasis_color: + 高亮状态下地图区域的颜色。 + :param geo_cities_coords: + 用户自定义地区经纬度,类似如 {'阿城': [126.58, 45.32],} 这样的字典,当用 + 于提供了该参数时,将会覆盖原有预存的区域坐标信息。 + :param geo_effect_period: + 特效动画的时间,单位为 s。 + :param geo_effect_traillength: + 特效尾迹的长度。取从 0 到 1 的值,数值越大尾迹越长。 + :param geo_effect_color: + 特效标记的颜色。 + :param geo_effect_symbol: + 特效图形的标记。有 'circle', 'rect', 'roundRect', 'triangle', 'diamond', + 'pin', 'arrow', 'plane' 可选。 + :param geo_effect_symbolsize: + 特效标记的大小,可以设置成诸如 10 这样单一的数字,也可以用数组分开表示高和宽, + 例如 [20, 10] 表示标记宽为20,高为 10。 + :param is_geo_effect_show: + 是否显示特效。 + :param is_roam: + 是否开启鼠标缩放和平移漫游。默认为 True。 + 如果只想要开启缩放或者平移,可以设置成'scale'或者'move'。设置成 True 为都开启。 + :param kwargs: + """ + + chart = get_all_options(**kwargs) + self._zlevel += 1 + if geo_cities_coords: + _geo_cities_coords = geo_cities_coords + else: + _geo_cities_coords = CITY_GEO_COORDS + + if geo_effect_symbol == "plane": + geo_effect_symbol = SYMBOL['plane'] + + _data_lines, _data_scatter = [], [] + for d in data: + _from_name, _to_name = d + _data_lines.append({ + "fromName": _from_name, + "toName": _to_name, + "coords": [ + _geo_cities_coords.get(_from_name, []), + _geo_cities_coords.get(_to_name, []) + ] + }) + _from_v = _geo_cities_coords.get(_from_name, []) + _data_scatter.append({ + "name": _from_name, + "value": _from_v + [0] + }) + _to_v = _geo_cities_coords.get(_to_name, []) + _data_scatter.append({ + "name": _to_name, + "value": _to_v + [0] + }) + + self._option.update( + geo={ + "map": maptype, + "roam": is_roam, + "label": { + "emphasis": { + "show": True, + "textStyle": { + "color": "#eee" + } + }}, + "itemStyle": { + "normal": { + "areaColor": geo_normal_color, + "borderColor": border_color + }, + "emphasis": { + "areaColor": geo_emphasis_color + }} + }) + self._option.get('legend')[0].get('data').append(name) + self._option.get('series').append({ + "type": "lines", + "name": name, + "zlevel": self._zlevel, + "effect": { + "show": is_geo_effect_show, + "period": geo_effect_period, + "trailLength": geo_effect_traillength, + "color": geo_effect_color, + "symbol": geo_effect_symbol, + "symbolSize": geo_effect_symbolsize + }, + "symbol": symbol or ["none", "arrow"], + "symbolSize": symbol_size, + "data": _data_lines, + "lineStyle": chart['line_style'] + }) + self._option.get('series').append({ + "type": "scatter", + "name": name, + "zlevel": self._zlevel, + "coordinateSystem": 'geo', + "symbolSize": 10, + "data": _data_scatter, + "label": chart['label'], + }) + + self._add_chinese_map(maptype) + self._config_components(**kwargs) diff --git a/pyecharts/charts/graph.py b/pyecharts/charts/graph.py index 5d6e7a97e..e3fee2f06 100644 --- a/pyecharts/charts/graph.py +++ b/pyecharts/charts/graph.py @@ -1,13 +1,13 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 -from pyecharts.base import Base +from pyecharts.chart import Chart from pyecharts.option import get_all_options -class Graph(Base): + +class Graph(Chart): """ <<< 关系图 >>> + 用于展现节点以及节点之间的关系数据。 """ def __init__(self, title="", subtitle="", **kwargs): @@ -16,78 +16,99 @@ def __init__(self, title="", subtitle="", **kwargs): def add(self, *args, **kwargs): self.__add(*args, **kwargs) - def __add(self, nodes, links, categories=None, + def __add(self, name, nodes, links, categories=None, is_focusnode=True, is_roam=True, is_rotatelabel=False, - layout="force", - edge_length=50, - gravity=0.2, - repulsion=50, + graph_layout="force", + graph_edge_length=50, + graph_gravity=0.2, + graph_repulsion=50, + graph_edge_symbol=None, + graph_edge_symbolsize=10, **kwargs): """ - + :param name: + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 :param nodes: 关系图结点,包含的数据项有 - # 必须!! - name:结点名称 - # 非必须!! - x:节点的初始 x 值 - y:节点的初始 y 值 - value:结点数值 - category:结点类目 - symbol:标记图形 - symbolSize:标记图形大小 + name:结点名称(必须有!)。 + x: 节点的初始 x 值。 + y:节点的初始 y 值。 + value:结点数值。 + category:结点类目。 + symbol:标记图形,有'circle', 'rect', 'roundRect', 'triangle', + 'diamond', 'pin', 'arrow'可选。 + symbolSize:标记图形大小。 :param links: 结点间的关系数据,包含的数据项有 - # 必须!! - source:边的源节点名称的字符串,也支持使用数字表示源节点的索引 - target:边的目标节点名称的字符串,也支持使用数字表示源节点的索引 - # 非必须!! + source:边的源节点名称的字符串,也支持使用数字表示源节点的索引(必须有!) + target:边的目标节点名称的字符串,也支持使用数字表示源节点的索引(必须有!) value:边的数值,可以在力引导布局中用于映射到边的长度 :param categories: - 结点分类的类目 - 如果节点有分类的话可以通过 nodes[i].category 指定每个节点的类目,类目的样式会被应用到节点样式上 + 结点分类的类目,结点可以指定分类,也可以不指定。 + 如果节点有分类的话可以通过 nodes[i].category 指定每个节点的类目, + 类目的样式会被应用到节点样式上 :param is_focusnode: 是否在鼠标移到节点上的时候突出显示节点以及节点的边和邻接节点 :param is_roam: - 是否开启鼠标缩放和平移漫游。默认不开启 - 如果只想要开启缩放或者平移,可以设置成 'scale' 或者 'move'。设置成 true 为都开启 + 是否开启鼠标缩放和平移漫游。 + 如果只想要开启缩放或者平移,可以设置成'scale'或者'move'。设置成 True 为都开启 :param is_rotatelabel: - 是否旋转标签,默认不旋转 - :param layout: - 关系图布局 'none' 不采用任何布局,使用节点中提供的 x, y 作为节点的位置 - circular:采用环形布局, + 是否旋转标签 + :param graph_layout: + 关系图布局,默认为 'force' + none:不采用任何布局,使用节点中必须提供的 x, y 作为节点的位置。 + circular:采用环形布局 force:采用力引导布局 - :param edge_length: - 力布局下边的两个节点之间的距离,这个距离也会受 repulsion 影响 - 支持设置成数组表达边长的范围,此时不同大小的值会线性映射到不同的长度。值越小则长度越长 - :param gravity: - 节点受到的向中心的引力因子。该值越大节点越往中心点靠拢 - :param repulsion: - 节点之间的斥力因子 - 支持设置成数组表达斥力的范围,此时不同大小的值会线性映射到不同的斥力。值越大则斥力越大 + :param graph_edge_length: + 力布局下边的两个节点之间的距离,这个距离也会受 repulsion 影响。 + 支持设置成数组表达边长的范围,此时不同大小的值会线性映射到不同的 + 长度。值越小则长度越长。 + :param graph_gravity: + 节点受到的向中心的引力因子。该值越大节点越往中心点靠拢。 + :param graph_repulsion: + 节点之间的斥力因子。默认为 50 + 支持设置成数组表达斥力的范围,此时不同大小的值会线性映射到不同的斥力。 + 值越大则斥力越大 + :param graph_edge_symbol: + 边两端的标记类型,可以是一个数组分别指定两端,也可以是单个统一指定。 + 默认不显示标记,常见的可以设置为箭头,如下:edgeSymbol: ['circle', 'arrow']。 + :param graph_edge_symbolsize: + 边两端的标记大小,可以是一个数组分别指定两端,也可以是单个统一指定。 :param kwargs: """ kwargs.update(type="graph") chart = get_all_options(**kwargs) + if categories: for c in categories: - self._option.get('legend').get('data').append(c) + self._option.get('legend')[0].get('data').append(c) + + if graph_edge_symbol is None: + graph_edge_symbol = [None, None] + self._option.get('series').append({ "type": "graph", - "layout": layout, + "name": name, + "layout": graph_layout, "symbol": chart['symbol'], - "circular": {"rotateLabel": is_rotatelabel}, - "force": {"repulsion": repulsion, - "edgeLength": edge_length, - "gravity": gravity}, + "circular": { + "rotateLabel": is_rotatelabel + }, + "force": { + "repulsion": graph_repulsion, + "edgeLength": graph_edge_length, + "gravity": graph_gravity + }, "label": chart['label'], "lineStyle": chart['line_style'], "roam": is_roam, "focusNodeAdjacency": is_focusnode, "data": nodes, "categories": categories, - "links":links + "edgeSymbol": graph_edge_symbol, + "edgeSymbolSize": graph_edge_symbolsize, + "links": links, }) - self._legend_visualmap_colorlst(**kwargs) + self._config_components(**kwargs) diff --git a/pyecharts/charts/heatmap.py b/pyecharts/charts/heatmap.py new file mode 100644 index 000000000..9b8d3ecff --- /dev/null +++ b/pyecharts/charts/heatmap.py @@ -0,0 +1,70 @@ +# coding=utf-8 + +from pyecharts.chart import Chart +from pyecharts.option import get_all_options + + +class HeatMap(Chart): + """ + <<< 热力图 >>> + + 热力图主要通过颜色去表现数值的大小,必须要配合 visualMap 组件使用。 + 直角坐标系上必须要使用两个类目轴。 + """ + def __init__(self, title="", subtitle="", **kwargs): + super(HeatMap, self).__init__(title, subtitle, **kwargs) + + def add(self, *args, **kwargs): + self.__add(*args, **kwargs) + + def __add(self, *args, **kwargs): + """ + + :param args: + 如果指定;额 is_has_calendar_heatmap 属性为 True,则定义如下 + :param name: + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 + :param data: + 数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』。 + 不指定,默认情况定义如下: + :param name: + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 + :param x_axis: + x 坐标轴数据。需为类目轴,也就是不能是数值。 + :param y_axis: + y 坐标轴数据。需为类目轴,也就是不能是数值。 + :param data: + 数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』。 + :param kwargs: + """ + _is_calendar = kwargs.get('is_calendar_heatmap', None) is True + if _is_calendar: + name, data = args + else: + name, x_axis, y_axis, data = args + + chart = get_all_options(**kwargs) + self._option.get('legend')[0].get('data').append(name) + + self._option.get('series').append({ + "type": "heatmap", + "name": name, + "data": data, + "label": chart['label'], + "seriesId": self._option.get('series_id'), + }) + + if _is_calendar: + self._option.get('toolbox').update( + left="98%", top="26%") + self._option.get('series')[0].update(coordinateSystem='calendar') + self._option.update(calendar=chart['calendar']) + else: + xaxis, yaxis = chart['xy_axis'] + self._option.update(xAxis=xaxis, yAxis=yaxis) + self._option.get('xAxis')[0].update( + type='category', data=x_axis, splitArea={"show": True}) + self._option.get('yAxis')[0].update( + type='category', data=y_axis, splitArea={"show": True}) + + self._config_components(**kwargs) diff --git a/pyecharts/charts/kline.py b/pyecharts/charts/kline.py new file mode 100644 index 000000000..4ec76091d --- /dev/null +++ b/pyecharts/charts/kline.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# coding=utf-8 + +from pyecharts.chart import Chart +from pyecharts.option import get_all_options + + +class Kline(Chart): + """ + <<< K 线图 >>> + + 红涨蓝跌 + """ + def __init__(self, title="", subtitle="", **kwargs): + super(Kline, self).__init__(title, subtitle, **kwargs) + + def add(self, *args, **kwargs): + self.__add(*args, **kwargs) + + def __add(self, name, x_axis, y_axis, **kwargs): + """ + + :param name: + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 + :param x_axis: + x 坐标轴数据。 + :param y_axis: + y 坐标轴数据。数据中,每一行是一个『数据项』,每一列属于一个『维度』。 + 数据项具体为 [open, close, lowest, highest] (即:[开盘值, 收盘值, + 最低值, 最高值])。 + :param kwargs: + """ + kwargs.update(type="candlestick", x_axis=x_axis) + chart = get_all_options(**kwargs) + + xaxis, yaxis = chart['xy_axis'] + self._option.update(xAxis=xaxis, yAxis=yaxis) + self._option.get('xAxis')[0].update(scale=True) + self._option.get('yAxis')[0].update( + scale=True, splitArea={"show": True}) + + self._option.get('legend')[0].get('data').append(name) + + self._option.get('series').append({ + "type": "candlestick", + "name": name, + "data": y_axis, + "markPoint": chart['mark_point'], + "markLine": chart['mark_line'], + "seriesId": self._option.get('series_id'), + }) + self._config_components(**kwargs) diff --git a/pyecharts/charts/line.py b/pyecharts/charts/line.py index 91546cac3..ab4181b44 100644 --- a/pyecharts/charts/line.py +++ b/pyecharts/charts/line.py @@ -1,13 +1,13 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 -from pyecharts.base import Base +from pyecharts.chart import Chart from pyecharts.option import get_all_options -class Line(Base): + +class Line(Chart): """ <<< 折线/面积图 >>> + 折线图是用折线将各个数据点标志连接起来的图表,用于展现数据的变化趋势。 """ def __init__(self, title="", subtitle="", **kwargs): @@ -18,6 +18,7 @@ def add(self, *args, **kwargs): def __add(self, name, x_axis, y_axis, is_symbol_show=True, + symbol_size=4, is_smooth=False, is_stack=False, is_step=False, @@ -26,48 +27,52 @@ def __add(self, name, x_axis, y_axis, """ :param name: - 图例名称 + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 :param x_axis: - x 坐标轴数据 + x 坐标轴数据。 :param y_axis: - y 坐标轴数据 + y 坐标轴数据。 :param is_symbol_show: - 是否显示标记图形 + 是否显示标记图形,默认为 True。 :param is_smooth: - 是否平滑曲线显示 + 是否平滑曲线显示,默认为 False。 :param is_stack: - 数据堆叠,同个类目轴上系列配置相同的 stack 值可以堆叠放置 + 数据堆叠,同个类目轴上系列配置相同的 stack 值可以堆叠放置。默认为 False。 :param is_step: - 是否是阶梯线图。可以设置为 true 显示成阶梯线图。 - 也支持设置成 start, middle, end 分别配置在当前点,当前点与下个点的中间点,下个点拐弯。 + 是否是阶梯线图。可以设置为 True 显示成阶梯线图。默认为 False。 + 也支持设置成'start', 'middle', 'end'分别配置在当前点,当前点与下个 + 点的中间下个点拐弯。 :param is_fill: - 是否填充曲线所绘制面积 + 是否填充曲线所绘制面积,默认为 False。 :param kwargs: """ - if isinstance(x_axis, list) and isinstance(y_axis, list): - assert len(x_axis) == len(y_axis) - kwargs.update(x_axis=x_axis, type="line") - chart = get_all_options(**kwargs) - xaxis, yaxis = chart['xy_axis'] - is_stack = "stack" if is_stack else "" - _area_style = {"normal": chart['area_style']} if is_fill else {} - self._option.update(xAxis=xaxis, yAxis=yaxis) - self._option.get('legend').get('data').append(name) - self._option.get('series').append({ - "type": "line", - "name": name, - "symbol": chart['symbol'], - "smooth": is_smooth, - "step": is_step, - "stack": is_stack, - "showSymbol": is_symbol_show, - "data": y_axis, - "label": chart['label'], - "lineStyle": chart['line_style'], - "areaStyle": _area_style, - "markPoint": chart['mark_point'], - "markLine": chart['mark_line'] - }) - self._legend_visualmap_colorlst(**kwargs) + assert len(x_axis) == len(y_axis) + kwargs.update(x_axis=x_axis, type="line", flag=True) + chart = get_all_options(**kwargs) + + xaxis, yaxis = chart['xy_axis'] + if is_stack: + is_stack = "stack_" + str(self._option['series_id']) else: - raise TypeError("x_axis and y_axis must be list") + is_stack = "" + self._option.update(xAxis=xaxis, yAxis=yaxis) + self._option.get('legend')[0].get('data').append(name) + + self._option.get('series').append({ + "type": "line", + "name": name, + "symbol": chart['symbol'], + "symbolSize": symbol_size, + "smooth": is_smooth, + "step": is_step, + "stack": is_stack, + "showSymbol": is_symbol_show, + "data": y_axis, + "label": chart['label'], + "lineStyle": chart['line_style'], + "areaStyle": chart['area_style'], + "markPoint": chart['mark_point'], + "markLine": chart['mark_line'], + "seriesId": self._option.get('series_id'), + }) + self._config_components(**kwargs) diff --git a/pyecharts/charts/line3D.py b/pyecharts/charts/line3D.py new file mode 100644 index 000000000..7106384e9 --- /dev/null +++ b/pyecharts/charts/line3D.py @@ -0,0 +1,54 @@ +# coding=utf-8 + +from pyecharts.chart import Chart +from pyecharts.option import get_all_options +import pyecharts.constants as constants + + +class Line3D(Chart): + """ + <<< 3D 折线图 >>> + """ + + def __init__(self, title="", subtitle="", **kwargs): + kwargs['renderer'] = constants.CANVAS_RENDERER + super(Line3D, self).__init__(title, subtitle, **kwargs) + self._js_dependencies.add('echartsgl') + + def add(self, *args, **kwargs): + self.__add(*args, **kwargs) + + def __add(self, name, data, + grid3d_opacity=1, + **kwargs): + """ + + :param name: + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 + :param data: + 数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』。 + :param grid3d_opacity: + 3D 笛卡尔坐标系组的透明度(线的透明度),默认为 1,完全不透明。 + :param kwargs: + """ + kwargs.update(xaxis3d_type='value', + yaxis3d_type='value', + zaxis3d_type='value') + chart = get_all_options(**kwargs) + + self._option.get('legend')[0].get('data').append(name) + self._option.update( + xAxis3D=chart['xaxis3D'], + yAxis3D=chart['yaxis3D'], + zAxis3D=chart['zaxis3D'], + grid3D=chart['grid3D'] + ) + + self._option.get('series').append({ + "type": "line3D", + "name": name, + "data": data, + "label": chart['label'], + "itemStyle": {"opacity": grid3d_opacity} + }) + self._config_components(**kwargs) diff --git a/pyecharts/charts/liquid.py b/pyecharts/charts/liquid.py new file mode 100644 index 000000000..78bb179bd --- /dev/null +++ b/pyecharts/charts/liquid.py @@ -0,0 +1,63 @@ +# coding=utf-8 + +from pyecharts.chart import Chart + + +class Liquid(Chart): + """ + <<< 水球图 >>> + + 主要用来突出数据的百分比。 + """ + def __init__(self, title="", subtitle="", **kwargs): + super(Liquid, self).__init__(title, subtitle, **kwargs) + self._js_dependencies.add('liquidfill') + + def add(self, *args, **kwargs): + self.__add(*args, **kwargs) + + def __add(self, name, data, + shape='circle', + liquid_color=None, + is_liquid_animation=True, + is_liquid_outline_show=True, + **kwargs): + """ + + :param name: + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 + :param data: + 数据项, 如:[0.6, 0.5, 0.4, 0.3]: 表示水波的高度分别在 60%, + 50%, 40%, 和 30% 处。 + :param shape: + 水球外形,有'circle', 'rect', 'roundRect', 'triangle', 'diamond', + 'pin', 'arrow'可选。默认'circle'。 + :param liquid_color: + 波浪颜色,默认的颜色列表为['#294D99', '#156ACF', '#1598ED', '#45BDFF']。 + :param is_liquid_animation: + 是否显示波浪动画,默认为 True。 + :param is_liquid_outline_show: + 是否显示边框,默认为 True。 + """ + _animation_dur, _animation_dur_update = 2000, 1000 + if not is_liquid_animation: + _animation_dur, _animation_dur_update = 0, 0 + + _color = ['#294D99', '#156ACF', '#1598ED', '#45BDFF'] + if liquid_color: + _color = liquid_color + + self._option.get('series').append({ + "type": "liquidFill", + "name": name, + "data": data, + "waveAnimation": is_liquid_animation, + "animationDuration": _animation_dur, + "animationDurationUpdate": _animation_dur_update, + "color": _color, + "shape": shape, + "outline": { + "show": is_liquid_outline_show + } + }) + self._config_components(**kwargs) diff --git a/pyecharts/charts/map.py b/pyecharts/charts/map.py index cf6fc8360..0e8f7e237 100644 --- a/pyecharts/charts/map.py +++ b/pyecharts/charts/map.py @@ -1,13 +1,17 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 +import sys -from pyecharts.base import Base +from pyecharts.chart import Chart from pyecharts.option import get_all_options -class Map(Base): + +PY2 = sys.version_info[0] == 2 + + +class Map(Chart): """ <<< 地图 >>> + 地图主要用于地理区域数据的可视化。 """ def __init__(self, title="", subtitle="", **kwargs): @@ -17,40 +21,58 @@ def add(self, *args, **kwargs): self.__add(*args, **kwargs) def __add(self, name, attr, value, + maptype="china", is_roam=True, - maptype='china', + is_map_symbol_show=True, + name_map=None, **kwargs): """ :param name: - 图例名称 + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 :param attr: - 属性名称 + 属性名称。 :param value: - 属性所对应的值 - :param is_roam: - 是否开启鼠标缩放和平移漫游。默认不开启 - 如果只想要开启缩放或者平移,可以设置成 scale 或者 move。设置成 true 为都开启 + 属性所对应的值。 :param maptype: - 地图类型,支持 china, world, 广东,福建,山东等... + 地图类型。 支持 china、world、安徽、澳门、北京、重庆、福建、福建、甘肃、广东, + 广西、广州、海南、河北、黑龙江、河南、湖北、湖南、江苏、江西、吉林、辽宁、 + 内蒙古、宁夏、青海、山东、上海、陕西、山西、四川、台湾、天津、香港、新疆、 + 西藏、云南、浙江,以及 [363个二线城市地图](https://github.com/chfw/echarts- + china-cities-js#featuring-citiesor-for-single-download)。 + 提醒: + 在画市级地图的时候,城市名字后面的‘市’要省去了,比如,石家庄市的‘市’不要提, + 即‘石家庄’就可以了。地图提供了自定义模式 [用户如何自定义地图](https://github.com/ + chenjiandongx/pyecharts/blob/master/docs/zh-cn/user-customize-map.md) + :param is_roam: + 是否开启鼠标缩放和平移漫游。默认为 True + 如果只想要开启缩放或者平移,可以设置成'scale'或者'move'。设置成 True 为都开启。 + :param is_map_symbol_show: + 是否显示地图标记红点,默认为 True。 + :param name_map: + 用自定义的地图名称。默认为 None,也就是用地图自带地名。 :param kwargs: """ - if isinstance(attr, list) and isinstance(value, list): - chart = get_all_options(**kwargs) - assert len(attr) == len(value) - _data = [] - for data in zip(attr, value): - _name, _value = data - _data.append({"name": _name, "value": _value}) - self._option.get('legend').get('data').append(name) - self._option.get('series').append({ - "type": "map", - "name": name, - "symbol": chart['symbol'], - "mapType": maptype, - "data": _data, - "roam": is_roam - }) - self._legend_visualmap_colorlst(**kwargs) - else: - raise TypeError("attr and value must be list") + assert len(attr) == len(value) + chart = get_all_options(**kwargs) + _data = [] + for data in zip(attr, value): + _name, _value = data + _data.append({"name": _name, "value": _value}) + self._option.get('legend')[0].get('data').append(name) + + __option__ = { + "type": "map", + "name": name, + "symbol": chart['symbol'], + "label": chart['label'], + "mapType": maptype, + "data": _data, + "roam": is_roam, + "showLegendSymbol": is_map_symbol_show + } + if name_map: + __option__['nameMap'] = name_map + self._option.get('series').append(__option__) + self._add_chinese_map(maptype) + self._config_components(**kwargs) diff --git a/pyecharts/charts/parallel.py b/pyecharts/charts/parallel.py index 7b7354cfe..8a1f30876 100644 --- a/pyecharts/charts/parallel.py +++ b/pyecharts/charts/parallel.py @@ -1,12 +1,13 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 -from pyecharts.base import Base +from pyecharts.chart import Chart +from pyecharts.option import get_all_options -class Parallel(Base): + +class Parallel(Chart): """ <<< 平行坐标系 >>> + 平行坐标系是一种常用的可视化高维数据的图表。 """ def __init__(self, title="", subtitle="", **kwargs): @@ -19,10 +20,18 @@ def config(self, schema=None, c_schema=None): """ :param schema: - 默认平行坐标系的坐标轴信息 + 默认平行坐标系的坐标轴信息,如 ["dim_name1", "dim_name2", "dim_name3"]。 :param c_schema: - 用户自定义平行坐标系的坐标轴信息 - :return: + 用户自定义平行坐标系的坐标轴信息。有以下属性可选。 + dim:维度索引 + name:维度名称 + type:维度类型,有'value', 'category'可选 + value:数值轴,适用于连续数据。 + category: 类目轴,适用于离散的类目数据。 + min:坐标轴刻度最小值。 + max:坐标轴刻度最大值。 + inverse:是否是反向坐标轴。默认为 False + nameLocation:坐标轴名称显示位置。有'start', 'middle', 'end'可选 """ if schema: _schema = [{"dim": i, "name": v} for i, v in enumerate(schema)] @@ -34,18 +43,26 @@ def __add(self, name, data, **kwargs): """ :param name: - 图例名称 + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 :param data: - 数据项,类型为包含列表的列表 [[]]。数据中,每一行是一个『数据项』,每一列属于一个『维度』 + 数据项。数据中,每一行是一个『数据项』,每一列属于一个『维度』。 :param kwargs: - :return: """ - self._option.update(parallel={"left": "5%", "right": "13%", "bottom": "10%", "top": "20%"}) - self._option.get('legend').get('data').append(name) + chart = get_all_options(**kwargs) + self._option.update( + parallel={ + "left": "5%", + "right": "13%", + "bottom": "10%", + "top": "20%" + }) + self._option.get('legend')[0].get('data').append(name) + self._option.get('series').append({ "type": "parallel", "coordinateSystem": "parallel", + "lineStyle": chart['line_style'], "name": name, - "data": data + "data": data, }) - self._legend_visualmap_colorlst(**kwargs) + self._config_components(**kwargs) diff --git a/pyecharts/charts/pie.py b/pyecharts/charts/pie.py index 5f7f3ef1f..710bf4544 100644 --- a/pyecharts/charts/pie.py +++ b/pyecharts/charts/pie.py @@ -1,13 +1,13 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 -from pyecharts.base import Base +from pyecharts.chart import Chart from pyecharts.option import get_all_options -class Pie(Base): + +class Pie(Chart): """ <<< 饼图 >>> + 饼图主要用于表现不同类目的数据在总和中的占比。每个的弧度表示数据数量的比例。 """ def __init__(self, title="", subtitle="", **kwargs): @@ -19,57 +19,67 @@ def add(self, *args, **kwargs): def __add(self, name, attr, value, radius=None, center=None, - rosetype="radius", + rosetype=None, **kwargs): """ :param name: - 图例名称 + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 :param attr: - 属性名称 + 属性名称。 :param value: - 属性所对应的值 + 属性所对应的值。 :param radius: - 饼图的半径,数组的第一项是内半径,第二项是外半径 - 默认设置成百分比,相对于容器高宽中较小的一项的一半 + 饼图的半径,数组的第一项是内半径,第二项是外半径,默认为 [0, 75] + 默认设置成百分比,相对于容器高宽中较小的一项的一半。 :param center: - 饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标 - 默认设置成百分比,设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度 + 饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标,默认为 [50, 50] + 默认设置成百分比,设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度。 :param rosetype: - 是否展示成南丁格尔图,通过半径区分数据大小,可选择两种模式: - radius:扇区圆心角展现数据的百分比,半径展现数据的大小 - area:所有扇区圆心角相同,仅通过半径展现数据大小 + 是否展示成南丁格尔图,通过半径区分数据大小,有'radius'和'area'两种模式。 + 默认为'radius' + radius:扇区圆心角展现数据的百分比,半径展现数据的大小。 + area:所有扇区圆心角相同,仅通过半径展现数据大小。 :param kwargs: """ - if isinstance(attr, list) and isinstance(value, list): - kwargs.update(type="pie") - chart = get_all_options(**kwargs) - assert len(attr) == len(value) - _data = [] - for data in zip(attr, value): - _name, _value = data - _data.append({"name": _name, "value": _value}) - _rmin, _rmax = "0%", "75%" - if radius is not None: - if len(radius) == 2: - _rmin, _rmax = ["%s" %r for r in radius] - _cmin, _cmax = "50%", "50%" - if center is not None: - if len(center) == 2: - _cmin, _cmax = ["%s" %c for c in center] + kwargs.update(type="pie") + chart = get_all_options(**kwargs) + assert len(attr) == len(value) + _data = [] + for data in zip(attr, value): + _name, _value = data + _data.append({"name": _name, "value": _value}) + + _rmin, _rmax = "0%", "75%" + if radius: + if len(radius) == 2: + _rmin, _rmax = ["{}%".format(r) for r in radius] + + _cmin, _cmax = "50%", "50%" + if center: + if len(center) == 2: + _cmin, _cmax = ["{}%".format(c) for c in center] + + if rosetype: if rosetype not in ("radius", "area"): rosetype = "radius" - for a in attr: - self._option.get('legend').get('data').append(a) - self._option.get('series').append({ - "type": "pie", - "name": name, - "data": _data, - "radius": [_rmin, _rmax], - "center": [_cmin, _cmax], - "roseType": rosetype, - "label": chart['label'], - }) - self._legend_visualmap_colorlst(**kwargs) - else: - raise TypeError("attr and value must be list") + + for a in attr: + self._option.get('legend')[0].get('data').append(a) + + _dlst = self._option.get('legend')[0].get('data') + _dset = list(set(_dlst)) + _dset.sort(key=_dlst.index) + self._option.get('legend')[0].update(data=list(_dset)) + + self._option.get('series').append({ + "type": "pie", + "name": name, + "data": _data, + "radius": [_rmin, _rmax], + "center": [_cmin, _cmax], + "roseType": rosetype, + "label": chart['label'], + "seriesId": self._option.get('series_id'), + }) + self._config_components(**kwargs) diff --git a/pyecharts/charts/polar.py b/pyecharts/charts/polar.py index 3c41fb60d..76c79d320 100644 --- a/pyecharts/charts/polar.py +++ b/pyecharts/charts/polar.py @@ -1,13 +1,13 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 -from pyecharts.base import Base +from pyecharts.chart import Chart from pyecharts.option import get_all_options -class Polar(Base): + +class Polar(Chart): """ <<< 极坐标系 >>> + 可以用于散点图和折线图。 """ def __init__(self, title="", subtitle="", **kwargs): @@ -24,38 +24,61 @@ def __add(self, name, data, start_angle=90, rotate_step=0, boundary_gap=True, - clockwise=True, + is_clockwise=True, + is_stack=False, + axis_range=None, + is_angleaxis_show=True, + is_radiusaxis_show=True, **kwargs): """ :param name: - 图例名称 + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 :param data: - 数据项 [极径,极角 [数据值]] + 数据项 [极径,极角 [数据值]]。 :param angle_data: - 角度类目数据 + 角度类目数据。 :param radius_data: - 半径类目数据 + 半径类目数据。 :param type: - 图例类型,有 scatter/effectscatter 可选 + 图例类型,有'line', 'scatter', 'effectScatter', 'barAngle', 'barRadius' + 可选。默认为 'line'。 :param symbol_size: - 标记图形大小 + 标记图形大小,默认为 4。 :param start_angle: - 起始刻度的角度,默认为 90 度,即圆心的正上方。0 度为圆心的正右方 + 起始刻度的角度,默认为 90 度,即圆心的正上方。0 度为圆心的正右方。 :param rotate_step: 刻度标签旋转的角度,在类目轴的类目标签显示不下的时候可以通过旋转防止标签之间重叠 - 旋转的角度从 -90 度到 90 度 + 旋转的角度从 -90 度到 90 度。默认为 0 :param boundary_gap: 坐标轴两边留白策略 - 类目轴中 boundaryGap 可以配置为 true 和 false - 默认为 true,这时候刻度只是作为分隔线,标签和数据点都会在两个刻度之间的带(band)中间 - :param clockwise: - 刻度增长是否按顺时针,默认顺时针 + 默认为 True,这时候刻度只是作为分隔线,标签和数据点都会在两个刻度之间的带(band)中间。 + :param is_clockwise: + 刻度增长是否按顺时针,默认 True + :param is_stack: + 数据堆叠,同个类目轴上系列配置相同的 stack 值可以堆叠放置。 + :param axis_range: + 坐标轴刻度范围。默认值为 [None, None]。 + :param is_angleaxis_show: + 是否显示极坐标系的角度轴,默认为 True。 + :param is_radiusaxis_show: + 是否显示极坐标系的径向轴,默认为 True。 :param kwargs: """ chart = get_all_options(**kwargs) polar_type = 'value' if type == "line" else "category" - self._option.get('legend').get('data').append(name) + is_stack = "stack" if is_stack else "" + self._option.get('legend')[0].get('data').append(name) + + _amin, _amax = None, None + if axis_range: + if len(axis_range) == 2: + _amin, _amax = axis_range + + _area_style = chart['area_style'] + if kwargs.get('area_color', None) is None: + _area_style = None + if type in ("scatter", "line"): self._option.get('series').append({ "type": type, @@ -65,7 +88,9 @@ def __add(self, name, data, "symbolSize": symbol_size, "data": data, "label": chart['label'], + "areaStyle": _area_style }) + elif type == "effectScatter": self._option.get('series').append({ "type": type, @@ -78,24 +103,67 @@ def __add(self, name, data, "data": data, "label": chart['label'], }) - self._option.update( - angleAxis={ - "type": polar_type, - "data": angle_data, - "clockwise": clockwise, - "startAngle": start_angle, - "boundaryGap": boundary_gap, - "splitLine": chart['split_line'], - "axisLine": chart['axis_line'] - } - ) - self._option.update( - radiusAxis={ - "type": polar_type, - "data": radius_data, - "axisLine": chart['axis_line'], - "axisLabel": {"rotate": rotate_step} - } - ) + + elif type == "barRadius": + self._option.get('series').append({ + "type": "bar", + "stack": is_stack, + "name": name, + "coordinateSystem": 'polar', + "data": data, + }) + self._option.update(angleAxis={}) + self._option.update( + radiusAxis={ + "type": polar_type, + "data": radius_data, + "z": 50, + }) + + elif type == "barAngle": + self._option.get('series').append({ + "type": "bar", + "stack": is_stack, + "name": name, + "coordinateSystem": 'polar', + "data": data, + }) + self._option.update(radiusAxis={ + "show": is_radiusaxis_show, + }) + self._option.update( + angleAxis={ + "show": is_angleaxis_show, + "type": polar_type, + "data": radius_data, + "z": 50, + "startAngle": start_angle, + "splitLine": chart['split_line'] + }) + + if type not in ("barAngle", "barRadius"): + self._option.update( + angleAxis={ + "show": is_angleaxis_show, + "type": polar_type, + "data": angle_data, + "clockwise": is_clockwise, + "startAngle": start_angle, + "boundaryGap": boundary_gap, + "splitLine": chart['split_line'], + "axisLine": chart['axis_line'] + } + ) + self._option.update( + radiusAxis={ + "show": is_radiusaxis_show, + "type": polar_type, + "data": radius_data, + "min": _amin, + "max": _amax, + "axisLine": chart['axis_line'], + "axisLabel": {"rotate": rotate_step} + } + ) self._option.update(polar={}) - self._legend_visualmap_colorlst(**kwargs) + self._config_components(**kwargs) diff --git a/pyecharts/charts/radar.py b/pyecharts/charts/radar.py index b273535ff..216509d75 100644 --- a/pyecharts/charts/radar.py +++ b/pyecharts/charts/radar.py @@ -1,13 +1,13 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 -from pyecharts.base import Base +from pyecharts.chart import Chart from pyecharts.option import get_all_options -class Radar(Base): + +class Radar(Chart): """ <<< 雷达图 >>> + 雷达图主要用于表现多变量的数据。 """ def __init__(self, title="", subtitle="", **kwargs): @@ -16,18 +16,25 @@ def __init__(self, title="", subtitle="", **kwargs): def config(self, schema=None, c_schema=None, shape="", - rader_text_color="#000", + radar_text_color="#333", + radar_text_size=12, **kwargs): - """ 配置 rader 组件选项 + """ config rader component options :param schema: - 默认雷达图的指示器,用来指定雷达图中的多个维度,会对数据处理成 {name:xx, value:xx} 的字典 + 默认雷达图的指示器,用来指定雷达图中的多个维度,会对数据处理成。 + {name:xx, value:xx} 的字典 :param c_schema: 用户自定义雷达图的指示器,用来指定雷达图中的多个维度 + name: 指示器名称 + min: 指示器最小值 + max: 指示器最大值 :param shape: - 雷达图绘制类型,支持 polygon(多边形) 和 circle - :param rader_text_color: - 雷达图数据项字体颜色 + 雷达图绘制类型,有'polygon'(多边形)和'circle'可选。 + :param radar_text_color: + 雷达图数据项字体颜色,默认为'#000'。 + :param radar_text_size: + 雷达图m数据项字体大小,默认为 12。 :param kwargs: """ chart = get_all_options(**kwargs) @@ -42,7 +49,11 @@ def config(self, schema=None, radar={ "indicator": indicator, "shape": shape, - "name": {"textStyle": {"color": rader_text_color}}, + "name": { + "textStyle": { + "color": radar_text_color, + "fontSize": radar_text_size, + }}, "splitLine": chart['split_line'], "splitArea": chart['split_area'], "axisLine": chart['axis_line']} @@ -55,23 +66,28 @@ def __add(self, name, value, item_color=None, **kwargs): """ :param name: - 图例名称 + 系列名称,用于 tooltip 的显示,legend 的图例筛选 :param value: - 数据项,类型为包含列表的列表 [[]]。数据中,每一行是一个『数据项』,每一列属于一个『维度』 + 数据项。数据中,每一行是一个『数据项』,每一列属于一个『维度』 :param item_color: 指定单图例颜色 :param kwargs: """ - kwargs.update(flag=True) + kwargs.update(flag=True, type='radar') chart = get_all_options(**kwargs) - self._option.get('legend').get('data').append(name) + self._option.get('legend')[0].get('data').append(name) + self._option.get('series').append({ "type": "radar", "name": name, "data": value, "symbol": chart['symbol'], - "itemStyle": {"normal": {"color": item_color}}, + "label": chart['label'], + "itemStyle": { + "normal": { + "color": item_color + }}, "lineStyle": chart['line_style'], - "areaStyle": {"normal": chart['area_style']} + "areaStyle": chart['area_style'], }) - self._legend_visualmap_colorlst(**kwargs) + self._config_components(**kwargs) diff --git a/pyecharts/charts/sankey.py b/pyecharts/charts/sankey.py new file mode 100644 index 000000000..1a094f57b --- /dev/null +++ b/pyecharts/charts/sankey.py @@ -0,0 +1,58 @@ +# coding=utf-8 + +from pyecharts.chart import Chart +from pyecharts.option import get_all_options + + +class Sankey(Chart): + """ + <<< 桑基图 >>> + + 桑基图是一种特殊的流图, 它主要用来表示原材料、能量等如何从初始形式经过中 + 间过程的加工、转化到达最终形式。 + """ + + def __init__(self, title="", subtitle="", **kwargs): + super(Sankey, self).__init__(title, subtitle, **kwargs) + + def add(self, *args, **kwargs): + self.__add(*args, **kwargs) + + def __add(self, name, nodes, links, + sankey_node_width=20, + sankey_node_gap=8, + **kwargs): + """ + + :param name: + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 + :param nodes: + 桑基图结点,必须包含的数据项有: + name:数据项名称 + value:数据项数值 + :param links: + 桑基图结点关系 + source:边的源节点名称(必须有!) + target:边的目标节点名称(必须有!) + value:边的数值,决定边的宽度。 + :param sankey_node_width: + 图中每个矩形节点的宽度。默认为 20。 + :param sankey_node_gap: + 图中每一列任意两个矩形节点之间的间隔。默认为 8。 + :param kwargs: + """ + chart = get_all_options(**kwargs) + self._option.get('legend')[0].get('data').append(name) + + self._option.get('series').append({ + "type": "sankey", + "name": name, + "layout": None, + "data": nodes, + "links": links, + "nodeWidth": sankey_node_width, + "nodeGap": sankey_node_gap, + "label": chart['label'], + "lineStyle": chart['line_style'], + }) + self._config_components(**kwargs) diff --git a/pyecharts/charts/scatter.py b/pyecharts/charts/scatter.py index e2020db54..94789c78b 100644 --- a/pyecharts/charts/scatter.py +++ b/pyecharts/charts/scatter.py @@ -1,19 +1,17 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 -try: - from PIL import Image -except ImportError: - import Image +from PIL import Image -from pyecharts.base import Base +from pyecharts.chart import Chart from pyecharts.option import get_all_options -class Scatter(Base): + +class Scatter(Chart): """ <<< 散点图 >>> - 直角坐标系上的散点图可以用来展现数据的 x,y 之间的关系,如果数据项有多个维度,可以用颜色来表现,利用 geo 组件。 + + 直角坐标系上的散点图可以用来展现数据的 x,y 之间的关系,如果数据项有多个维度, + 可以用颜色来表现,利用 geo 组件。 """ def __init__(self, title="", subtitle="", **kwargs): super(Scatter, self).__init__(title, subtitle, **kwargs) @@ -21,48 +19,60 @@ def __init__(self, title="", subtitle="", **kwargs): def add(self, *args, **kwargs): self.__add(*args, **kwargs) - def __add(self, name, x_value, y_value, + def __add(self, name, x_axis, y_axis, extra_data=None, symbol_size=10, **kwargs): """ :param name: - 图例名称 + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 :param x_axis: - x 坐标轴数据 + x 坐标轴数据。 :param y_axis: - y 坐标轴数据 + y 坐标轴数据。 + :param extra_data: + 第三维度数据,x 轴为第一个维度,y 轴为第二个维度。(可在 visualmap 中 + 将视图元素映射到第三维度)。 :param symbol_size: - 标记图形大小 + 标记图形大小,默认为 10。 :param kwargs: """ - if isinstance(x_value, list) and isinstance(y_value, list): - assert len(x_value) == len(y_value) - kwargs.update(type="scatter") - chart = get_all_options(**kwargs) - xaxis, yaxis = chart['xy_axis'] - self._option.update(xAxis=xaxis, yAxis=yaxis) - self._option.get('legend').get('data').append(name) - self._option.get('series').append({ - "type": "scatter", - "name": name, - "symbol": chart['symbol'], - "symbolSize": symbol_size, - "data": [list(z) for z in zip(x_value, y_value)], - "label": chart['label'], - }) - self._legend_visualmap_colorlst(**kwargs) + assert len(x_axis) == len(y_axis) + kwargs.update(type="scatter", x_axis=x_axis) + chart = get_all_options(**kwargs) + + xaxis, yaxis = chart['xy_axis'] + self._option.update(xAxis=xaxis, yAxis=yaxis) + self._option.get('legend')[0].get('data').append(name) + + if extra_data: + _data = [list(z) for z in zip(x_axis, y_axis, extra_data)] else: - raise TypeError("x_axis and y_axis must be list") + _data = [list(z) for z in zip(x_axis, y_axis)] + + self._option.get('series').append({ + "type": "scatter", + "name": name, + "symbol": chart['symbol'], + "symbolSize": symbol_size, + "data": _data, + "label": chart['label'], + "markPoint": chart['mark_point'], + "markLine": chart['mark_line'], + "seriesId": self._option.get('series_id'), + }) + self._config_components(**kwargs) def draw(self, path, color=None): - """ 将图片上的像素点转换为数组,如 color 为(255,255,255)时只保留非白色像素点的坐标信息 + """ 将图片上的像素点转换为数组,如 color 为(255,255,255)时只保留非白色像素点的 + 坐标信息返回两个 k_lst, v_lst 两个列表刚好作为散点图的数据项 :param path: 转换图片的地址 :param color: 所要排除的颜色 :return: + 转换后的数组 """ color = color or (255, 255, 255) im = Image.open(path) @@ -72,7 +82,9 @@ def draw(self, path, color=None): for x in range(width): for y in range(height): if y < int(height / 2): - imarray[x, y], imarray[x, height-y-1] = imarray[x, height-y-1], imarray[x, y] - # [:3] 为 r,g,b - result = [(x, y) for x in range(width) for y in range(height) if imarray[x, y][:3] != color] + (imarray[x, y], imarray[x, height-y-1]) = ( + imarray[x, height-y-1], imarray[x, y]) + # [:3] 代表着 R, G, B 三原色 + result = [(x, y) for x in range(width) for y in range(height) + if imarray[x, y][:3] != color] return self.cast(result) diff --git a/pyecharts/charts/scatter3D.py b/pyecharts/charts/scatter3D.py new file mode 100644 index 000000000..dce0825e4 --- /dev/null +++ b/pyecharts/charts/scatter3D.py @@ -0,0 +1,56 @@ +# coding=utf-8 + +from pyecharts.chart import Chart +from pyecharts.option import get_all_options +import pyecharts.constants as constants + + +class Scatter3D(Chart): + """ + <<< 3D 散点图 >>> + """ + + def __init__(self, title="", subtitle="", **kwargs): + kwargs['renderer'] = constants.CANVAS_RENDERER + super(Scatter3D, self).__init__(title, subtitle, **kwargs) + self._js_dependencies.add('echartsgl') + + def add(self, *args, **kwargs): + self.__add(*args, **kwargs) + + def __add(self, name, data, + grid3d_opacity=1, + **kwargs): + """ + + :param name: + 系列名称,用于 tooltip 的显示,legend 的图例筛选 + :param data: + 数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』 + :param grid3d_opacity: + 3D 笛卡尔坐标系组的透明度(点的透明度),默认为 1,完全不透明。 + :param kwargs: + """ + kwargs.update(xaxis3d_type='value', + yaxis3d_type='value', + zaxis3d_type='value') + chart = get_all_options(**kwargs) + + self._option.get('legend')[0].get('data').append(name) + self._option.update( + xAxis3D=chart['xaxis3D'], + yAxis3D=chart['yaxis3D'], + zAxis3D=chart['zaxis3D'], + grid3D=chart['grid3D'] + ) + + self._option.get('series').append({ + "type": "scatter3D", + "name": name, + "data": data, + "label": chart['label'], + "itemStyle": { + "opacity": grid3d_opacity + } + }) + self._config_components(**kwargs) diff --git a/pyecharts/charts/themeriver.py b/pyecharts/charts/themeriver.py new file mode 100644 index 000000000..fe716c061 --- /dev/null +++ b/pyecharts/charts/themeriver.py @@ -0,0 +1,43 @@ +# coding=utf-8 + +from pyecharts.chart import Chart +from pyecharts.option import get_all_options + + +class ThemeRiver(Chart): + """ + <<< 主题河流图 >>> + + 主题河流图是一种特殊的流图, 它主要用来表示事件或主题等在一段时间内的变化。 + """ + def __init__(self, title="", subtitle="", **kwargs): + super(ThemeRiver, self).__init__(title, subtitle, **kwargs) + + def add(self, *args, **kwargs): + self.__add(*args, **kwargs) + + def __add(self, name, data, **kwargs): + """ + + :param name: + 系列名称,用于 tooltip 的显示,legend 的图例筛选。类型必须为 list。 + :param data: + 数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』。 + 每个数据项至少需要三个维度,如 ['2015/11/08', 10, 'DQ'],分别为 + [时间,数值,种类(图例名)]。 + :param kwargs: + """ + chart = get_all_options(**kwargs) + self._option.get('legend')[0].get('data').extend(name) + + self._option.get('series').append({ + "type": "themeRiver", + "name": name, + "data": data, + "label": chart['label'], + "seriesId": self._option.get('series_id'), + }) + + self._option.update(singleAxis={"type": "time"}) + self._config_components(**kwargs) + self._option.get('tooltip').update(trigger='axis') diff --git a/pyecharts/charts/treemap.py b/pyecharts/charts/treemap.py new file mode 100644 index 000000000..dea8971e2 --- /dev/null +++ b/pyecharts/charts/treemap.py @@ -0,0 +1,84 @@ +# coding=utf-8 + +from pyecharts.chart import Chart +from pyecharts.option import get_all_options + + +class TreeMap(Chart): + """ + <<< 树图 >>> + + 树图是一种常见的表达『层级数据』『树状数据』的可视化形式。它主要用面积的方式, + 便于突出展现出『树』的各层级中重要的节点。 + """ + + def __init__(self, title="", subtitle="", **kwargs): + super(TreeMap, self).__init__(title, subtitle, **kwargs) + + def add(self, *args, **kwargs): + self.__add(*args, **kwargs) + + def __add(self, name, data, + treemap_left_depth=None, + treemap_drilldown_icon='▶', + treemap_visible_min=10, + **kwargs): + """ + + :param name: + 系列名称,用于 tooltip 的显示,legend 的图例筛选 + :param data: + 树图的数据项是一棵树,每个节点包括`value`, `name`(可选), + `children`(也是树,可选)如下所示 + [ + { + value: 1212, # 数值 + # 子节点 + children: [ + { + # 子节点数值 + value: 2323, + # 子节点名 + name: 'description of this node', + children: [...], + }, + { + value: 4545, + name: 'description of this node', + children: [ + { + value: 5656, + name: 'description of this node', + children: [...] + }, + ... + ] + } + ] + }, + ... + ] + :param treemap_left_depth: + leafDepth 表示『展示几层』,层次更深的节点则被隐藏起来。设置了 leafDepth 后, + 下钻(drill down)功能开启。drill down 功能即点击后才展示子层级。 + 例如,leafDepth 设置为 1,表示展示一层节点。 + :param treemap_drilldown_icon: + 当节点可以下钻时的提示符。只能是字符。默认为 '▶' + :param treemap_visible_min: + 如果某个节点的矩形的面积,小于这个数值(单位:px平方),这个节点就不显示。 + :param kwargs: + """ + chart = get_all_options(**kwargs) + self._option.get('legend')[0].get('data').append(name) + + self._option.get('series').append({ + "type": "treemap", + "name": name, + "data": data, + "label": chart['label'], + "leafDepth": treemap_left_depth, + "drillDownIcon": treemap_drilldown_icon, + "visibleMin": treemap_visible_min, + "seriesId": self._option.get('series_id'), + }) + self._config_components(**kwargs) diff --git a/pyecharts/charts/wordcloud.py b/pyecharts/charts/wordcloud.py index 27e877e53..07afa3c28 100644 --- a/pyecharts/charts/wordcloud.py +++ b/pyecharts/charts/wordcloud.py @@ -1,16 +1,19 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 -from pyecharts.base import Base +from pyecharts.chart import Chart from pyecharts.option import gen_color -class WordCloud(Base): +SHAPES = ("cardioid", "diamond", "triangle-forward", + "triangle", "pentagon", "star") + + +class WordCloud(Chart): """ <<< 词云图 >>> """ def __init__(self, title="", subtitle="", **kwargs): super(WordCloud, self).__init__(title, subtitle, **kwargs) + self._js_dependencies.add('wordcloud') def add(self, *args, **kwargs): self.__add(*args, **kwargs) @@ -19,55 +22,58 @@ def __add(self, name, attr, value, shape="circle", word_gap=20, word_size_range=None, - rotate_step=45): + rotate_step=45, + **kwargs): """ :param name: - 图例名称 + 系列名称,用于 tooltip 的显示,legend 的图例筛选。 :param attr: - 属性名称 + 属性名称。 :param value: - 属性所对应的值 + 属性所对应的值。 :param shape: - 词云图轮廓,包括 - cardioid, diamond, triangle-forward, triangle, pentagon, star + 词云图轮廓,有'circle', 'cardioid', 'diamond', 'triangle-forward', + 'triangle', 'pentagon', 'star'可选。 :param word_gap: - 单词间隔 + 单词间隔,默认为 20。 :param word_size_range: - 单词字体大小范围 + 单词字体大小范围,默认为 [12, 60]。 :param rotate_step: - 旋转单词角度,默认为 45 度 + 旋转单词角度,默认为 45。 """ - if isinstance(attr, list) and isinstance(value, list): - assert len(attr) == len(value) - _data = [] - for data in zip(attr, value): - _name, _value = data - _data.append({ - "name": _name, - "value": _value, - "textStyle": { - "normal": {"color": gen_color()}} - }) - _min, _max = 12, 60 - if word_size_range is not None: - if len(word_size_range) == 2: - _min, _max = word_size_range - _rmin, _rmax = -90, 90 - # 确保选择形状时能够生效,需使字体不旋转 - if shape in ("cardioid", "diamond", "triangle-forward", "triangle", "pentagon", "star"): - _rmin = _rmax = 0 - else: - shape = "circle" - self._option.get('series').append({ - "type": "wordCloud", - "name": name, - "shape": shape, - "rotationRange": [_rmin, _rmax], - "rotationStep": rotate_step, - "girdSize": word_gap, - "sizeRange": [_min, _max], - "data": _data + assert len(attr) == len(value) + _data = [] + for data in zip(attr, value): + _name, _value = data + _data.append({ + "name": _name, + "value": _value, + "textStyle": { + "normal": { + "color": gen_color() + }} }) + _min, _max = 12, 60 + if word_size_range is not None: + if len(word_size_range) == 2: + _min, _max = word_size_range + + _rmin, _rmax = -90, 90 + # 确保设置的形状有效,单词的旋转角度应该设置在 [-90, 90] + if shape in SHAPES: + _rmin = _rmax = 0 else: - raise TypeError("attr and value must be list") + shape = "circle" + + self._option.get('series').append({ + "type": "wordCloud", + "name": name, + "shape": shape, + "rotationRange": [_rmin, _rmax], + "rotationStep": rotate_step, + "girdSize": word_gap, + "sizeRange": [_min, _max], + "data": _data + }) + self._config_components(**kwargs) diff --git a/pyecharts/conf.py b/pyecharts/conf.py new file mode 100644 index 000000000..f2facc1e4 --- /dev/null +++ b/pyecharts/conf.py @@ -0,0 +1,176 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from pyecharts.js_extensions import EXTENSION_MANAGER +from pyecharts.utils import get_resource_dir + +# Path constants for template dir +DEFAULT_TEMPLATE_DIR = get_resource_dir('templates') + + +class PyEchartsConfig(object): + def __init__(self, echarts_template_dir='.', jshost=None, + force_js_embed=False): + self.echarts_template_dir = echarts_template_dir + self._jshost = remove_trailing_slashes(jshost) + self.force_js_embed = force_js_embed + self.hosted_on_github = False + + @property + def js_embed(self): + """ Determine whether to use embed code in <script> tag. + """ + if self.force_js_embed: + return True + else: + return self.jshost is None + + @property + def jshost(self): + return self._jshost + + @jshost.setter + def jshost(self, jshost): + self._jshost = remove_trailing_slashes(jshost) + + def get_js_library(self, pinyin): + for extension in EXTENSION_MANAGER.get_all_extensions(): + library = extension.get_js_library(pinyin) + if library is not None: + return library + return None + + def chinese_to_pinyin(self, chinese): + for extension in EXTENSION_MANAGER.get_all_extensions(): + __pinyin__ = extension.chinese_to_pinyin(chinese) + if __pinyin__: + return __pinyin__ + else: + # no match found, i.e. 'world' + return chinese + + @staticmethod + def read_file_contents_from_local(js_names): + contents = [] + for name in js_names: + for extension in EXTENSION_MANAGER.get_all_extensions(): + filecontent = extension.read_js_library(name) + if filecontent: + contents.append(filecontent) + break + return contents + + def generate_js_link(self, js_names): + links = [] + for name in js_names: + for extension in EXTENSION_MANAGER.get_all_extensions(): + js_link = extension.get_js_link( + name, jshost=self.jshost) + if js_link: + links.append(js_link) + break + return links + + def produce_require_configuration(self, dependencies): + """ + + :param dependencies: + :param jshost: + :return: + """ + __dependencies__ = _ensure_echarts_is_in_the_front(dependencies) + # if no nick name register, we treat the location as location.js + require_conf_items = [] + + for name in __dependencies__: + for extension in EXTENSION_MANAGER.get_all_extensions(): + config_item = extension.produce_require_config_syntax( + name, + jshost=self.jshost, + use_github=self.hosted_on_github) + if config_item: + require_conf_items.append(config_item) + require_libraries = ["'%s'" % key for key in __dependencies__] + return dict( + config_items=require_conf_items, + libraries=require_libraries + ) + + def produce_html_script_list(self, dependencies): + """ + + :param dependencies: + :return: + """ + __dependencies__ = _ensure_echarts_is_in_the_front(dependencies) + script_list = [ + '%s' % self.get_js_library(key) + for key in __dependencies__] + return script_list + + +def remove_trailing_slashes(jshost): + """ Delete the end separator character if exists. + + :param jshost: + """ + if jshost and jshost[-1] in ('/', '\\'): + return jshost[:-1] + else: + return jshost + + +CURRENT_CONFIG = PyEchartsConfig() + + +def configure(jshost=None, + hosted_on_github=None, + echarts_template_dir=None, + force_js_embed=None, + **kwargs): + """ Config all items for pyecharts when use chart.render() + or page.render(). + + :param jshost: + :param echarts_template_dir: + :param force_js_embed: + :param kwargs: + """ + if jshost: + CURRENT_CONFIG.jshost = jshost + elif hosted_on_github is True: + CURRENT_CONFIG.hosted_on_github = True + if echarts_template_dir: + CURRENT_CONFIG.echarts_template_dir = echarts_template_dir + if force_js_embed is not None: + CURRENT_CONFIG.force_js_embed = force_js_embed + + +def online(host=None): + """ Set the jshost + + :param host: + """ + if host is None: + configure(hosted_on_github=True) + else: + configure(jshost=host) + + +def _ensure_echarts_is_in_the_front(dependencies): + """ make sure echarts is the item in the list + require(['echarts'....], function(ec) {..}) need it to + be first but dependencies is a set so has no sequence + + :param dependencies: + :return: + """ + if len(dependencies) > 1: + dependencies.remove('echarts') + dependencies = ['echarts'] + list(dependencies) + elif len(dependencies) == 1: + # make a new list + dependencies = list(dependencies) + else: + raise Exception("No js library found. Nothing works!") + return dependencies diff --git a/pyecharts/constants.py b/pyecharts/constants.py new file mode 100644 index 000000000..b2f1c5288 --- /dev/null +++ b/pyecharts/constants.py @@ -0,0 +1,3742 @@ +# coding=utf-8 +from __future__ import unicode_literals + +CANVAS_RENDERER = "canvas" +SVG_RENDERER = "svg" +PAGE_TITLE = "Echarts" + +SYMBOL = { + "plane": 'path://M1705.06,1318.313v-89.254l-319.9-221.799l0.073-208.' + '063c0.521-84.662-26.629-121.796-63.961-121.491c-37.332-0.' + '305-64.482,36.829-63.961,121.491l0.073,208.063l-319.9,221.' + '799v89.254l330.343-157.288l12.238,241.308l-134.449,92.931l0.' + '531,42.034l175.125-42.917l175.125,42.917l0.531-42.034l-134' + '.449-92.931l12.238-241.308L1705.06,1318.313z' +} + +CITY_GEO_COORDS = { + '阿城': [126.58, 45.32], + '阿克苏': [80.19, 41.09], + '阿勒泰': [88.12, 47.50], + '阿图什': [76.08, 39.42], + '安达': [125.18, 46.24], + '安国': [115.20, 38.24], + '安康': [109.01, 32.41], + '安陆': [113.41, 31.15], + '安庆': [117.02, 30.31], + '安丘': [119.12, 36.25], + '安顺': [105.55, 26.14], + '安阳': [114.35, 36.1], + '鞍山': [122.85, 41.12], + '澳门': [115.07, 21.33], + '巴中': [106.43, 31.51], + '霸州': [116.24, 39.06], + '白城': [122.50, 45.38], + '白山': [126.26, 41.56], + '白银': [104.12, 36.33], + '百色': [106.36, 23.54], + '蚌埠': [117.21, 32.56], + '包头': [110, 40.58], + '宝鸡': [107.15, 34.38], + '保定': [115.48, 38.85], + '保山': [99.10, 25.08], + '北海': [109.12, 21.49], + '北京': [116.46, 39.92], + '北流': [110.21, 22.42], + '北票': [120.47, 41.48], + '本溪': [123.73, 41.3], + '毕节': [105.18, 27.18], + '滨州': [118.03, 37.36], + '亳州': [115.47, 33.52], + '博乐': [82.08, 44.57], + '沧州': [116.83, 38.33], + '昌吉': [87.18, 44.02], + '昌邑': [119.24, 39.52], + '常德': [111.69, 29.05], + '常熟': [120.74, 31.64], + '常州': [119.95, 31.79], + '巢湖': [117.52, 31.36], + '朝阳': [120.27, 41.34], + '潮阳': [116.36, 23.16], + '潮州': [116.63, 23.68], + '郴州': [113.02, 25.46], + '成都': [104.06, 30.67], + '承德': [117.93, 40.97], + '澄海': [116.46, 23.28], + '赤峰': [118.87, 42.28], + '赤水': [105.42, 28.34], + '重庆': [106.54, 29.59], + '崇州': [103.40, 30.39], + '滁州': [118.18, 32.18], + '楚雄': [101.32, 25.01], + '慈溪': [121.15, 30.11], + '从化': [113.33, 23.33], + '达川': [107.29, 31.14], + '大安': [124.18, 45.30], + '大理': [100.13, 25.34], + '大连': [121.62, 38.92], + '大庆': [125.03, 46.58], + '大石桥': [122.31, 40.37], + '大同': [113.3, 40.12], + '大冶': [114.58, 30.06], + '丹东': [124.37, 40.13], + '丹江口': [108.30, 32.33], + '丹阳': [119.32, 32.00], + '儋州': [109.34, 19.31], + '当阳': [111.47, 30.50], + '德惠': [125.42, 44.32], + '德令哈': [97.23, 37.22], + '德兴': [117.35, 28.57], + '德阳': [104.37, 31.13], + '德州': [116.29, 37.45], + '登封': [113.02, 34.27], + '邓州': [112.05, 32.42], + '定州': [115.00, 38.30], + '东川': [103.12, 26.06], + '东港': [124.08, 39.53], + '东莞': [113.75, 23.04], + '东胜': [109.59, 39.48], + '东台': [120.19, 32.51], + '东阳': [120.14, 29.16], + '东营': [118.49, 37.46], + '都江堰': [103.37, 31.01], + '都匀': [107.31, 26.15], + '敦化': [128.13, 43.22], + '敦煌': [94.41, 40.08], + '峨眉山': [103.29, 29.36], + '额尔古纳': [120.11, 50.13], + '鄂尔多斯': [109.781327, 39.608266], + '鄂州': [114.52, 30.23], + '恩平': [112.19, 22.12], + '恩施': [109.29, 30.16], + '二连浩特': [111.58, 43.38], + '番禺': [113.22, 22.57], + '防城港': [108.20, 21.37], + '肥城': [116.46, 36.14], + '丰城': [115.48, 28.12], + '丰南': [118.06, 39.34], + '丰镇': [113.09, 40.27], + '凤城': [124.02, 40.28], + '奉化': [121.24, 29.39], + '佛山': [113.11, 23.05], + '涪陵': [107.22, 29.42], + '福安': [119.39, 27.06], + '福清': [119.23, 25.42], + '福州': [119.3, 26.08], + '抚顺': [123.97, 41.97], + '阜康': [87.58, 44.09], + '阜新': [121.39, 42.01], + '阜阳': [115.48, 32.54], + '富锦': [132.02, 47.15], + '富阳': [119.95, 30.07], + '盖州': [122.21, 40.24], + '赣州': [114.56, 28.52], + '高安': [115.22, 28.25], + '高碑店': [115.51, 39.20], + '高密': [119.44, 36.22], + '高明': [112.50, 22.53], + '高平': [112.55, 35.48], + '高要': [112.26, 23.02], + '高邮': [119.27, 32.47], + '高州': [110.50, 21.54], + '格尔木': [94.55, 36.26], + '个旧': [103.09, 23.21], + '根河': [121.29, 50.48], + '公主岭': [124.49, 43.31], + '巩义': [112.58, 34.46], + '古交': [112.09, 37.54], + '广汉': [104.15, 30.58], + '广水': [113.48, 31.37], + '广元': [105.51, 32.28], + '广州': [113.23, 23.16], + '贵池': [117.28, 30.39], + '贵港': [109.36, 23.06], + '贵阳': [106.71, 26.57], + '桂林': [110.28, 25.29], + '桂平': [110.04, 23.22], + '哈尔滨': [126.63, 45.75], + '哈密': [93.28, 42.50], + '海城': [122.43, 40.51], + '海口': [110.35, 20.02], + '海拉尔': [119.39, 49.12], + '海林': [129.21, 44.35], + '海伦': [126.57, 47.28], + '海门': [121.15, 31.89], + '海宁': [120.42, 30.32], + '邯郸': [114.47, 36.6], + '韩城': [110.27, 35.28], + '汉中': [107.01, 33.04], + '杭州': [120.19, 30.26], + '蒿城': [114.50, 38.02], + '合川': [106.15, 30.02], + '合肥': [117.27, 31.86], + '合山': [108.52, 23.47], + '和龙': [129.00, 42.32], + '和田': [79.55, 37.09], + '河池': [108.03, 24.42], + '河间': [116.05, 38.26], + '河津': [110.41, 35.35], + '河源': [114.68, 23.73], + '菏泽': [115.480656, 35.23375], + '鹤壁': [114.11, 35.54], + '鹤岗': [130.16, 47.20], + '鹤山': [112.57, 22.46], + '黑河': [127.29, 50.14], + '衡水': [115.72, 37.72], + '衡阳': [112.37, 26.53], + '洪湖': [113.27, 29.48], + '洪江': [109.59, 27.07], + '侯马': [111.21, 35.37], + '呼和浩特': [111.65, 40.82], + '湖州': [120.1, 30.86], + '葫芦岛': [120.836932, 40.711052], + '花都': [113.12, 23.23], + '华阴': [110.05, 34.34], + '华蓥': [106.44, 30.26], + '化州': [110.37, 21.39], + '桦甸': [126.44, 42.58], + '怀化': [109.58, 27.33], + '淮安': [119.15, 33.5], + '淮北': [116.47, 33.57], + '淮南': [116.58, 32.37], + '淮阴': [119.02, 33.36], + '黄骅': [117.21, 38.21], + '黄山': [118.18, 29.43], + '黄石': [115.06, 30.12], + '黄州': [114.52, 30.27], + '珲春': [130.22, 42.52], + '辉县': [113.47, 35.27], + '惠阳': [114.28, 22.48], + '惠州': [114.4, 23.09], + '霍林郭勒': [119.38, 45.32], + '霍州': [111.42, 36.34], + '鸡西': [130.57, 45.17], + '吉安': [114.58, 27.07], + '吉林': [126.57, 43.87], + '吉首': [109.43, 28.18], + '即墨': [120.45, 36.38], + '集安': [126.11, 41.08], + '集宁': [113.06, 41.02], + '济南': [117, 36.65], + '济宁': [116.59, 35.38], + '济源': [112.35, 35.04], + '冀州': [115.33, 37.34], + '佳木斯': [130.22, 46.47], + '嘉兴': [120.76, 30.77], + '嘉峪关': [98.289152, 39.77313], + '简阳': [104.32, 30.24], + '建德': [119.16, 29.29], + '建瓯': [118.20, 27.03], + '建阳': [118.07, 27.21], + '江都': [119.32, 32.26], + '江津': [106.16, 29.18], + '江门': [113.06, 22.61], + '江山': [118.37, 28.45], + '江阴': [120.26, 31.91], + '江油': [104.42, 31.48], + '姜堰': [120.08, 32.34], + '胶南': [119.97, 35.88], + '胶州': [120.03336, 36.264622], + '焦作': [113.21, 35.24], + '蛟河': [127.21, 43.42], + '揭阳': [116.35, 23.55], + '介休': [111.55, 37.02], + '界首': [115.21, 33.15], + '金昌': [102.188043, 38.520089], + '金华': [119.64, 29.12], + '金坛': [119.56, 31.74], + '津市': [111.52, 29.38], + '锦州': [121.15, 41.13], + '晋城': [112.51, 35.30], + '晋江': [118.35, 24.49], + '晋州': [115.02, 38.02], + '荆门': [112.12, 31.02], + '荆沙': [112.16, 30.18], + '荆州': [112.239741, 30.335165], + '井冈山': [114.10, 26.34], + '景德镇': [117.13, 29.17], + '景洪': [100.48, 22.01], + '靖江': [120.17, 32.02], + '九江': [115.97, 29.71], + '九台': [125.51, 44.09], + '酒泉': [98.31, 39.44], + '句容': [119.16, 31.95], + '喀什': [75.59, 39.30], + '开封': [114.35, 34.79], + '开平': [112.40, 22.22], + '开原': [124.02, 42.32], + '开远': [103.13, 23.43], + '凯里': [107.58, 26.35], + '克拉玛依': [84.77, 45.59], + '库尔勒': [86.06, 41.68], + '奎屯': [84.56, 44.27], + '昆明': [102.73, 25.04], + '昆山': [120.95, 31.39], + '廓坊': [116.42, 39.31], + '拉萨': [91.11, 29.97], + '莱芜': [117.67, 36.19], + '莱西': [120.53, 36.86], + '莱阳': [120.42, 36.58], + '莱州': [119.942327, 37.177017], + '兰溪': [119.28, 29.12], + '兰州': [103.73, 36.03], + '阆中': [105.58, 31.36], + '廊坊': [116.7, 39.53], + '老河口': [111.40, 32.23], + '乐昌': [113.21, 25.09], + '乐陵': [117.12, 37.44], + '乐平': [117.08, 28.58], + '乐清': [120.58, 28.08], + '乐山': [103.44, 29.36], + '雷州': [110.04, 20.54], + '耒阳': [112.51, 26.24], + '冷水江': [111.26, 27.42], + '冷水滩': [111.35, 26.26], + '醴陵': [113.30, 27.40], + '丽水': [119.92, 28.45], + '利川': [108.56, 30.18], + '溧阳': [119.48, 31.43], + '连云港': [119.16, 34.59], + '连州': [112.23, 24.48], + '涟源': [111.41, 27.41], + '廉江': [110.17, 21.37], + '辽阳': [123.12, 41.16], + '辽源': [125.09, 42.54], + '聊城': [115.97, 36.45], + '林州': [113.49, 36.03], + '临安': [119.72, 30.23], + '临川': [116.21, 27.59], + '临汾': [111.5, 36.08], + '临海': [121.08, 28.51], + '临河': [107.22, 40.46], + '临江': [126.53, 41.49], + '临清': [115.42, 36.51], + '临夏': [103.12, 35.37], + '临湘': [113.27, 29.29], + '临沂': [118.35, 35.05], + '赁祥': [106.44, 22.07], + '灵宝': [110.52, 34.31], + '凌海': [121.21, 41.10], + '凌源': [119.22, 41.14], + '浏阳': [113.37, 28.09], + '柳州': [109.4, 24.33], + '六安': [116.28, 31.44], + '六盘水': [104.50, 26.35], + '龙海': [117.48, 24.26], + '龙井': [129.26, 42.46], + '龙口': [120.21, 37.39], + '龙泉': [119.08, 28.04], + '龙岩': [117.01, 25.06], + '娄底': [111.59, 27.44], + '泸州': [105.39, 28.91], + '鹿泉': [114.19, 38.04], + '潞城': [113.14, 36.21], + '罗定': [111.33, 22.46], + '洛阳': [112.44, 34.7], + '漯河': [114.02, 33.33], + '麻城': [115.01, 31.10], + '马鞍山': [118.48, 31.56], + '满洲里': [117.23, 49.35], + '茂名': [110.88, 21.68], + '梅河口': [125.40, 42.32], + '梅州': [116.1, 24.55], + '汨罗': [113.03, 28.49], + '密山': [131.50, 45.32], + '绵阳': [104.73, 31.48], + '明光': [117.58, 32.47], + '牡丹江': [129.58, 44.6], + '南安': [118.23, 24.57], + '南昌': [115.89, 28.68], + '南充': [106.110698, 30.837793], + '南川': [107.05, 29.10], + '南宫': [115.23, 37.22], + '南海': [113.09, 23.01], + '南京': [118.78, 32.04], + '南宁': [108.33, 22.84], + '南平': [118.10, 26.38], + '南通': [121.05, 32.08], + '南阳': [112.32, 33.00], + '讷河': [124.51, 48.29], + '内江': [105.02, 29.36], + '宁安': [129.28, 44.21], + '宁波': [121.56, 29.86], + '宁德': [119.31, 26.39], + '攀枝花': [101.718637, 26.582347], + '盘锦': [122.070714, 41.119997], + '彭州': [103.57, 30.59], + '蓬莱': [120.75, 37.8], + '邳州': [117.59, 34.19], + '平顶山': [113.29, 33.75], + '平度': [119.97, 36.77], + '平湖': [121.01, 30.42], + '平凉': [106.40, 35.32], + '萍乡': [113.50, 27.37], + '泊头': [116.34, 38.04], + '莆田': [119.01, 24.26], + '濮阳': [115.01, 35.44], + '浦圻': [113.51, 29.42], + '普兰店': [121.58, 39.23], + '普宁': [116.10, 23.18], + '七台河': [130.49, 45.48], + '齐齐哈尔': [123.97, 47.33], + '启乐': [121.39, 31.48], + '潜江': [112.53, 30.26], + '钦州': [108.37, 21.57], + '秦皇岛': [119.57, 39.95], + '沁阳': [112.57, 35.05], + '青岛': [120.33, 36.07], + '青铜峡': [105.59, 37.56], + '青州': [118.28, 36.42], + '清远': [113.01, 23.7], + '清镇': [106.27, 26.33], + '邛崃': [103.28, 30.26], + '琼海': [110.28, 19.14], + '琼山': [110.21, 19.59], + '曲阜': [116.58, 35.36], + '曲靖': [103.79, 25.51], + '衢州': [118.88, 28.97], + '泉州': [118.58, 24.93], + '任丘': [116.07, 38.42], + '日喀则': [88.51, 29.16], + '日照': [119.46, 35.42], + '荣成': [122.41, 37.16], + '如皋': [120.33, 32.23], + '汝州': [112.50, 34.09], + '乳山': [121.52, 36.89], + '瑞安': [120.38, 27.48], + '瑞昌': [115.38, 29.40], + '瑞金': [116.01, 25.53], + '瑞丽': [97.50, 24.00], + '三河': [117.04, 39.58], + '三门峡': [111.19, 34.76], + '三明': [117.36, 26.13], + '三水': [112.52, 23.10], + '三亚': [109.511909, 18.252847], + '沙河': [114.30, 36.51], + '厦门': [118.1, 24.46], + '汕头': [116.69, 23.39], + '汕尾': [115.375279, 22.786211], + '商丘': [115.38, 34.26], + '商州': [109.57, 33.52], + '上海': [121.48, 31.22], + '上饶': [117.58, 25.27], + '上虞': [120.52, 30.01], + '尚志': [127.55, 45.14], + '韶关': [113.62, 24.84], + '韶山': [112.29, 27.54], + '邵武': [117.29, 27.20], + '邵阳': [111.28, 27.14], + '绍兴': [120.58, 30.01], + '深圳': [114.07, 22.62], + '深州': [115.32, 38.01], + '沈阳': [123.38, 41.8], + '十堰': [110.47, 32.40], + '石河子': [86.00, 44.18], + '石家庄': [114.48, 38.03], + '石狮': [118.38, 24.44], + '石首': [112.24, 29.43], + '石嘴山': [106.39, 39.04], + '寿光': [118.73, 36.86], + '舒兰': [126.57, 44.24], + '双城': [126.15, 45.22], + '双鸭山': [131.11, 46.38], + '顺德': [113.15, 22.50], + '朔州': [112.26, 39.19], + '思茅': [100.58, 22.48], + '四会': [112.41, 23.21], + '四平': [124.22, 43.10], + '松原': [124.49, 45.11], + '苏州': [120.62, 31.32], + '宿迁': [118.3, 33.96], + '宿州': [116.58, 33.38], + '绥芬河': [131.11, 44.25], + '绥化': [126.59, 46.38], + '随州': [113.22, 31.42], + '遂宁': [105.33, 30.31], + '塔城': [82.59, 46.46], + '台北': [121.30, 25.03], + '台山': [112.48, 22.15], + '台州': [121.420757, 28.656386], + '太仓': [121.1, 31.45], + '太原': [112.53, 37.87], + '泰安': [117.13, 36.18], + '泰兴': [120.01, 32.10], + '泰州': [119.9, 32.49], + '唐山': [118.02, 39.63], + '洮南': [122.47, 45.20], + '滕州': [117.09, 35.06], + '天津': [117.2, 39.13], + '天门': [113.10, 30.39], + '天水': [105.42, 34.37], + '天长': [118.59, 32.41], + '铁法': [123.32, 42.28], + '铁力': [128.01, 46.59], + '铁岭': [123.51, 42.18], + '通化': [125.56, 41.43], + '通辽': [122.16, 43.37], + '通什': [109.31, 18.46], + '通州': [121.03, 32.05], + '同江': [132.30, 47.39], + '桐乡': [120.32, 30.38], + '铜川': [109.11, 35.09], + '铜陵': [117.48, 30.56], + '铜仁': [109.12, 27.43], + '图们': [129.51, 42.57], + '吐鲁番': [89.11, 42.54], + '瓦房店': [121.979603, 39.627114], + '畹町': [98.04, 24.06], + '万县': [108.21, 30.50], + '万源': [108.03, 32.03], + '威海': [122.1, 37.5], + '潍坊': [119.1, 36.62], + '卫辉': [114.03, 35.24], + '渭南': [109.5, 34.52], + '温岭': [121.21, 28.22], + '温州': [120.65, 28.01], + '文登': [122.05, 37.2], + '乌海': [106.48, 39.40], + '乌兰浩特': [122.03, 46.03], + '乌鲁木齐': [87.68, 43.77], + '无锡': [120.29, 31.59], + '吴川': [110.47, 21.26], + '吴江': [120.63, 31.16], + '吴忠': [106.11, 37.59], + '芜湖': [118.38, 31.33], + '梧州': [111.20, 23.29], + '五常': [127.11, 44.55], + '五大连池': [126.07, 48.38], + '武安': [114.11, 36.42], + '武冈': [110.37, 26.43], + '武汉': [114.31, 30.52], + '武威': [102.39, 37.56], + '武穴': [115.33, 29.51], + '武夷山': [118.02, 27.46], + '舞钢': [113.30, 33.17], + '西安': [108.95, 34.27], + '西昌': [102.16, 27.54], + '西峰': [107.40, 35.45], + '西宁': [101.74, 36.56], + '锡林浩特': [116.03, 43.57], + '仙桃': [113.27, 30.22], + '咸宁': [114.17, 29.53], + '咸阳': [108.72, 34.36], + '香港': [115.12, 21.23], + '湘潭': [112.91, 27.87], + '湘乡': [112.31, 27.44], + '襄樊': [112.08, 32.02], + '项城': [114.54, 33.26], + '萧山': [120.16, 30.09], + '孝感': [113.54, 30.56], + '孝义': [111.48, 37.08], + '忻州': [112.43, 38.24], + '辛集': [115.12, 37.54], + '新会': [113.01, 22.32], + '新乐': [114.41, 38.20], + '新密': [113.22, 34.31], + '新民': [122.49, 41.59], + '新泰': [117.45, 35.54], + '新乡': [113.52, 35.18], + '新沂': [118.20, 34.22], + '新余': [114.56, 27.48], + '新郑': [113.43, 34.24], + '信阳': [114.04, 32.07], + '邢台': [114.48, 37.05], + '荥阳': [113.21, 34.46], + '兴城': [120.41, 40.37], + '兴化': [119.50, 32.56], + '兴宁': [115.43, 24.09], + '兴平': [108.29, 34.18], + '兴义': [104.53, 25.05], + '徐州': [117.2, 34.26], + '许昌': [113.49, 34.01], + '宣威': [104.06, 26.13], + '宣州': [118.44, 30.57], + '牙克石': [120.40, 49.17], + '雅安': [102.59, 29.59], + '烟台': [121.39, 37.52], + '延安': [109.47, 36.6], + '延吉': [129.30, 42.54], + '盐城': [120.13, 33.38], + '盐在': [120.08, 33.22], + '兖州': [116.49, 35.32], + '偃师': [112.47, 34.43], + '扬中': [119.49, 32.14], + '扬州': [119.42, 32.39], + '阳春': [111.48, 22.10], + '阳江': [111.95, 21.85], + '阳泉': [113.57, 37.85], + '伊春': [128.56, 47.42], + '伊宁': [81.20, 43.55], + '仪征': [119.10, 32.16], + '宜宾': [104.56, 29.77], + '宜昌': [111.3, 30.7], + '宜城': [112.15, 31.42], + '宜春': [114.23, 27.47], + '宜兴': [119.82, 31.36], + '宜州': [108.40, 24.28], + '义马': [111.55, 34.43], + '义乌': [120.06, 29.32], + '益阳': [112.20, 28.36], + '银川': [106.27, 38.47], + '应城': [113.33, 30.57], + '英德': [113.22, 24.10], + '鹰潭': [117.03, 28.14], + '营口': [122.18, 40.65], + '永安': [117.23, 25.58], + '永川': [105.53, 29.23], + '永济': [110.27, 34.52], + '永康': [120.01, 29.54], + '永州': [111.37, 26.13], + '余杭': [120.18, 30.26], + '余姚': [121.10, 30.02], + '愉树': [126.32, 44.49], + '榆次': [112.43, 37.41], + '榆林': [109.47, 38.18], + '禹城': [116.39, 36.56], + '禹州': [113.28, 34.09], + '玉林': [110.09, 22.38], + '玉门': [97.35, 39.49], + '玉溪': [102.52, 24.35], + '沅江': [112.22, 28.50], + '原平': [112.42, 38.43], + '岳阳': [113.09, 29.37], + '云浮': [112.02, 22.93], + '运城': [110.59, 35.02], + '枣阳': [112.44, 32.07], + '枣庄': [117.57, 34.86], + '增城': [113.49, 23.18], + '扎兰屯': [122.47, 48.00], + '湛江': [110.359377, 21.270708], + '张家港': [120.555821, 31.875428], + '张家界': [110.479191, 29.117096], + '张家口': [114.87, 40.82], + '张掖': [100.26, 38.56], + '章丘': [117.53, 36.72], + '漳平': [117.24, 25.17], + '漳州': [117.39, 24.31], + '樟树': [115.32, 28.03], + '长春': [125.35, 43.88], + '长葛': [113.47, 34.12], + '长乐': [119.31, 25.58], + '长沙': [113, 28.21], + '长治': [113.08, 36.18], + '招远': [120.38, 37.35], + '昭通': [103.42, 27.20], + '肇东': [125.58, 46.04], + '肇庆': [112.44, 23.05], + '镇江': [119.44, 32.2], + '郑州': [113.65, 34.76], + '枝城': [111.27, 30.23], + '中山': [113.38, 22.52], + '钟祥': [112.34, 31.10], + '舟山': [122.207216, 29.985295], + '周口': [114.38, 33.37], + '株洲': [113.16, 27.83], + '珠海': [113.52, 22.3], + '诸城': [119.24, 35.59], + '诸暨': [120.23, 29.71], + '驻马店': [114.01, 32.58], + '庄河': [122.58, 39.41], + '涿州': [115.59, 39.29], + '资兴': [113.13, 25.58], + '资阳': [104.38, 30.09], + '淄博': [118.05, 36.78], + '自贡': [104.778442, 29.33903], + '邹城': [116.58, 35.24], + '遵化': [117.58, 40.11], + '遵义': [106.9, 27.7], + '晋中': [112.75, 37.68], + '吕梁': [111.13, 37.52], + '呼伦贝尔': [119.77, 49.22], + '巴彦淖尔': [107.42, 40.75], + '抚州': [116.35, 28.0], + '襄阳': [112.2, 32.08], + '黄冈': [114.87, 30.45], + '红河': [103.4, 23.37], + '文山': [104.25, 23.37], + '商洛': [109.93, 33.87], + '定西': [104.62, 35.58], + '陇南': [104.92, 33.4], + '北京市': [116.4, 39.9], + '天安门': [116.38, 39.9], + '东城区': [116.42, 39.93], + '西城区': [116.37, 39.92], + '崇文区': [116.43, 39.88], + '宣武区': [116.35, 39.87], + '丰台区': [116.28, 39.85], + '石景山区': [116.22, 39.9], + '海淀区': [116.3, 39.95], + '门头沟区': [116.1, 39.93], + '房山区': [116.13, 39.75], + '通州区': [116.65, 39.92], + '顺义区': [116.65, 40.13], + '昌平区': [116.23, 40.22], + '大兴区': [116.33, 39.73], + '怀柔区': [116.63, 40.32], + '平谷区': [117.12, 40.13], + '密云县': [116.83, 40.37], + '延庆县': [115.97, 40.45], + '天津市': [117.2, 39.12], + '河西区': [117.22, 39.12], + '南开区': [117.15, 39.13], + '河北区': [117.18, 39.15], + '红桥区': [117.15, 39.17], + '塘沽区': [117.65, 39.02], + '汉沽区': [117.8, 39.25], + '大港区': [117.45, 38.83], + '东丽区': [117.3, 39.08], + '西青区': [117.0, 39.13], + '津南区': [117.38, 38.98], + '北辰区': [117.13, 39.22], + '武清区': [117.03, 39.38], + '宝坻区': [117.3, 39.72], + '滨海新区': [117.68, 39.03], + '宁河县': [117.82, 39.33], + '静海县': [116.92, 38.93], + '蓟县': [117.4, 40.05], + '石家庄市': [114.52, 38.05], + '井陉矿区': [114.05, 38.08], + '裕华区': [114.52, 38.02], + '井陉县': [114.13, 38.03], + '正定县': [114.57, 38.15], + '栾城县': [114.65, 37.88], + '行唐县': [114.55, 38.43], + '灵寿县': [114.37, 38.3], + '高邑县': [114.6, 37.6], + '深泽县': [115.2, 38.18], + '赞皇县': [114.38, 37.67], + '无极县': [114.97, 38.18], + '平山县': [114.2, 38.25], + '元氏县': [114.52, 37.75], + '赵县': [114.77, 37.75], + '辛集市': [115.22, 37.92], + '藁城市': [114.83, 38.03], + '晋州市': [115.03, 38.03], + '新乐市': [114.68, 38.35], + '鹿泉市': [114.3, 38.08], + '唐山市': [118.2, 39.63], + '路南区': [118.17, 39.63], + '路北区': [118.22, 39.63], + '古冶区': [118.42, 39.73], + '开平区': [118.27, 39.68], + '丰南区': [118.1, 39.57], + '丰润区': [118.17, 39.83], + '滦县': [118.7, 39.75], + '滦南县': [118.68, 39.5], + '乐亭县': [118.9, 39.42], + '迁西县': [118.32, 40.15], + '玉田县': [117.73, 39.88], + '唐海县': [118.45, 39.27], + '遵化市': [117.95, 40.18], + '迁安市': [118.7, 40.02], + '秦皇岛市': [119.6, 39.93], + '海港区': [119.6, 39.93], + '山海关区': [119.77, 40.0], + '北戴河区': [119.48, 39.83], + '青龙满族自治县': [118.95, 40.4], + '昌黎县': [119.17, 39.7], + '抚宁县': [119.23, 39.88], + '卢龙县': [118.87, 39.88], + '邯郸市': [114.48, 36.62], + '邯山区': [114.48, 36.6], + '丛台区': [114.48, 36.63], + '复兴区': [114.45, 36.63], + '峰峰矿区': [114.2, 36.42], + '邯郸县': [114.53, 36.6], + '临漳县': [114.62, 36.35], + '成安县': [114.68, 36.43], + '大名县': [115.15, 36.28], + '涉县': [113.67, 36.57], + '磁县': [114.37, 36.35], + '肥乡县': [114.8, 36.55], + '永年县': [114.48, 36.78], + '邱县': [115.17, 36.82], + '鸡泽县': [114.87, 36.92], + '广平县': [114.93, 36.48], + '馆陶县': [115.3, 36.53], + '魏县': [114.93, 36.37], + '曲周县': [114.95, 36.78], + '武安市': [114.2, 36.7], + '邢台市': [114.48, 37.07], + '邢台县': [114.5, 37.08], + '临城县': [114.5, 37.43], + '内丘县': [114.52, 37.3], + '柏乡县': [114.68, 37.5], + '隆尧县': [114.77, 37.35], + '任县': [114.68, 37.13], + '南和县': [114.68, 37.0], + '宁晋县': [114.92, 37.62], + '巨鹿县': [115.03, 37.22], + '新河县': [115.25, 37.53], + '广宗县': [115.15, 37.07], + '平乡县': [115.03, 37.07], + '威县': [115.25, 36.98], + '清河县': [115.67, 37.07], + '临西县': [115.5, 36.85], + '南宫市': [115.38, 37.35], + '沙河市': [114.5, 36.85], + '保定市': [115.47, 38.87], + '北市区': [115.48, 38.87], + '南市区': [115.5, 38.85], + '满城县': [115.32, 38.95], + '清苑县': [115.48, 38.77], + '涞水县': [115.72, 39.4], + '阜平县': [114.18, 38.85], + '徐水县': [115.65, 39.02], + '定兴县': [115.77, 39.27], + '唐县': [114.98, 38.75], + '高阳县': [115.78, 38.68], + '容城县': [115.87, 39.05], + '涞源县': [114.68, 39.35], + '望都县': [115.15, 38.72], + '安新县': [115.93, 38.92], + '易县': [115.5, 39.35], + '曲阳县': [114.7, 38.62], + '蠡县': [115.57, 38.48], + '顺平县': [115.13, 38.83], + '博野县': [115.47, 38.45], + '雄县': [116.1, 38.98], + '涿州市': [115.97, 39.48], + '定州市': [114.97, 38.52], + '安国市': [115.32, 38.42], + '高碑店市': [115.85, 39.33], + '张家口市': [114.88, 40.82], + '宣化区': [115.05, 40.6], + '下花园区': [115.27, 40.48], + '宣化县': [115.02, 40.55], + '张北县': [114.7, 41.15], + '康保县': [114.62, 41.85], + '沽源县': [115.7, 41.67], + '尚义县': [113.97, 41.08], + '蔚县': [114.57, 39.85], + '阳原县': [114.17, 40.12], + '怀安县': [114.42, 40.67], + '万全县': [114.72, 40.75], + '怀来县': [115.52, 40.4], + '涿鹿县': [115.22, 40.38], + '赤城县': [115.83, 40.92], + '崇礼县': [115.27, 40.97], + '承德市': [117.93, 40.97], + '双滦区': [117.78, 40.95], + '鹰手营子矿区': [117.65, 40.55], + '承德县': [118.17, 40.77], + '兴隆县': [117.52, 40.43], + '平泉县': [118.68, 41.0], + '滦平县': [117.33, 40.93], + '隆化县': [117.72, 41.32], + '丰宁满族自治县': [116.65, 41.2], + '宽城满族自治县': [118.48, 40.6], + '围场满族蒙古族自治县': [117.75, 41.93], + '沧州市': [116.83, 38.3], + '运河区': [116.85, 38.32], + '沧县': [116.87, 38.3], + '青县': [116.82, 38.58], + '东光县': [116.53, 37.88], + '海兴县': [117.48, 38.13], + '盐山县': [117.22, 38.05], + '肃宁县': [115.83, 38.43], + '南皮县': [116.7, 38.03], + '吴桥县': [116.38, 37.62], + '献县': [116.12, 38.18], + '孟村回族自治县': [117.1, 38.07], + '泊头市': [116.57, 38.07], + '任丘市': [116.1, 38.72], + '黄骅市': [117.35, 38.37], + '河间市': [116.08, 38.43], + '廊坊市': [116.7, 39.52], + '安次区': [116.68, 39.52], + '广阳区': [116.72, 39.53], + '固安县': [116.3, 39.43], + '永清县': [116.5, 39.32], + '香河县': [117.0, 39.77], + '大城县': [116.63, 38.7], + '文安县': [116.47, 38.87], + '大厂回族自治县': [116.98, 39.88], + '霸州市': [116.4, 39.1], + '三河市': [117.07, 39.98], + '衡水市': [115.68, 37.73], + '桃城区': [115.68, 37.73], + '枣强县': [115.72, 37.52], + '武邑县': [115.88, 37.82], + '武强县': [115.98, 38.03], + '饶阳县': [115.73, 38.23], + '安平县': [115.52, 38.23], + '故城县': [115.97, 37.35], + '景县': [116.27, 37.7], + '阜城县': [116.15, 37.87], + '冀州市': [115.57, 37.57], + '深州市': [115.55, 38.02], + '太原市': [112.55, 37.87], + '小店区': [112.57, 37.73], + '迎泽区': [112.57, 37.87], + '杏花岭区': [112.57, 37.88], + '尖草坪区': [112.48, 37.93], + '万柏林区': [112.52, 37.87], + '晋源区': [112.48, 37.73], + '清徐县': [112.35, 37.6], + '阳曲县': [112.67, 38.07], + '娄烦县': [111.78, 38.07], + '古交市': [112.17, 37.92], + '大同市': [113.3, 40.08], + '南郊区': [113.13, 40.0], + '新荣区': [113.15, 40.27], + '阳高县': [113.75, 40.37], + '天镇县': [114.08, 40.42], + '广灵县': [114.28, 39.77], + '灵丘县': [114.23, 39.43], + '浑源县': [113.68, 39.7], + '左云县': [112.7, 40.0], + '大同县': [113.6, 40.03], + '阳泉市': [113.57, 37.85], + '平定县': [113.62, 37.8], + '盂县': [113.4, 38.08], + '长治市': [113.12, 36.2], + '长治县': [113.03, 36.05], + '襄垣县': [113.05, 36.53], + '屯留县': [112.88, 36.32], + '平顺县': [113.43, 36.2], + '黎城县': [113.38, 36.5], + '壶关县': [113.2, 36.12], + '长子县': [112.87, 36.12], + '武乡县': [112.85, 36.83], + '沁县': [112.7, 36.75], + '沁源县': [112.33, 36.5], + '潞城市': [113.22, 36.33], + '晋城市': [112.83, 35.5], + '沁水县': [112.18, 35.68], + '阳城县': [112.42, 35.48], + '陵川县': [113.27, 35.78], + '泽州县': [112.83, 35.5], + '高平市': [112.92, 35.8], + '朔州市': [112.43, 39.33], + '朔城区': [112.43, 39.33], + '山阴县': [112.82, 39.52], + '应县': [113.18, 39.55], + '右玉县': [112.47, 39.98], + '怀仁县': [113.08, 39.83], + '晋中市': [112.75, 37.68], + '榆次区': [112.75, 37.68], + '榆社县': [112.97, 37.07], + '左权县': [113.37, 37.07], + '和顺县': [113.57, 37.33], + '昔阳县': [113.7, 37.62], + '寿阳县': [113.18, 37.88], + '太谷县': [112.55, 37.42], + '祁县': [112.33, 37.35], + '平遥县': [112.17, 37.18], + '灵石县': [111.77, 36.85], + '介休市': [111.92, 37.03], + '运城市': [110.98, 35.02], + '盐湖区': [110.98, 35.02], + '临猗县': [110.77, 35.15], + '万荣县': [110.83, 35.42], + '闻喜县': [111.22, 35.35], + '稷山县': [110.97, 35.6], + '新绛县': [111.22, 35.62], + '绛县': [111.57, 35.48], + '垣曲县': [111.67, 35.3], + '夏县': [111.22, 35.15], + '平陆县': [111.22, 34.83], + '芮城县': [110.68, 34.7], + '河津市': [110.7, 35.6], + '忻州市': [112.73, 38.42], + '忻府区': [112.73, 38.42], + '定襄县': [112.95, 38.48], + '五台县': [113.25, 38.73], + '代县': [112.95, 39.07], + '繁峙县': [113.25, 39.18], + '宁武县': [112.3, 39.0], + '静乐县': [111.93, 38.37], + '神池县': [112.2, 39.08], + '五寨县': [111.85, 38.9], + '岢岚县': [111.57, 38.7], + '河曲县': [111.13, 39.38], + '偏关县': [111.5, 39.43], + '原平市': [112.7, 38.73], + '临汾市': [111.52, 36.08], + '尧都区': [111.52, 36.08], + '曲沃县': [111.47, 35.63], + '翼城县': [111.72, 35.73], + '襄汾县': [111.43, 35.88], + '洪洞县': [111.67, 36.25], + '古县': [111.92, 36.27], + '安泽县': [112.25, 36.15], + '浮山县': [111.83, 35.97], + '吉县': [110.68, 36.1], + '乡宁县': [110.83, 35.97], + '大宁县': [110.75, 36.47], + '隰县': [110.93, 36.7], + '永和县': [110.63, 36.77], + '蒲县': [111.08, 36.42], + '汾西县': [111.57, 36.65], + '侯马市': [111.35, 35.62], + '霍州市': [111.72, 36.57], + '吕梁市': [111.13, 37.52], + '离石区': [111.13, 37.52], + '文水县': [112.02, 37.43], + '交城县': [112.15, 37.55], + '兴县': [111.12, 38.47], + '临县': [110.98, 37.95], + '柳林县': [110.9, 37.43], + '石楼县': [110.83, 37.0], + '岚县': [111.67, 38.28], + '方山县': [111.23, 37.88], + '中阳县': [111.18, 37.33], + '交口县': [111.2, 36.97], + '孝义市': [111.77, 37.15], + '汾阳市': [111.78, 37.27], + '呼和浩特市': [111.73, 40.83], + '回民区': [111.6, 40.8], + '玉泉区': [111.67, 40.75], + '赛罕区': [111.68, 40.8], + '土默特左旗': [111.13, 40.72], + '托克托县': [111.18, 40.27], + '和林格尔县': [111.82, 40.38], + '清水河县': [111.68, 39.92], + '武川县': [111.45, 41.08], + '包头市': [109.83, 40.65], + '东河区': [110.02, 40.58], + '昆都仑区': [109.83, 40.63], + '石拐区': [110.27, 40.68], + '九原区': [109.97, 40.6], + '土默特右旗': [110.52, 40.57], + '固阳县': [110.05, 41.03], + '达尔罕茂明安联合旗': [110.43, 41.7], + '乌海市': [106.82, 39.67], + '海勃湾区': [106.83, 39.7], + '海南区': [106.88, 39.43], + '乌达区': [106.7, 39.5], + '赤峰市': [118.92, 42.27], + '红山区': [118.97, 42.28], + '元宝山区': [119.28, 42.03], + '松山区': [118.92, 42.28], + '阿鲁科尔沁旗': [120.08, 43.88], + '巴林左旗': [119.38, 43.98], + '巴林右旗': [118.67, 43.52], + '林西县': [118.05, 43.6], + '克什克腾旗': [117.53, 43.25], + '翁牛特旗': [119.02, 42.93], + '喀喇沁旗': [118.7, 41.93], + '宁城县': [119.33, 41.6], + '敖汉旗': [119.9, 42.28], + '通辽市': [122.27, 43.62], + '科尔沁区': [122.27, 43.62], + '科尔沁左翼中旗': [123.32, 44.13], + '科尔沁左翼后旗': [122.35, 42.95], + '开鲁县': [121.3, 43.6], + '库伦旗': [121.77, 42.73], + '奈曼旗': [120.65, 42.85], + '扎鲁特旗': [120.92, 44.55], + '霍林郭勒市': [119.65, 45.53], + '鄂尔多斯市': [109.8, 39.62], + '东胜区': [110.0, 39.82], + '达拉特旗': [110.03, 40.4], + '准格尔旗': [111.23, 39.87], + '鄂托克前旗': [107.48, 38.18], + '鄂托克旗': [107.98, 39.1], + '杭锦旗': [108.72, 39.83], + '乌审旗': [108.85, 38.6], + '伊金霍洛旗': [109.73, 39.57], + '呼伦贝尔市': [119.77, 49.22], + '海拉尔区': [119.77, 49.22], + '阿荣旗': [123.47, 48.13], + '鄂伦春自治旗': [123.72, 50.58], + '鄂温克族自治旗': [119.75, 49.13], + '陈巴尔虎旗': [119.43, 49.32], + '新巴尔虎左旗': [118.27, 48.22], + '新巴尔虎右旗': [116.82, 48.67], + '满洲里市': [117.45, 49.58], + '牙克石市': [120.73, 49.28], + '扎兰屯市': [122.75, 47.98], + '额尔古纳市': [120.18, 50.23], + '根河市': [121.52, 50.78], + '巴彦淖尔市': [107.42, 40.75], + '临河区': [107.4, 40.75], + '五原县': [108.27, 41.1], + '磴口县': [107.02, 40.33], + '乌拉特前旗': [108.65, 40.72], + '乌拉特中旗': [108.52, 41.57], + '乌拉特后旗': [107.07, 41.1], + '杭锦后旗': [107.15, 40.88], + '乌兰察布市': [113.12, 40.98], + '集宁区': [113.1, 41.03], + '卓资县': [112.57, 40.9], + '化德县': [114.0, 41.9], + '商都县': [113.53, 41.55], + '兴和县': [113.88, 40.88], + '凉城县': [112.48, 40.53], + '察哈尔右翼前旗': [113.22, 40.78], + '察哈尔右翼中旗': [112.63, 41.27], + '察哈尔右翼后旗': [113.18, 41.45], + '四子王旗': [111.7, 41.52], + '丰镇市': [113.15, 40.43], + '兴安盟': [122.05, 46.08], + '乌兰浩特市': [122.05, 46.08], + '阿尔山市': [119.93, 47.18], + '科尔沁右翼前旗': [121.92, 46.07], + '科尔沁右翼中旗': [121.47, 45.05], + '扎赉特旗': [122.9, 46.73], + '突泉县': [121.57, 45.38], + '锡林郭勒盟': [116.07, 43.95], + '二连浩特市': [111.98, 43.65], + '锡林浩特市': [116.07, 43.93], + '阿巴嘎旗': [114.97, 44.02], + '苏尼特左旗': [113.63, 43.85], + '苏尼特右旗': [112.65, 42.75], + '东乌珠穆沁旗': [116.97, 45.52], + '西乌珠穆沁旗': [117.6, 44.58], + '太仆寺旗': [115.28, 41.9], + '镶黄旗': [113.83, 42.23], + '正镶白旗': [115.0, 42.3], + '正蓝旗': [116.0, 42.25], + '多伦县': [116.47, 42.18], + '阿拉善盟': [105.67, 38.83], + '阿拉善左旗': [105.67, 38.83], + '阿拉善右旗': [101.68, 39.2], + '额济纳旗': [101.07, 41.97], + '沈阳市': [123.43, 41.8], + '和平区': [123.4, 41.78], + '沈河区': [123.45, 41.8], + '大东区': [123.47, 41.8], + '皇姑区': [123.42, 41.82], + '铁西区': [123.35, 41.8], + '苏家屯区': [123.33, 41.67], + '东陵区': [123.47, 41.77], + '新城子区': [123.52, 42.05], + '于洪区': [123.3, 41.78], + '辽中县': [122.72, 41.52], + '康平县': [123.35, 42.75], + '法库县': [123.4, 42.5], + '新民市': [122.82, 42.0], + '大连市': [121.62, 38.92], + '中山区': [121.63, 38.92], + '西岗区': [121.6, 38.92], + '沙河口区': [121.58, 38.9], + '甘井子区': [121.57, 38.95], + '旅顺口区': [121.27, 38.82], + '金州区': [121.7, 39.1], + '长海县': [122.58, 39.27], + '瓦房店市': [122.0, 39.62], + '普兰店市': [121.95, 39.4], + '庄河市': [122.98, 39.7], + '鞍山市': [122.98, 41.1], + '立山区': [123.0, 41.15], + '千山区': [122.97, 41.07], + '台安县': [122.42, 41.38], + '岫岩满族自治县': [123.28, 40.28], + '海城市': [122.7, 40.88], + '抚顺市': [123.98, 41.88], + '新抚区': [123.88, 41.87], + '东洲区': [124.02, 41.85], + '望花区': [123.78, 41.85], + '顺城区': [123.93, 41.88], + '抚顺县': [123.9, 41.88], + '新宾满族自治县': [125.03, 41.73], + '清原满族自治县': [124.92, 42.1], + '本溪市': [123.77, 41.3], + '平山区': [123.77, 41.3], + '溪湖区': [123.77, 41.33], + '明山区': [123.82, 41.3], + '南芬区': [123.73, 41.1], + '本溪满族自治县': [124.12, 41.3], + '桓仁满族自治县': [125.35, 41.27], + '丹东市': [124.38, 40.13], + '元宝区': [124.38, 40.13], + '振兴区': [124.35, 40.08], + '振安区': [124.42, 40.17], + '宽甸满族自治县': [124.78, 40.73], + '东港市': [124.15, 39.87], + '凤城市': [124.07, 40.45], + '锦州市': [121.13, 41.1], + '古塔区': [121.12, 41.13], + '凌河区': [121.15, 41.12], + '太和区': [121.1, 41.1], + '黑山县': [122.12, 41.7], + '义县': [121.23, 41.53], + '凌海市': [121.35, 41.17], + '营口市': [122.23, 40.67], + '站前区': [122.27, 40.68], + '西市区': [122.22, 40.67], + '鲅鱼圈区': [122.12, 40.27], + '老边区': [122.37, 40.67], + '盖州市': [122.35, 40.4], + '大石桥市': [122.5, 40.65], + '阜新市': [121.67, 42.02], + '海州区': [121.65, 42.02], + '太平区': [121.67, 42.02], + '清河门区': [121.42, 41.75], + '细河区': [121.68, 42.03], + '阜新蒙古族自治县': [121.75, 42.07], + '彰武县': [122.53, 42.38], + '辽阳市': [123.17, 41.27], + '白塔区': [123.17, 41.27], + '文圣区': [123.18, 41.27], + '宏伟区': [123.2, 41.2], + '弓长岭区': [123.45, 41.13], + '太子河区': [123.18, 41.25], + '辽阳县': [123.07, 41.22], + '灯塔市': [123.33, 41.42], + '盘锦市': [122.07, 41.12], + '双台子区': [122.05, 41.2], + '兴隆台区': [122.07, 41.12], + '大洼县': [122.07, 40.98], + '盘山县': [122.02, 41.25], + '铁岭市': [123.83, 42.28], + '银州区': [123.85, 42.28], + '铁岭县': [123.83, 42.3], + '西丰县': [124.72, 42.73], + '昌图县': [124.1, 42.78], + '调兵山市': [123.55, 42.47], + '开原市': [124.03, 42.55], + '朝阳市': [120.45, 41.57], + '双塔区': [120.45, 41.57], + '龙城区': [120.43, 41.6], + '朝阳县': [120.47, 41.58], + '建平县': [119.63, 41.4], + '北票市': [120.77, 41.8], + '凌源市': [119.4, 41.25], + '葫芦岛市': [120.83, 40.72], + '连山区': [120.87, 40.77], + '龙港区': [120.93, 40.72], + '南票区': [120.75, 41.1], + '绥中县': [120.33, 40.32], + '建昌县': [119.8, 40.82], + '兴城市': [120.72, 40.62], + '长春市': [125.32, 43.9], + '南关区': [125.33, 43.87], + '宽城区': [125.32, 43.92], + '朝阳区': [125.28, 43.83], + '二道区': [125.37, 43.87], + '绿园区': [125.25, 43.88], + '双阳区': [125.67, 43.52], + '农安县': [125.18, 44.43], + '九台市': [125.83, 44.15], + '榆树市': [126.55, 44.82], + '德惠市': [125.7, 44.53], + '吉林市': [126.55, 43.83], + '昌邑区': [126.57, 43.88], + '龙潭区': [126.57, 43.92], + '船营区': [126.53, 43.83], + '丰满区': [126.57, 43.82], + '永吉县': [126.5, 43.67], + '蛟河市': [127.33, 43.72], + '桦甸市': [126.73, 42.97], + '舒兰市': [126.95, 44.42], + '磐石市': [126.05, 42.95], + '四平市': [124.35, 43.17], + '铁东区': [124.38, 43.17], + '梨树县': [124.33, 43.32], + '伊通满族自治县': [125.3, 43.35], + '公主岭市': [124.82, 43.5], + '双辽市': [123.5, 43.52], + '辽源市': [125.13, 42.88], + '龙山区': [125.12, 42.9], + '西安区': [125.15, 42.92], + '东丰县': [125.53, 42.68], + '东辽县': [125.0, 42.92], + '通化市': [125.93, 41.73], + '东昌区': [125.95, 41.73], + '二道江区': [126.03, 41.77], + '通化县': [125.75, 41.68], + '辉南县': [126.03, 42.68], + '柳河县': [125.73, 42.28], + '梅河口市': [125.68, 42.53], + '集安市': [126.18, 41.12], + '白山市': [126.42, 41.93], + '八道江区': [126.4, 41.93], + '抚松县': [127.28, 42.33], + '靖宇县': [126.8, 42.4], + '长白朝鲜族自治县': [128.2, 41.42], + '临江市': [126.9, 41.8], + '松原市': [124.82, 45.13], + '宁江区': [124.8, 45.17], + '长岭县': [123.98, 44.28], + '乾安县': [124.02, 45.02], + '扶余县': [126.02, 44.98], + '白城市': [122.83, 45.62], + '洮北区': [122.85, 45.62], + '镇赉县': [123.2, 45.85], + '通榆县': [123.08, 44.82], + '洮南市': [122.78, 45.33], + '大安市': [124.28, 45.5], + '延边朝鲜族自治州': [129.5, 42.88], + '延吉市': [129.5, 42.88], + '图们市': [129.83, 42.97], + '敦化市': [128.23, 43.37], + '珲春市': [130.37, 42.87], + '龙井市': [129.42, 42.77], + '和龙市': [129.0, 42.53], + '汪清县': [129.75, 43.32], + '安图县': [128.9, 43.12], + '哈尔滨市': [126.53, 45.8], + '道里区': [126.62, 45.77], + '南岗区': [126.68, 45.77], + '道外区': [126.65, 45.78], + '香坊区': [126.68, 45.72], + '平房区': [126.62, 45.62], + '松北区': [126.55, 45.8], + '呼兰区': [126.58, 45.9], + '依兰县': [129.55, 46.32], + '方正县': [128.83, 45.83], + '宾县': [127.48, 45.75], + '巴彦县': [127.4, 46.08], + '木兰县': [128.03, 45.95], + '通河县': [128.75, 45.97], + '延寿县': [128.33, 45.45], + '双城市': [126.32, 45.37], + '尚志市': [127.95, 45.22], + '五常市': [127.15, 44.92], + '齐齐哈尔市': [123.95, 47.33], + '龙沙区': [123.95, 47.32], + '建华区': [123.95, 47.35], + '铁锋区': [123.98, 47.35], + '昂昂溪区': [123.8, 47.15], + '富拉尔基区': [123.62, 47.2], + '龙江县': [123.18, 47.33], + '依安县': [125.3, 47.88], + '泰来县': [123.42, 46.4], + '甘南县': [123.5, 47.92], + '富裕县': [124.47, 47.82], + '克山县': [125.87, 48.03], + '克东县': [126.25, 48.03], + '拜泉县': [126.08, 47.6], + '讷河市': [124.87, 48.48], + '鸡西市': [130.97, 45.3], + '鸡冠区': [130.97, 45.3], + '恒山区': [130.93, 45.2], + '滴道区': [130.78, 45.37], + '梨树区': [130.68, 45.08], + '城子河区': [131.0, 45.33], + '麻山区': [130.52, 45.2], + '鸡东县': [131.13, 45.25], + '虎林市': [132.98, 45.77], + '密山市': [131.87, 45.55], + '鹤岗市': [130.27, 47.33], + '向阳区': [130.28, 47.33], + '工农区': [130.25, 47.32], + '兴安区': [130.22, 47.27], + '东山区': [130.32, 47.33], + '兴山区': [130.3, 47.37], + '萝北县': [130.83, 47.58], + '绥滨县': [131.85, 47.28], + '双鸭山市': [131.15, 46.63], + '尖山区': [131.17, 46.63], + '岭东区': [131.13, 46.57], + '四方台区': [131.33, 46.58], + '集贤县': [131.13, 46.72], + '友谊县': [131.8, 46.78], + '宝清县': [132.2, 46.32], + '饶河县': [134.02, 46.8], + '大庆市': [125.03, 46.58], + '萨尔图区': [125.02, 46.6], + '龙凤区': [125.1, 46.53], + '让胡路区': [124.85, 46.65], + '红岗区': [124.88, 46.4], + '大同区': [124.82, 46.03], + '肇州县': [125.27, 45.7], + '肇源县': [125.08, 45.52], + '林甸县': [124.87, 47.18], + '杜尔伯特蒙古族自治县': [124.45, 46.87], + '伊春市': [128.9, 47.73], + '南岔区': [129.28, 47.13], + '友好区': [128.82, 47.85], + '西林区': [129.28, 47.48], + '翠峦区': [128.65, 47.72], + '新青区': [129.53, 48.28], + '美溪区': [129.13, 47.63], + '金山屯区': [129.43, 47.42], + '五营区': [129.25, 48.12], + '乌马河区': [128.78, 47.72], + '汤旺河区': [129.57, 48.45], + '带岭区': [129.02, 47.02], + '乌伊岭区': [129.42, 48.6], + '红星区': [129.38, 48.23], + '上甘岭区': [129.02, 47.97], + '嘉荫县': [130.38, 48.88], + '铁力市': [128.02, 46.98], + '佳木斯市': [130.37, 46.82], + '前进区': [130.37, 46.82], + '东风区': [130.4, 46.82], + '桦南县': [130.57, 46.23], + '桦川县': [130.72, 47.02], + '汤原县': [129.9, 46.73], + '抚远县': [134.28, 48.37], + '同江市': [132.52, 47.65], + '富锦市': [132.03, 47.25], + '七台河市': [130.95, 45.78], + '新兴区': [130.83, 45.8], + '桃山区': [130.97, 45.77], + '茄子河区': [131.07, 45.77], + '勃利县': [130.57, 45.75], + '牡丹江市': [129.6, 44.58], + '东安区': [129.62, 44.58], + '阳明区': [129.63, 44.6], + '爱民区': [129.58, 44.58], + '东宁县': [131.12, 44.07], + '林口县': [130.27, 45.3], + '绥芬河市': [131.15, 44.42], + '海林市': [129.38, 44.57], + '宁安市': [129.47, 44.35], + '穆棱市': [130.52, 44.92], + '黑河市': [127.48, 50.25], + '爱辉区': [127.48, 50.25], + '逊克县': [128.47, 49.58], + '孙吴县': [127.32, 49.42], + '北安市': [126.52, 48.23], + '五大连池市': [126.2, 48.52], + '绥化市': [126.98, 46.63], + '北林区': [126.98, 46.63], + '望奎县': [126.48, 46.83], + '兰西县': [126.28, 46.27], + '青冈县': [126.1, 46.68], + '庆安县': [127.52, 46.88], + '明水县': [125.9, 47.18], + '绥棱县': [127.1, 47.25], + '安达市': [125.33, 46.4], + '肇东市': [125.98, 46.07], + '海伦市': [126.97, 47.47], + '大兴安岭地区': [124.12, 50.42], + '呼玛县': [126.65, 51.73], + '塔河县': [124.7, 52.32], + '漠河县': [122.53, 52.97], + '上海市': [121.47, 31.23], + '黄浦区': [121.48, 31.23], + '卢湾区': [121.47, 31.22], + '徐汇区': [121.43, 31.18], + '长宁区': [121.42, 31.22], + '静安区': [121.45, 31.23], + '闸北区': [121.45, 31.25], + '虹口区': [121.5, 31.27], + '杨浦区': [121.52, 31.27], + '闵行区': [121.38, 31.12], + '宝山区': [121.48, 31.4], + '嘉定区': [121.27, 31.38], + '浦东新区': [121.53, 31.22], + '金山区': [121.33, 30.75], + '松江区': [121.22, 31.03], + '青浦区': [121.12, 31.15], + '南汇区': [121.75, 31.05], + '奉贤区': [121.47, 30.92], + '崇明县': [121.4, 31.62], + '南京市': [118.78, 32.07], + '玄武区': [118.8, 32.05], + '白下区': [118.78, 32.03], + '秦淮区': [118.8, 32.02], + '建邺区': [118.75, 32.03], + '下关区': [118.73, 32.08], + '浦口区': [118.62, 32.05], + '栖霞区': [118.88, 32.12], + '雨花台区': [118.77, 32.0], + '江宁区': [118.85, 31.95], + '六合区': [118.83, 32.35], + '溧水县': [119.02, 31.65], + '高淳县': [118.88, 31.33], + '无锡市': [120.3, 31.57], + '崇安区': [120.3, 31.58], + '南长区': [120.3, 31.57], + '北塘区': [120.28, 31.58], + '锡山区': [120.35, 31.6], + '惠山区': [120.28, 31.68], + '滨湖区': [120.27, 31.57], + '江阴市': [120.27, 31.9], + '宜兴市': [119.82, 31.35], + '徐州市': [117.18, 34.27], + '云龙区': [117.22, 34.25], + '九里区': [117.13, 34.3], + '贾汪区': [117.45, 34.45], + '泉山区': [117.18, 34.25], + '丰县': [116.6, 34.7], + '沛县': [116.93, 34.73], + '铜山县': [117.17, 34.18], + '睢宁县': [117.95, 33.9], + '新沂市': [118.35, 34.38], + '邳州市': [117.95, 34.32], + '常州市': [119.95, 31.78], + '天宁区': [119.93, 31.75], + '钟楼区': [119.93, 31.78], + '戚墅堰区': [120.05, 31.73], + '新北区': [119.97, 31.83], + '武进区': [119.93, 31.72], + '溧阳市': [119.48, 31.42], + '金坛市': [119.57, 31.75], + '苏州市': [120.58, 31.3], + '沧浪区': [120.63, 31.3], + '平江区': [120.63, 31.32], + '金阊区': [120.6, 31.32], + '虎丘区': [120.57, 31.3], + '吴中区': [120.63, 31.27], + '相城区': [120.63, 31.37], + '常熟市': [120.75, 31.65], + '张家港市': [120.55, 31.87], + '昆山市': [120.98, 31.38], + '吴江市': [120.63, 31.17], + '太仓市': [121.1, 31.45], + '南通市': [120.88, 31.98], + '崇川区': [120.85, 32.0], + '港闸区': [120.8, 32.03], + '海安县': [120.45, 32.55], + '如东县': [121.18, 32.32], + '启东市': [121.65, 31.82], + '如皋市': [120.57, 32.4], + '通州市': [121.07, 32.08], + '海门市': [121.17, 31.9], + '连云港市': [119.22, 34.6], + '连云区': [119.37, 34.75], + '新浦区': [119.17, 34.6], + '赣榆县': [119.12, 34.83], + '东海县': [118.77, 34.53], + '灌云县': [119.25, 34.3], + '灌南县': [119.35, 34.08], + '淮安市': [119.02, 33.62], + '清河区': [119.02, 33.6], + '楚州区': [119.13, 33.5], + '淮阴区': [119.03, 33.63], + '清浦区': [119.03, 33.58], + '涟水县': [119.27, 33.78], + '洪泽县': [118.83, 33.3], + '盱眙县': [118.48, 33.0], + '金湖县': [119.02, 33.02], + '盐城市': [120.15, 33.35], + '亭湖区': [120.13, 33.4], + '盐都区': [120.15, 33.33], + '响水县': [119.57, 34.2], + '滨海县': [119.83, 33.98], + '阜宁县': [119.8, 33.78], + '射阳县': [120.25, 33.78], + '建湖县': [119.8, 33.47], + '东台市': [120.3, 32.85], + '大丰市': [120.47, 33.2], + '扬州市': [119.4, 32.4], + '广陵区': [119.43, 32.38], + '邗江区': [119.4, 32.38], + '维扬区': [119.4, 32.42], + '宝应县': [119.3, 33.23], + '仪征市': [119.18, 32.27], + '高邮市': [119.43, 32.78], + '江都市': [119.55, 32.43], + '镇江市': [119.45, 32.2], + '京口区': [119.47, 32.2], + '润州区': [119.4, 32.2], + '丹徒区': [119.45, 32.13], + '丹阳市': [119.57, 32.0], + '扬中市': [119.82, 32.23], + '句容市': [119.17, 31.95], + '泰州市': [119.92, 32.45], + '兴化市': [119.85, 32.92], + '靖江市': [120.27, 32.02], + '泰兴市': [120.02, 32.17], + '姜堰市': [120.15, 32.52], + '宿迁市': [118.28, 33.97], + '宿城区': [118.25, 33.97], + '宿豫区': [118.32, 33.95], + '沭阳县': [118.77, 34.13], + '泗阳县': [118.68, 33.72], + '泗洪县': [118.22, 33.47], + '杭州市': [120.15, 30.28], + '上城区': [120.17, 30.25], + '下城区': [120.17, 30.28], + '江干区': [120.2, 30.27], + '拱墅区': [120.13, 30.32], + '滨江区': [120.2, 30.2], + '萧山区': [120.27, 30.17], + '余杭区': [120.3, 30.42], + '桐庐县': [119.67, 29.8], + '淳安县': [119.03, 29.6], + '建德市': [119.28, 29.48], + '富阳市': [119.95, 30.05], + '临安市': [119.72, 30.23], + '宁波市': [121.55, 29.88], + '海曙区': [121.55, 29.87], + '江东区': [121.57, 29.87], + '北仑区': [121.85, 29.93], + '镇海区': [121.72, 29.95], + '鄞州区': [121.53, 29.83], + '象山县': [121.87, 29.48], + '宁海县': [121.43, 29.28], + '余姚市': [121.15, 30.03], + '慈溪市': [121.23, 30.17], + '奉化市': [121.4, 29.65], + '温州市': [120.7, 28.0], + '鹿城区': [120.65, 28.02], + '龙湾区': [120.82, 27.93], + '洞头县': [121.15, 27.83], + '永嘉县': [120.68, 28.15], + '平阳县': [120.57, 27.67], + '苍南县': [120.4, 27.5], + '文成县': [120.08, 27.78], + '泰顺县': [119.72, 27.57], + '瑞安市': [120.63, 27.78], + '乐清市': [120.95, 28.13], + '嘉兴市': [120.75, 30.75], + '秀洲区': [120.7, 30.77], + '嘉善县': [120.92, 30.85], + '海盐县': [120.95, 30.53], + '海宁市': [120.68, 30.53], + '平湖市': [121.02, 30.7], + '桐乡市': [120.57, 30.63], + '湖州市': [120.08, 30.9], + '吴兴区': [120.12, 30.87], + '南浔区': [120.43, 30.88], + '德清县': [119.97, 30.53], + '长兴县': [119.9, 31.02], + '安吉县': [119.68, 30.63], + '绍兴市': [120.57, 30.0], + '越城区': [120.57, 30.0], + '绍兴县': [120.47, 30.08], + '新昌县': [120.9, 29.5], + '诸暨市': [120.23, 29.72], + '上虞市': [120.87, 30.03], + '嵊州市': [120.82, 29.58], + '金华市': [119.65, 29.08], + '婺城区': [119.65, 29.08], + '金东区': [119.7, 29.08], + '武义县': [119.82, 28.9], + '浦江县': [119.88, 29.45], + '磐安县': [120.43, 29.05], + '兰溪市': [119.45, 29.22], + '义乌市': [120.07, 29.3], + '东阳市': [120.23, 29.28], + '永康市': [120.03, 28.9], + '衢州市': [118.87, 28.93], + '柯城区': [118.87, 28.93], + '衢江区': [118.93, 28.98], + '常山县': [118.52, 28.9], + '开化县': [118.42, 29.13], + '龙游县': [119.17, 29.03], + '江山市': [118.62, 28.75], + '舟山市': [122.2, 30.0], + '定海区': [122.1, 30.02], + '普陀区': [122.3, 29.95], + '岱山县': [122.2, 30.25], + '嵊泗县': [122.45, 30.73], + '台州市': [121.43, 28.68], + '椒江区': [121.43, 28.68], + '黄岩区': [121.27, 28.65], + '路桥区': [121.38, 28.58], + '玉环县': [121.23, 28.13], + '三门县': [121.38, 29.12], + '天台县': [121.03, 29.13], + '仙居县': [120.73, 28.87], + '温岭市': [121.37, 28.37], + '临海市': [121.12, 28.85], + '丽水市': [119.92, 28.45], + '莲都区': [119.92, 28.45], + '青田县': [120.28, 28.15], + '缙云县': [120.07, 28.65], + '遂昌县': [119.27, 28.6], + '松阳县': [119.48, 28.45], + '云和县': [119.57, 28.12], + '庆元县': [119.05, 27.62], + '景宁畲族自治县': [119.63, 27.98], + '龙泉市': [119.13, 28.08], + '合肥市': [117.25, 31.83], + '瑶海区': [117.3, 31.87], + '庐阳区': [117.25, 31.88], + '蜀山区': [117.27, 31.85], + '包河区': [117.3, 31.8], + '长丰县': [117.17, 32.48], + '肥东县': [117.47, 31.88], + '肥西县': [117.17, 31.72], + '芜湖市': [118.38, 31.33], + '镜湖区': [118.37, 31.35], + '鸠江区': [118.38, 31.37], + '芜湖县': [118.57, 31.15], + '繁昌县': [118.2, 31.08], + '南陵县': [118.33, 30.92], + '蚌埠市': [117.38, 32.92], + '龙子湖区': [117.38, 32.95], + '蚌山区': [117.35, 32.95], + '禹会区': [117.33, 32.93], + '淮上区': [117.35, 32.97], + '怀远县': [117.18, 32.97], + '五河县': [117.88, 33.15], + '固镇县': [117.32, 33.32], + '淮南市': [117.0, 32.63], + '大通区': [117.05, 32.63], + '田家庵区': [117.0, 32.67], + '谢家集区': [116.85, 32.6], + '八公山区': [116.83, 32.63], + '潘集区': [116.82, 32.78], + '凤台县': [116.72, 32.7], + '马鞍山市': [118.5, 31.7], + '金家庄区': [118.48, 31.73], + '花山区': [118.5, 31.72], + '雨山区': [118.48, 31.68], + '当涂县': [118.48, 31.55], + '淮北市': [116.8, 33.95], + '杜集区': [116.82, 34.0], + '相山区': [116.8, 33.95], + '烈山区': [116.8, 33.9], + '濉溪县': [116.77, 33.92], + '铜陵市': [117.82, 30.93], + '铜官山区': [117.82, 30.93], + '狮子山区': [117.85, 30.95], + '铜陵县': [117.78, 30.95], + '安庆市': [117.05, 30.53], + '迎江区': [117.05, 30.5], + '大观区': [117.03, 30.52], + '怀宁县': [116.83, 30.72], + '枞阳县': [117.2, 30.7], + '潜山县': [116.57, 30.63], + '太湖县': [116.27, 30.43], + '宿松县': [116.12, 30.15], + '望江县': [116.68, 30.13], + '岳西县': [116.35, 30.85], + '桐城市': [116.95, 31.05], + '黄山市': [118.33, 29.72], + '屯溪区': [118.33, 29.72], + '黄山区': [118.13, 30.3], + '徽州区': [118.33, 29.82], + '歙县': [118.43, 29.87], + '休宁县': [118.18, 29.78], + '黟县': [117.93, 29.93], + '祁门县': [117.72, 29.87], + '滁州市': [118.32, 32.3], + '琅琊区': [118.3, 32.3], + '南谯区': [118.3, 32.32], + '来安县': [118.43, 32.45], + '全椒县': [118.27, 32.1], + '定远县': [117.67, 32.53], + '凤阳县': [117.57, 32.87], + '天长市': [119.0, 32.7], + '明光市': [117.98, 32.78], + '阜阳市': [115.82, 32.9], + '颍州区': [115.8, 32.88], + '颍东区': [115.85, 32.92], + '颍泉区': [115.8, 32.93], + '临泉县': [115.25, 33.07], + '太和县': [115.62, 33.17], + '阜南县': [115.58, 32.63], + '颍上县': [116.27, 32.63], + '宿州市': [116.98, 33.63], + '埇桥区': [116.97, 33.63], + '砀山县': [116.35, 34.42], + '萧县': [116.93, 34.18], + '灵璧县': [117.55, 33.55], + '泗县': [117.88, 33.48], + '巢湖市': [117.87, 31.6], + '居巢区': [117.85, 31.6], + '庐江县': [117.28, 31.25], + '无为县': [117.92, 31.3], + '含山县': [118.1, 31.72], + '和县': [118.37, 31.72], + '六安市': [116.5, 31.77], + '金安区': [116.5, 31.77], + '裕安区': [116.48, 31.77], + '寿县': [116.78, 32.58], + '霍邱县': [116.27, 32.33], + '舒城县': [116.93, 31.47], + '金寨县': [115.92, 31.72], + '霍山县': [116.33, 31.4], + '亳州市': [115.78, 33.85], + '谯城区': [115.77, 33.88], + '涡阳县': [116.22, 33.52], + '蒙城县': [116.57, 33.27], + '利辛县': [116.2, 33.15], + '池州市': [117.48, 30.67], + '贵池区': [117.48, 30.65], + '东至县': [117.02, 30.1], + '石台县': [117.48, 30.22], + '青阳县': [117.85, 30.65], + '宣城市': [118.75, 30.95], + '宣州区': [118.75, 30.95], + '郎溪县': [119.17, 31.13], + '广德县': [119.42, 30.9], + '泾县': [118.4, 30.7], + '绩溪县': [118.6, 30.07], + '旌德县': [118.53, 30.28], + '宁国市': [118.98, 30.63], + '福州市': [119.3, 26.08], + '鼓楼区': [119.3, 26.08], + '台江区': [119.3, 26.07], + '仓山区': [119.32, 26.05], + '马尾区': [119.45, 26.0], + '晋安区': [119.32, 26.08], + '闽侯县': [119.13, 26.15], + '连江县': [119.53, 26.2], + '罗源县': [119.55, 26.48], + '闽清县': [118.85, 26.22], + '永泰县': [118.93, 25.87], + '平潭县': [119.78, 25.52], + '福清市': [119.38, 25.72], + '长乐市': [119.52, 25.97], + '厦门市': [118.08, 24.48], + '思明区': [118.08, 24.45], + '海沧区': [117.98, 24.47], + '湖里区': [118.08, 24.52], + '集美区': [118.1, 24.57], + '同安区': [118.15, 24.73], + '翔安区': [118.23, 24.62], + '莆田市': [119.0, 25.43], + '城厢区': [119.0, 25.43], + '涵江区': [119.1, 25.45], + '荔城区': [119.02, 25.43], + '秀屿区': [119.08, 25.32], + '仙游县': [118.68, 25.37], + '三明市': [117.62, 26.27], + '梅列区': [117.63, 26.27], + '三元区': [117.6, 26.23], + '明溪县': [117.2, 26.37], + '清流县': [116.82, 26.18], + '宁化县': [116.65, 26.27], + '大田县': [117.85, 25.7], + '尤溪县': [118.18, 26.17], + '沙县': [117.78, 26.4], + '将乐县': [117.47, 26.73], + '泰宁县': [117.17, 26.9], + '建宁县': [116.83, 26.83], + '永安市': [117.37, 25.98], + '泉州市': [118.67, 24.88], + '鲤城区': [118.6, 24.92], + '丰泽区': [118.6, 24.92], + '洛江区': [118.67, 24.95], + '泉港区': [118.88, 25.12], + '惠安县': [118.8, 25.03], + '安溪县': [118.18, 25.07], + '永春县': [118.3, 25.32], + '德化县': [118.23, 25.5], + '金门县': [118.32, 24.43], + '石狮市': [118.65, 24.73], + '晋江市': [118.58, 24.82], + '南安市': [118.38, 24.97], + '漳州市': [117.65, 24.52], + '芗城区': [117.65, 24.52], + '龙文区': [117.72, 24.52], + '云霄县': [117.33, 23.95], + '漳浦县': [117.62, 24.13], + '诏安县': [117.18, 23.72], + '长泰县': [117.75, 24.62], + '东山县': [117.43, 23.7], + '南靖县': [117.37, 24.52], + '平和县': [117.3, 24.37], + '华安县': [117.53, 25.02], + '龙海市': [117.82, 24.45], + '南平市': [118.17, 26.65], + '延平区': [118.17, 26.65], + '顺昌县': [117.8, 26.8], + '浦城县': [118.53, 27.92], + '光泽县': [117.33, 27.55], + '松溪县': [118.78, 27.53], + '政和县': [118.85, 27.37], + '邵武市': [117.48, 27.37], + '武夷山市': [118.03, 27.77], + '建瓯市': [118.32, 27.03], + '建阳市': [118.12, 27.33], + '龙岩市': [117.03, 25.1], + '新罗区': [117.03, 25.1], + '长汀县': [116.35, 25.83], + '永定县': [116.73, 24.72], + '上杭县': [116.42, 25.05], + '武平县': [116.1, 25.1], + '连城县': [116.75, 25.72], + '漳平市': [117.42, 25.3], + '宁德市': [119.52, 26.67], + '蕉城区': [119.52, 26.67], + '霞浦县': [120.0, 26.88], + '古田县': [118.75, 26.58], + '屏南县': [118.98, 26.92], + '寿宁县': [119.5, 27.47], + '周宁县': [119.33, 27.12], + '柘荣县': [119.9, 27.23], + '福安市': [119.65, 27.08], + '福鼎市': [120.22, 27.33], + '南昌市': [115.85, 28.68], + '东湖区': [115.9, 28.68], + '西湖区': [115.87, 28.67], + '青云谱区': [115.92, 28.63], + '湾里区': [115.73, 28.72], + '青山湖区': [115.95, 28.68], + '南昌县': [115.93, 28.55], + '新建县': [115.82, 28.7], + '安义县': [115.55, 28.85], + '进贤县': [116.27, 28.37], + '景德镇市': [117.17, 29.27], + '昌江区': [117.17, 29.27], + '珠山区': [117.2, 29.3], + '浮梁县': [117.25, 29.37], + '乐平市': [117.12, 28.97], + '萍乡市': [113.85, 27.63], + '安源区': [113.87, 27.65], + '湘东区': [113.73, 27.65], + '莲花县': [113.95, 27.13], + '上栗县': [113.8, 27.88], + '芦溪县': [114.03, 27.63], + '九江市': [116.0, 29.7], + '庐山区': [115.98, 29.68], + '浔阳区': [115.98, 29.73], + '九江县': [115.88, 29.62], + '武宁县': [115.1, 29.27], + '修水县': [114.57, 29.03], + '永修县': [115.8, 29.03], + '德安县': [115.77, 29.33], + '星子县': [116.03, 29.45], + '都昌县': [116.18, 29.27], + '湖口县': [116.22, 29.73], + '彭泽县': [116.55, 29.9], + '瑞昌市': [115.67, 29.68], + '新余市': [114.92, 27.82], + '渝水区': [114.93, 27.8], + '分宜县': [114.67, 27.82], + '鹰潭市': [117.07, 28.27], + '月湖区': [117.05, 28.23], + '余江县': [116.82, 28.2], + '贵溪市': [117.22, 28.28], + '赣州市': [114.93, 25.83], + '章贡区': [114.93, 25.87], + '赣县': [115.0, 25.87], + '信丰县': [114.93, 25.38], + '大余县': [114.35, 25.4], + '上犹县': [114.53, 25.8], + '崇义县': [114.3, 25.7], + '安远县': [115.38, 25.13], + '龙南县': [114.78, 24.92], + '定南县': [115.03, 24.78], + '全南县': [114.52, 24.75], + '宁都县': [116.02, 26.48], + '于都县': [115.42, 25.95], + '兴国县': [115.35, 26.33], + '会昌县': [115.78, 25.6], + '寻乌县': [115.65, 24.95], + '石城县': [116.33, 26.33], + '瑞金市': [116.03, 25.88], + '南康市': [114.75, 25.65], + '吉安市': [114.98, 27.12], + '吉州区': [114.98, 27.12], + '青原区': [115.0, 27.1], + '吉安县': [114.9, 27.05], + '吉水县': [115.13, 27.22], + '峡江县': [115.33, 27.62], + '新干县': [115.4, 27.77], + '永丰县': [115.43, 27.32], + '泰和县': [114.88, 26.8], + '遂川县': [114.52, 26.33], + '万安县': [114.78, 26.47], + '安福县': [114.62, 27.38], + '永新县': [114.23, 26.95], + '井冈山市': [114.27, 26.72], + '宜春市': [114.38, 27.8], + '袁州区': [114.38, 27.8], + '奉新县': [115.38, 28.7], + '万载县': [114.43, 28.12], + '上高县': [114.92, 28.23], + '宜丰县': [114.78, 28.38], + '靖安县': [115.35, 28.87], + '铜鼓县': [114.37, 28.53], + '丰城市': [115.78, 28.2], + '樟树市': [115.53, 28.07], + '高安市': [115.37, 28.42], + '抚州市': [116.35, 28.0], + '临川区': [116.35, 27.98], + '南城县': [116.63, 27.55], + '黎川县': [116.92, 27.3], + '南丰县': [116.53, 27.22], + '崇仁县': [116.05, 27.77], + '乐安县': [115.83, 27.43], + '宜黄县': [116.22, 27.55], + '金溪县': [116.77, 27.92], + '资溪县': [117.07, 27.7], + '东乡县': [116.62, 28.23], + '广昌县': [116.32, 26.83], + '上饶市': [117.97, 28.45], + '信州区': [117.95, 28.43], + '上饶县': [117.92, 28.43], + '广丰县': [118.18, 28.43], + '玉山县': [118.25, 28.68], + '铅山县': [117.7, 28.32], + '横峰县': [117.6, 28.42], + '弋阳县': [117.43, 28.4], + '余干县': [116.68, 28.7], + '鄱阳县': [116.67, 29.0], + '万年县': [117.07, 28.7], + '婺源县': [117.85, 29.25], + '德兴市': [117.57, 28.95], + '济南市': [116.98, 36.67], + '历下区': [117.08, 36.67], + '市中区': [117.57, 34.87], + '槐荫区': [116.93, 36.65], + '天桥区': [116.98, 36.68], + '历城区': [117.07, 36.68], + '长清区': [116.73, 36.55], + '平阴县': [116.45, 36.28], + '济阳县': [117.22, 36.98], + '商河县': [117.15, 37.32], + '章丘市': [117.53, 36.72], + '青岛市': [120.38, 36.07], + '市南区': [120.38, 36.07], + '市北区': [120.38, 36.08], + '四方区': [120.35, 36.1], + '黄岛区': [120.18, 35.97], + '崂山区': [120.47, 36.1], + '李沧区': [120.43, 36.15], + '城阳区': [120.37, 36.3], + '胶州市': [120.03, 36.27], + '即墨市': [120.45, 36.38], + '平度市': [119.95, 36.78], + '胶南市': [120.03, 35.87], + '莱西市': [120.5, 36.87], + '淄博市': [118.05, 36.82], + '张店区': [118.03, 36.82], + '博山区': [117.85, 36.5], + '临淄区': [118.3, 36.82], + '周村区': [117.87, 36.8], + '桓台县': [118.08, 36.97], + '高青县': [117.82, 37.17], + '沂源县': [118.17, 36.18], + '枣庄市': [117.32, 34.82], + '薛城区': [117.25, 34.8], + '峄城区': [117.58, 34.77], + '台儿庄区': [117.73, 34.57], + '山亭区': [117.45, 35.08], + '滕州市': [117.15, 35.08], + '东营市': [118.67, 37.43], + '东营区': [118.5, 37.47], + '河口区': [118.53, 37.88], + '垦利县': [118.55, 37.58], + '利津县': [118.25, 37.48], + '广饶县': [118.4, 37.07], + '烟台市': [121.43, 37.45], + '芝罘区': [121.38, 37.53], + '福山区': [121.25, 37.5], + '牟平区': [121.6, 37.38], + '莱山区': [121.43, 37.5], + '长岛县': [120.73, 37.92], + '龙口市': [120.52, 37.65], + '莱阳市': [120.7, 36.98], + '莱州市': [119.93, 37.18], + '蓬莱市': [120.75, 37.82], + '招远市': [120.4, 37.37], + '栖霞市': [120.83, 37.3], + '海阳市': [121.15, 36.78], + '潍坊市': [119.15, 36.7], + '潍城区': [119.1, 36.72], + '寒亭区': [119.22, 36.77], + '坊子区': [119.17, 36.67], + '奎文区': [119.12, 36.72], + '临朐县': [118.53, 36.52], + '昌乐县': [118.82, 36.7], + '青州市': [118.47, 36.68], + '诸城市': [119.4, 36.0], + '寿光市': [118.73, 36.88], + '安丘市': [119.2, 36.43], + '高密市': [119.75, 36.38], + '昌邑市': [119.4, 36.87], + '济宁市': [116.58, 35.42], + '任城区': [116.58, 35.42], + '微山县': [117.13, 34.82], + '鱼台县': [116.65, 35.0], + '金乡县': [116.3, 35.07], + '嘉祥县': [116.33, 35.42], + '汶上县': [116.48, 35.73], + '泗水县': [117.27, 35.67], + '梁山县': [116.08, 35.8], + '曲阜市': [116.98, 35.58], + '兖州市': [116.83, 35.55], + '邹城市': [116.97, 35.4], + '泰安市': [117.08, 36.2], + '泰山区': [117.13, 36.18], + '岱岳区': [117.0, 36.18], + '宁阳县': [116.8, 35.77], + '东平县': [116.47, 35.93], + '新泰市': [117.77, 35.92], + '肥城市': [116.77, 36.18], + '威海市': [122.12, 37.52], + '环翠区': [122.12, 37.5], + '文登市': [122.05, 37.2], + '荣成市': [122.42, 37.17], + '乳山市': [121.53, 36.92], + '日照市': [119.52, 35.42], + '东港区': [119.45, 35.42], + '岚山区': [119.33, 35.1], + '五莲县': [119.2, 35.75], + '莒县': [118.83, 35.58], + '莱芜市': [117.67, 36.22], + '莱城区': [117.65, 36.2], + '钢城区': [117.8, 36.07], + '临沂市': [118.35, 35.05], + '兰山区': [118.33, 35.07], + '罗庄区': [118.28, 34.98], + '河东区': [118.4, 35.08], + '沂南县': [118.47, 35.55], + '郯城县': [118.35, 34.62], + '沂水县': [118.62, 35.78], + '苍山县': [118.05, 34.85], + '费县': [117.97, 35.27], + '平邑县': [117.63, 35.5], + '莒南县': [118.83, 35.18], + '蒙阴县': [117.93, 35.72], + '临沭县': [118.65, 34.92], + '德州市': [116.3, 37.45], + '德城区': [116.3, 37.45], + '陵县': [116.57, 37.33], + '宁津县': [116.78, 37.65], + '庆云县': [117.38, 37.78], + '临邑县': [116.87, 37.18], + '齐河县': [116.75, 36.8], + '平原县': [116.43, 37.17], + '夏津县': [116.0, 36.95], + '武城县': [116.07, 37.22], + '乐陵市': [117.23, 37.73], + '禹城市': [116.63, 36.93], + '聊城市': [115.98, 36.45], + '东昌府区': [115.98, 36.45], + '阳谷县': [115.78, 36.12], + '莘县': [115.67, 36.23], + '茌平县': [116.25, 36.58], + '东阿县': [116.25, 36.33], + '冠县': [115.43, 36.48], + '高唐县': [116.23, 36.87], + '临清市': [115.7, 36.85], + '滨州市': [117.97, 37.38], + '滨城区': [118.0, 37.38], + '惠民县': [117.5, 37.48], + '阳信县': [117.58, 37.63], + '无棣县': [117.6, 37.73], + '沾化县': [118.13, 37.7], + '博兴县': [118.13, 37.15], + '邹平县': [117.73, 36.88], + '牡丹区': [115.43, 35.25], + '曹县': [115.53, 34.83], + '单县': [116.08, 34.8], + '成武县': [115.88, 34.95], + '巨野县': [116.08, 35.4], + '郓城县': [115.93, 35.6], + '鄄城县': [115.5, 35.57], + '定陶县': [115.57, 35.07], + '东明县': [115.08, 35.28], + '郑州市': [113.62, 34.75], + '中原区': [113.6, 34.75], + '二七区': [113.65, 34.73], + '管城回族区': [113.67, 34.75], + '金水区': [113.65, 34.78], + '上街区': [113.28, 34.82], + '惠济区': [113.6, 34.87], + '中牟县': [113.97, 34.72], + '巩义市': [112.98, 34.77], + '荥阳市': [113.4, 34.78], + '新密市': [113.38, 34.53], + '新郑市': [113.73, 34.4], + '登封市': [113.03, 34.47], + '开封市': [114.3, 34.8], + '龙亭区': [114.35, 34.8], + '顺河回族区': [114.35, 34.8], + '杞县': [114.78, 34.55], + '通许县': [114.47, 34.48], + '尉氏县': [114.18, 34.42], + '开封县': [114.43, 34.77], + '兰考县': [114.82, 34.82], + '洛阳市': [112.45, 34.62], + '老城区': [112.47, 34.68], + '西工区': [112.43, 34.67], + '涧西区': [112.4, 34.67], + '吉利区': [112.58, 34.9], + '洛龙区': [112.45, 34.62], + '孟津县': [112.43, 34.83], + '新安县': [112.15, 34.72], + '栾川县': [111.62, 33.78], + '嵩县': [112.1, 34.15], + '汝阳县': [112.47, 34.15], + '宜阳县': [112.17, 34.52], + '洛宁县': [111.65, 34.38], + '伊川县': [112.42, 34.42], + '偃师市': [112.78, 34.73], + '平顶山市': [113.18, 33.77], + '新华区': [113.3, 33.73], + '卫东区': [113.33, 33.73], + '石龙区': [112.88, 33.9], + '湛河区': [113.28, 33.73], + '宝丰县': [113.07, 33.88], + '叶县': [113.35, 33.62], + '鲁山县': [112.9, 33.73], + '郏县': [113.22, 33.97], + '舞钢市': [113.52, 33.3], + '汝州市': [112.83, 34.17], + '安阳市': [114.38, 36.1], + '文峰区': [114.35, 36.08], + '北关区': [114.35, 36.12], + '殷都区': [114.3, 36.12], + '龙安区': [114.32, 36.1], + '安阳县': [114.35, 36.1], + '汤阴县': [114.35, 35.92], + '滑县': [114.52, 35.58], + '内黄县': [114.9, 35.95], + '林州市': [113.82, 36.07], + '鹤壁市': [114.28, 35.75], + '鹤山区': [114.15, 35.95], + '山城区': [114.18, 35.9], + '淇滨区': [114.3, 35.73], + '浚县': [114.55, 35.67], + '淇县': [114.2, 35.6], + '新乡市': [113.9, 35.3], + '红旗区': [113.87, 35.3], + '卫滨区': [113.85, 35.3], + '凤泉区': [113.92, 35.38], + '牧野区': [113.9, 35.32], + '新乡县': [113.8, 35.2], + '获嘉县': [113.65, 35.27], + '原阳县': [113.97, 35.05], + '延津县': [114.2, 35.15], + '封丘县': [114.42, 35.05], + '长垣县': [114.68, 35.2], + '卫辉市': [114.07, 35.4], + '辉县市': [113.8, 35.47], + '焦作市': [113.25, 35.22], + '解放区': [113.22, 35.25], + '中站区': [113.17, 35.23], + '马村区': [113.32, 35.27], + '山阳区': [113.25, 35.22], + '修武县': [113.43, 35.23], + '博爱县': [113.07, 35.17], + '武陟县': [113.38, 35.1], + '温县': [113.08, 34.93], + '济源市': [112.58, 35.07], + '沁阳市': [112.93, 35.08], + '孟州市': [112.78, 34.9], + '濮阳市': [115.03, 35.77], + '华龙区': [115.07, 35.78], + '清丰县': [115.12, 35.9], + '南乐县': [115.2, 36.08], + '范县': [115.5, 35.87], + '台前县': [115.85, 36.0], + '濮阳县': [115.02, 35.7], + '许昌市': [113.85, 34.03], + '魏都区': [113.82, 34.03], + '许昌县': [113.83, 34.0], + '鄢陵县': [114.2, 34.1], + '襄城县': [113.48, 33.85], + '禹州市': [113.47, 34.17], + '长葛市': [113.77, 34.22], + '漯河市': [114.02, 33.58], + '郾城区': [114.0, 33.58], + '召陵区': [114.07, 33.57], + '舞阳县': [113.6, 33.43], + '临颍县': [113.93, 33.82], + '三门峡市': [111.2, 34.78], + '湖滨区': [111.2, 34.78], + '渑池县': [111.75, 34.77], + '陕县': [111.08, 34.7], + '卢氏县': [111.05, 34.05], + '义马市': [111.87, 34.75], + '灵宝市': [110.87, 34.52], + '南阳市': [112.52, 33.0], + '宛城区': [112.55, 33.02], + '卧龙区': [112.53, 32.98], + '南召县': [112.43, 33.5], + '方城县': [113.0, 33.27], + '西峡县': [111.48, 33.28], + '镇平县': [112.23, 33.03], + '内乡县': [111.85, 33.05], + '淅川县': [111.48, 33.13], + '社旗县': [112.93, 33.05], + '唐河县': [112.83, 32.7], + '新野县': [112.35, 32.52], + '桐柏县': [113.4, 32.37], + '邓州市': [112.08, 32.68], + '商丘市': [115.65, 34.45], + '梁园区': [115.63, 34.45], + '睢阳区': [115.63, 34.38], + '民权县': [115.13, 34.65], + '睢县': [115.07, 34.45], + '宁陵县': [115.32, 34.45], + '柘城县': [115.3, 34.07], + '虞城县': [115.85, 34.4], + '夏邑县': [116.13, 34.23], + '永城市': [116.43, 33.92], + '信阳市': [114.07, 32.13], + '浉河区': [114.05, 32.12], + '平桥区': [114.12, 32.1], + '罗山县': [114.53, 32.2], + '光山县': [114.9, 32.02], + '新县': [114.87, 31.63], + '商城县': [115.4, 31.8], + '固始县': [115.68, 32.18], + '潢川县': [115.03, 32.13], + '淮滨县': [115.4, 32.43], + '息县': [114.73, 32.35], + '周口市': [114.65, 33.62], + '扶沟县': [114.38, 34.07], + '西华县': [114.53, 33.8], + '商水县': [114.6, 33.53], + '沈丘县': [115.07, 33.4], + '郸城县': [115.2, 33.65], + '淮阳县': [114.88, 33.73], + '太康县': [114.85, 34.07], + '鹿邑县': [115.48, 33.87], + '项城市': [114.9, 33.45], + '驻马店市': [114.02, 32.98], + '驿城区': [114.05, 32.97], + '西平县': [114.02, 33.38], + '上蔡县': [114.27, 33.27], + '平舆县': [114.63, 32.97], + '正阳县': [114.38, 32.6], + '确山县': [114.02, 32.8], + '泌阳县': [113.32, 32.72], + '汝南县': [114.35, 33.0], + '遂平县': [114.0, 33.15], + '新蔡县': [114.98, 32.75], + '武汉市': [114.3, 30.6], + '江岸区': [114.3, 30.6], + '江汉区': [114.27, 30.6], + '硚口区': [114.27, 30.57], + '汉阳区': [114.27, 30.55], + '武昌区': [114.3, 30.57], + '青山区': [114.38, 30.63], + '洪山区': [114.33, 30.5], + '东西湖区': [114.13, 30.62], + '汉南区': [114.08, 30.32], + '蔡甸区': [114.03, 30.58], + '江夏区': [114.32, 30.35], + '黄陂区': [114.37, 30.87], + '新洲区': [114.8, 30.85], + '黄石市': [115.03, 30.2], + '黄石港区': [115.07, 30.23], + '西塞山区': [115.12, 30.2], + '下陆区': [114.97, 30.18], + '铁山区': [114.9, 30.2], + '阳新县': [115.2, 29.85], + '大冶市': [114.97, 30.1], + '十堰市': [110.78, 32.65], + '茅箭区': [110.82, 32.6], + '张湾区': [110.78, 32.65], + '郧县': [110.82, 32.83], + '郧西县': [110.42, 33.0], + '竹山县': [110.23, 32.23], + '竹溪县': [109.72, 32.32], + '房县': [110.73, 32.07], + '丹江口市': [111.52, 32.55], + '宜昌市': [111.28, 30.7], + '西陵区': [111.27, 30.7], + '伍家岗区': [111.35, 30.65], + '点军区': [111.27, 30.7], + '猇亭区': [111.42, 30.53], + '夷陵区': [111.32, 30.77], + '远安县': [111.63, 31.07], + '兴山县': [110.75, 31.35], + '秭归县': [110.98, 30.83], + '长阳土家族自治县': [111.18, 30.47], + '五峰土家族自治县': [110.67, 30.2], + '宜都市': [111.45, 30.4], + '当阳市': [111.78, 30.82], + '枝江市': [111.77, 30.43], + '襄樊市': [112.15, 32.02], + '襄城区': [112.15, 32.02], + '樊城区': [112.13, 32.03], + '襄阳区': [112.2, 32.08], + '南漳县': [111.83, 31.78], + '谷城县': [111.65, 32.27], + '保康县': [111.25, 31.88], + '老河口市': [111.67, 32.38], + '枣阳市': [112.75, 32.13], + '宜城市': [112.25, 31.72], + '鄂州市': [114.88, 30.4], + '梁子湖区': [114.67, 30.08], + '华容区': [114.73, 30.53], + '鄂城区': [114.88, 30.4], + '荆门市': [112.2, 31.03], + '东宝区': [112.2, 31.05], + '掇刀区': [112.2, 30.98], + '京山县': [113.1, 31.02], + '沙洋县': [112.58, 30.7], + '钟祥市': [112.58, 31.17], + '孝感市': [113.92, 30.93], + '孝南区': [113.92, 30.92], + '孝昌县': [113.97, 31.25], + '大悟县': [114.12, 31.57], + '云梦县': [113.75, 31.02], + '应城市': [113.57, 30.95], + '安陆市': [113.68, 31.27], + '汉川市': [113.83, 30.65], + '荆州市': [112.23, 30.33], + '沙市区': [112.25, 30.32], + '荆州区': [112.18, 30.35], + '公安县': [112.23, 30.07], + '监利县': [112.88, 29.82], + '江陵县': [112.42, 30.03], + '石首市': [112.4, 29.73], + '洪湖市': [113.45, 29.8], + '松滋市': [111.77, 30.18], + '黄冈市': [114.87, 30.45], + '黄州区': [114.88, 30.43], + '团风县': [114.87, 30.63], + '红安县': [114.62, 31.28], + '罗田县': [115.4, 30.78], + '英山县': [115.67, 30.75], + '浠水县': [115.27, 30.45], + '蕲春县': [115.43, 30.23], + '黄梅县': [115.93, 30.08], + '麻城市': [115.03, 31.18], + '武穴市': [115.55, 29.85], + '咸宁市': [114.32, 29.85], + '咸安区': [114.3, 29.87], + '嘉鱼县': [113.9, 29.98], + '通城县': [113.82, 29.25], + '崇阳县': [114.03, 29.55], + '通山县': [114.52, 29.6], + '赤壁市': [113.88, 29.72], + '随州市': [113.37, 31.72], + '曾都区': [113.37, 31.72], + '广水市': [113.82, 31.62], + '恩施土家族苗族自治州': [109.47, 30.3], + '恩施市': [109.47, 30.3], + '利川市': [108.93, 30.3], + '建始县': [109.73, 30.6], + '巴东县': [110.33, 31.05], + '宣恩县': [109.48, 29.98], + '咸丰县': [109.15, 29.68], + '来凤县': [109.4, 29.52], + '鹤峰县': [110.03, 29.9], + '仙桃市': [113.45, 30.37], + '潜江市': [112.88, 30.42], + '天门市': [113.17, 30.67], + '神农架林区': [110.67, 31.75], + '长沙市': [112.93, 28.23], + '芙蓉区': [113.03, 28.18], + '天心区': [112.98, 28.12], + '岳麓区': [112.93, 28.23], + '开福区': [112.98, 28.25], + '雨花区': [113.03, 28.13], + '长沙县': [113.07, 28.25], + '望城县': [112.82, 28.37], + '宁乡县': [112.55, 28.25], + '浏阳市': [113.63, 28.15], + '株洲市': [113.13, 27.83], + '荷塘区': [113.17, 27.87], + '芦淞区': [113.15, 27.83], + '石峰区': [113.1, 27.87], + '天元区': [113.12, 27.83], + '株洲县': [113.13, 27.72], + '攸县': [113.33, 27.0], + '茶陵县': [113.53, 26.8], + '炎陵县': [113.77, 26.48], + '醴陵市': [113.48, 27.67], + '湘潭市': [112.93, 27.83], + '雨湖区': [112.9, 27.87], + '岳塘区': [112.95, 27.87], + '湘潭县': [112.95, 27.78], + '湘乡市': [112.53, 27.73], + '韶山市': [112.52, 27.93], + '衡阳市': [112.57, 26.9], + '珠晖区': [112.62, 26.9], + '雁峰区': [112.6, 26.88], + '石鼓区': [112.6, 26.9], + '蒸湘区': [112.6, 26.9], + '南岳区': [112.73, 27.25], + '衡阳县': [112.37, 26.97], + '衡南县': [112.67, 26.73], + '衡山县': [112.87, 27.23], + '衡东县': [112.95, 27.08], + '祁东县': [112.12, 26.78], + '耒阳市': [112.85, 26.42], + '常宁市': [112.38, 26.42], + '邵阳市': [111.47, 27.25], + '双清区': [111.47, 27.23], + '大祥区': [111.45, 27.23], + '北塔区': [111.45, 27.25], + '邵东县': [111.75, 27.25], + '新邵县': [111.45, 27.32], + '邵阳县': [111.27, 27.0], + '隆回县': [111.03, 27.12], + '洞口县': [110.57, 27.05], + '绥宁县': [110.15, 26.58], + '新宁县': [110.85, 26.43], + '城步苗族自治县': [110.32, 26.37], + '武冈市': [110.63, 26.73], + '岳阳市': [113.12, 29.37], + '岳阳楼区': [113.1, 29.37], + '云溪区': [113.3, 29.47], + '君山区': [113.0, 29.43], + '岳阳县': [113.12, 29.15], + '华容县': [112.57, 29.52], + '湘阴县': [112.88, 28.68], + '平江县': [113.58, 28.72], + '汨罗市': [113.08, 28.8], + '临湘市': [113.47, 29.48], + '常德市': [111.68, 29.05], + '武陵区': [111.68, 29.03], + '鼎城区': [111.68, 29.02], + '安乡县': [112.17, 29.42], + '汉寿县': [111.97, 28.9], + '澧县': [111.75, 29.63], + '临澧县': [111.65, 29.45], + '桃源县': [111.48, 28.9], + '石门县': [111.38, 29.58], + '津市市': [111.88, 29.62], + '张家界市': [110.47, 29.13], + '永定区': [110.48, 29.13], + '武陵源区': [110.53, 29.35], + '慈利县': [111.12, 29.42], + '桑植县': [110.15, 29.4], + '益阳市': [112.32, 28.6], + '资阳区': [112.32, 28.6], + '赫山区': [112.37, 28.6], + '南县': [112.4, 29.38], + '桃江县': [112.12, 28.53], + '安化县': [111.22, 28.38], + '沅江市': [112.38, 28.85], + '郴州市': [113.02, 25.78], + '北湖区': [113.02, 25.8], + '苏仙区': [113.03, 25.8], + '桂阳县': [112.73, 25.73], + '宜章县': [112.95, 25.4], + '永兴县': [113.1, 26.13], + '嘉禾县': [112.37, 25.58], + '临武县': [112.55, 25.28], + '汝城县': [113.68, 25.55], + '桂东县': [113.93, 26.08], + '安仁县': [113.27, 26.7], + '资兴市': [113.23, 25.98], + '永州市': [111.62, 26.43], + '冷水滩区': [111.6, 26.43], + '祁阳县': [111.85, 26.58], + '东安县': [111.28, 26.4], + '双牌县': [111.65, 25.97], + '道县': [111.58, 25.53], + '江永县': [111.33, 25.28], + '宁远县': [111.93, 25.6], + '蓝山县': [112.18, 25.37], + '新田县': [112.22, 25.92], + '江华瑶族自治县': [111.58, 25.18], + '怀化市': [110.0, 27.57], + '鹤城区': [109.95, 27.55], + '中方县': [109.93, 27.4], + '沅陵县': [110.38, 28.47], + '辰溪县': [110.18, 28.0], + '溆浦县': [110.58, 27.92], + '会同县': [109.72, 26.87], + '麻阳苗族自治县': [109.8, 27.87], + '新晃侗族自治县': [109.17, 27.37], + '芷江侗族自治县': [109.68, 27.45], + '靖州苗族侗族自治县': [109.68, 26.58], + '通道侗族自治县': [109.78, 26.17], + '洪江市': [109.82, 27.2], + '娄底市': [112.0, 27.73], + '娄星区': [112.0, 27.73], + '双峰县': [112.2, 27.45], + '新化县': [111.3, 27.75], + '冷水江市': [111.43, 27.68], + '涟源市': [111.67, 27.7], + '湘西土家族苗族自治州': [109.73, 28.32], + '吉首市': [109.73, 28.32], + '泸溪县': [110.22, 28.22], + '凤凰县': [109.6, 27.95], + '花垣县': [109.48, 28.58], + '保靖县': [109.65, 28.72], + '古丈县': [109.95, 28.62], + '永顺县': [109.85, 29.0], + '龙山县': [109.43, 29.47], + '广州市': [113.27, 23.13], + '荔湾区': [113.23, 23.13], + '越秀区': [113.27, 23.13], + '海珠区': [113.25, 23.1], + '天河区': [113.35, 23.12], + '黄埔区': [113.45, 23.1], + '番禺区': [113.35, 22.95], + '花都区': [113.22, 23.4], + '增城市': [113.83, 23.3], + '从化市': [113.58, 23.55], + '韶关市': [113.6, 24.82], + '武江区': [113.57, 24.8], + '浈江区': [113.6, 24.8], + '曲江区': [113.6, 24.68], + '始兴县': [114.07, 24.95], + '仁化县': [113.75, 25.08], + '翁源县': [114.13, 24.35], + '乳源瑶族自治县': [113.27, 24.78], + '新丰县': [114.2, 24.07], + '乐昌市': [113.35, 25.13], + '南雄市': [114.3, 25.12], + '深圳市': [114.05, 22.55], + '罗湖区': [114.12, 22.55], + '福田区': [114.05, 22.53], + '南山区': [113.92, 22.52], + '宝安区': [113.9, 22.57], + '龙岗区': [114.27, 22.73], + '盐田区': [114.22, 22.55], + '珠海市': [113.57, 22.27], + '香洲区': [113.55, 22.27], + '斗门区': [113.28, 22.22], + '金湾区': [113.4, 22.07], + '汕头市': [116.68, 23.35], + '龙湖区': [116.72, 23.37], + '金平区': [116.7, 23.37], + '潮阳区': [116.6, 23.27], + '潮南区': [116.43, 23.25], + '澄海区': [116.77, 23.48], + '南澳县': [117.02, 23.42], + '佛山市': [113.12, 23.02], + '南海区': [113.15, 23.03], + '顺德区': [113.3, 22.8], + '三水区': [112.87, 23.17], + '高明区': [112.88, 22.9], + '江门市': [113.08, 22.58], + '新会区': [113.03, 22.47], + '台山市': [112.78, 22.25], + '开平市': [112.67, 22.38], + '鹤山市': [112.97, 22.77], + '恩平市': [112.3, 22.18], + '湛江市': [110.35, 21.27], + '赤坎区': [110.37, 21.27], + '霞山区': [110.4, 21.2], + '坡头区': [110.47, 21.23], + '麻章区': [110.32, 21.27], + '遂溪县': [110.25, 21.38], + '徐闻县': [110.17, 20.33], + '廉江市': [110.27, 21.62], + '雷州市': [110.08, 20.92], + '吴川市': [110.77, 21.43], + '茂名市': [110.92, 21.67], + '茂南区': [110.92, 21.63], + '茂港区': [111.02, 21.47], + '电白县': [111.0, 21.5], + '高州市': [110.85, 21.92], + '化州市': [110.63, 21.67], + '信宜市': [110.95, 22.35], + '肇庆市': [112.47, 23.05], + '端州区': [112.48, 23.05], + '鼎湖区': [112.57, 23.17], + '广宁县': [112.43, 23.63], + '怀集县': [112.18, 23.92], + '封开县': [111.5, 23.43], + '德庆县': [111.77, 23.15], + '高要市': [112.45, 23.03], + '四会市': [112.68, 23.33], + '惠州市': [114.42, 23.12], + '惠城区': [114.4, 23.08], + '惠阳区': [114.47, 22.8], + '博罗县': [114.28, 23.18], + '惠东县': [114.72, 22.98], + '龙门县': [114.25, 23.73], + '梅州市': [116.12, 24.28], + '梅江区': [116.12, 24.32], + '梅县': [116.05, 24.28], + '大埔县': [116.7, 24.35], + '丰顺县': [116.18, 23.77], + '五华县': [115.77, 23.93], + '平远县': [115.88, 24.57], + '蕉岭县': [116.17, 24.67], + '兴宁市': [115.73, 24.15], + '汕尾市': [115.37, 22.78], + '海丰县': [115.33, 22.97], + '陆河县': [115.65, 23.3], + '陆丰市': [115.65, 22.95], + '河源市': [114.7, 23.73], + '源城区': [114.7, 23.73], + '紫金县': [115.18, 23.63], + '龙川县': [115.25, 24.1], + '连平县': [114.48, 24.37], + '和平县': [114.93, 24.45], + '东源县': [114.77, 23.82], + '阳江市': [111.98, 21.87], + '江城区': [111.95, 21.87], + '阳西县': [111.62, 21.75], + '阳东县': [112.02, 21.88], + '阳春市': [111.78, 22.18], + '清远市': [113.03, 23.7], + '清城区': [113.02, 23.7], + '佛冈县': [113.53, 23.88], + '阳山县': [112.63, 24.48], + '连山壮族瑶族自治县': [112.08, 24.57], + '连南瑶族自治县': [112.28, 24.72], + '清新县': [112.98, 23.73], + '英德市': [113.4, 24.18], + '连州市': [112.38, 24.78], + '东莞市': [113.75, 23.05], + '中山市': [113.38, 22.52], + '潮州市': [116.62, 23.67], + '湘桥区': [116.63, 23.68], + '潮安县': [116.68, 23.45], + '饶平县': [117.0, 23.67], + '揭阳市': [116.37, 23.55], + '揭东县': [116.42, 23.57], + '揭西县': [115.83, 23.43], + '惠来县': [116.28, 23.03], + '普宁市': [116.18, 23.3], + '云浮市': [112.03, 22.92], + '云城区': [112.03, 22.93], + '新兴县': [112.23, 22.7], + '郁南县': [111.53, 23.23], + '云安县': [112.0, 23.08], + '罗定市': [111.57, 22.77], + '南宁市': [108.37, 22.82], + '兴宁区': [108.38, 22.87], + '江南区': [108.28, 22.78], + '西乡塘区': [108.3, 22.83], + '良庆区': [108.32, 22.77], + '邕宁区': [108.48, 22.75], + '武鸣县': [108.27, 23.17], + '隆安县': [107.68, 23.18], + '马山县': [108.17, 23.72], + '上林县': [108.6, 23.43], + '宾阳县': [108.8, 23.22], + '横县': [109.27, 22.68], + '柳州市': [109.42, 24.33], + '柳南区': [109.38, 24.35], + '柳江县': [109.33, 24.27], + '柳城县': [109.23, 24.65], + '鹿寨县': [109.73, 24.48], + '融安县': [109.4, 25.23], + '融水苗族自治县': [109.25, 25.07], + '三江侗族自治县': [109.6, 25.78], + '桂林市': [110.28, 25.28], + '阳朔县': [110.48, 24.78], + '临桂县': [110.2, 25.23], + '灵川县': [110.32, 25.42], + '全州县': [111.07, 25.93], + '兴安县': [110.67, 25.62], + '永福县': [109.98, 24.98], + '灌阳县': [111.15, 25.48], + '龙胜各族自治县': [110.0, 25.8], + '资源县': [110.63, 26.03], + '平乐县': [110.63, 24.63], + '恭城瑶族自治县': [110.83, 24.83], + '梧州市': [111.27, 23.48], + '苍梧县': [111.23, 23.42], + '藤县': [110.92, 23.38], + '蒙山县': [110.52, 24.2], + '岑溪市': [110.98, 22.92], + '北海市': [109.12, 21.48], + '铁山港区': [109.43, 21.53], + '合浦县': [109.2, 21.67], + '防城港市': [108.35, 21.7], + '港口区': [108.37, 21.65], + '防城区': [108.35, 21.77], + '上思县': [107.98, 22.15], + '东兴市': [107.97, 21.53], + '钦州市': [108.62, 21.95], + '钦北区': [108.63, 21.98], + '灵山县': [109.3, 22.43], + '浦北县': [109.55, 22.27], + '贵港市': [109.6, 23.1], + '覃塘区': [109.42, 23.13], + '平南县': [110.38, 23.55], + '桂平市': [110.08, 23.4], + '玉林市': [110.17, 22.63], + '容县': [110.55, 22.87], + '陆川县': [110.27, 22.33], + '博白县': [109.97, 22.28], + '兴业县': [109.87, 22.75], + '北流市': [110.35, 22.72], + '百色市': [106.62, 23.9], + '田阳县': [106.92, 23.73], + '田东县': [107.12, 23.6], + '平果县': [107.58, 23.32], + '德保县': [106.62, 23.33], + '靖西县': [106.42, 23.13], + '那坡县': [105.83, 23.42], + '凌云县': [106.57, 24.35], + '乐业县': [106.55, 24.78], + '田林县': [106.23, 24.3], + '西林县': [105.1, 24.5], + '隆林各族自治县': [105.33, 24.77], + '贺州市': [111.55, 24.42], + '昭平县': [110.8, 24.17], + '钟山县': [111.3, 24.53], + '富川瑶族自治县': [111.27, 24.83], + '河池市': [108.07, 24.7], + '金城江区': [108.05, 24.7], + '南丹县': [107.53, 24.98], + '天峨县': [107.17, 25.0], + '凤山县': [107.05, 24.55], + '东兰县': [107.37, 24.52], + '罗城仫佬族自治县': [108.9, 24.78], + '环江毛南族自治县': [108.25, 24.83], + '巴马瑶族自治县': [107.25, 24.15], + '都安瑶族自治县': [108.1, 23.93], + '大化瑶族自治县': [107.98, 23.73], + '宜州市': [108.67, 24.5], + '来宾市': [109.23, 23.73], + '忻城县': [108.67, 24.07], + '象州县': [109.68, 23.97], + '武宣县': [109.67, 23.6], + '金秀瑶族自治县': [110.18, 24.13], + '合山市': [108.87, 23.82], + '崇左市': [107.37, 22.4], + '扶绥县': [107.9, 22.63], + '宁明县': [107.07, 22.13], + '龙州县': [106.85, 22.35], + '大新县': [107.2, 22.83], + '天等县': [107.13, 23.08], + '凭祥市': [106.75, 22.12], + '海口市': [110.32, 20.03], + '秀英区': [110.28, 20.02], + '龙华区': [110.3, 20.03], + '琼山区': [110.35, 20.0], + '美兰区': [110.37, 20.03], + '三亚市': [109.5, 18.25], + '五指山市': [109.52, 18.78], + '琼海市': [110.47, 19.25], + '儋州市': [109.57, 19.52], + '文昌市': [110.8, 19.55], + '万宁市': [110.4, 18.8], + '东方市': [108.63, 19.1], + '定安县': [110.32, 19.7], + '屯昌县': [110.1, 19.37], + '澄迈县': [110.0, 19.73], + '临高县': [109.68, 19.92], + '白沙黎族自治县': [109.45, 19.23], + '昌江黎族自治县': [109.05, 19.25], + '乐东黎族自治县': [109.17, 18.75], + '陵水黎族自治县': [110.03, 18.5], + '保亭黎族苗族自治县': [109.7, 18.63], + '琼中黎族苗族自治县': [109.83, 19.03], + '重庆市': [106.55, 29.57], + '万州区': [108.4, 30.82], + '涪陵区': [107.4, 29.72], + '渝中区': [106.57, 29.55], + '大渡口区': [106.48, 29.48], + '江北区': [106.57, 29.6], + '沙坪坝区': [106.45, 29.53], + '九龙坡区': [106.5, 29.5], + '南岸区': [106.57, 29.52], + '北碚区': [106.4, 29.8], + '万盛区': [106.92, 28.97], + '双桥区': [105.78, 29.48], + '渝北区': [106.63, 29.72], + '巴南区': [106.52, 29.38], + '黔江区': [108.77, 29.53], + '长寿区': [107.08, 29.87], + '綦江县': [106.65, 29.03], + '潼南县': [105.83, 30.18], + '铜梁县': [106.05, 29.85], + '大足县': [105.72, 29.7], + '荣昌县': [105.58, 29.4], + '璧山县': [106.22, 29.6], + '梁平县': [107.8, 30.68], + '城口县': [108.67, 31.95], + '丰都县': [107.73, 29.87], + '垫江县': [107.35, 30.33], + '武隆县': [107.75, 29.33], + '忠县': [108.02, 30.3], + '开县': [108.42, 31.18], + '云阳县': [108.67, 30.95], + '奉节县': [109.47, 31.02], + '巫山县': [109.88, 31.08], + '巫溪县': [109.63, 31.4], + '石柱土家族自治县': [108.12, 30.0], + '秀山土家族苗族自治县': [108.98, 28.45], + '酉阳土家族苗族自治县': [108.77, 28.85], + '彭水苗族土家族自治县': [108.17, 29.3], + '成都市': [104.07, 30.67], + '锦江区': [104.08, 30.67], + '青羊区': [104.05, 30.68], + '金牛区': [104.05, 30.7], + '武侯区': [104.05, 30.65], + '成华区': [104.1, 30.67], + '龙泉驿区': [104.27, 30.57], + '青白江区': [104.23, 30.88], + '新都区': [104.15, 30.83], + '温江区': [103.83, 30.7], + '金堂县': [104.43, 30.85], + '双流县': [103.92, 30.58], + '郫县': [103.88, 30.82], + '大邑县': [103.52, 30.58], + '蒲江县': [103.5, 30.2], + '新津县': [103.82, 30.42], + '都江堰市': [103.62, 31.0], + '彭州市': [103.93, 30.98], + '邛崃市': [103.47, 30.42], + '崇州市': [103.67, 30.63], + '自贡市': [104.78, 29.35], + '自流井区': [104.77, 29.35], + '贡井区': [104.72, 29.35], + '大安区': [104.77, 29.37], + '沿滩区': [104.87, 29.27], + '荣县': [104.42, 29.47], + '富顺县': [104.98, 29.18], + '攀枝花市': [101.72, 26.58], + '东区': [101.7, 26.55], + '西区': [101.6, 26.6], + '仁和区': [101.73, 26.5], + '米易县': [102.12, 26.88], + '盐边县': [101.85, 26.7], + '泸州市': [105.43, 28.87], + '江阳区': [105.45, 28.88], + '纳溪区': [105.37, 28.77], + '龙马潭区': [105.43, 28.9], + '泸县': [105.38, 29.15], + '合江县': [105.83, 28.82], + '叙永县': [105.43, 28.17], + '古蔺县': [105.82, 28.05], + '德阳市': [104.38, 31.13], + '旌阳区': [104.38, 31.13], + '中江县': [104.68, 31.03], + '罗江县': [104.5, 31.32], + '广汉市': [104.28, 30.98], + '什邡市': [104.17, 31.13], + '绵竹市': [104.2, 31.35], + '绵阳市': [104.73, 31.47], + '涪城区': [104.73, 31.47], + '游仙区': [104.75, 31.47], + '三台县': [105.08, 31.1], + '盐亭县': [105.38, 31.22], + '安县': [104.57, 31.53], + '梓潼县': [105.17, 31.63], + '北川羌族自治县': [104.45, 31.82], + '平武县': [104.53, 32.42], + '江油市': [104.75, 31.78], + '广元市': [105.83, 32.43], + '元坝区': [105.97, 32.32], + '朝天区': [105.88, 32.65], + '旺苍县': [106.28, 32.23], + '青川县': [105.23, 32.58], + '剑阁县': [105.52, 32.28], + '苍溪县': [105.93, 31.73], + '遂宁市': [105.57, 30.52], + '船山区': [105.57, 30.52], + '安居区': [105.45, 30.35], + '蓬溪县': [105.72, 30.78], + '射洪县': [105.38, 30.87], + '大英县': [105.25, 30.58], + '内江市': [105.05, 29.58], + '东兴区': [105.07, 29.6], + '威远县': [104.67, 29.53], + '资中县': [104.85, 29.78], + '隆??县': [105.28, 29.35], + '乐山市': [103.77, 29.57], + '沙湾区': [103.55, 29.42], + '五通桥区': [103.82, 29.4], + '金口河区': [103.08, 29.25], + '犍为县': [103.95, 29.22], + '井研县': [104.07, 29.65], + '夹江县': [103.57, 29.73], + '沐川县': [103.9, 28.97], + '峨边彝族自治县': [103.27, 29.23], + '马边彝族自治县': [103.55, 28.83], + '峨眉山市': [103.48, 29.6], + '南充市': [106.08, 30.78], + '顺庆区': [106.08, 30.78], + '高坪区': [106.1, 30.77], + '嘉陵区': [106.05, 30.77], + '南部县': [106.07, 31.35], + '营山县': [106.57, 31.08], + '蓬安县': [106.42, 31.03], + '仪陇县': [106.28, 31.27], + '西充县': [105.88, 31.0], + '阆中市': [106.0, 31.55], + '眉山市': [103.83, 30.05], + '东坡区': [103.83, 30.05], + '仁寿县': [104.15, 30.0], + '彭山县': [103.87, 30.2], + '洪雅县': [103.37, 29.92], + '丹棱县': [103.52, 30.02], + '青神县': [103.85, 29.83], + '宜宾市': [104.62, 28.77], + '翠屏区': [104.62, 28.77], + '宜宾县': [104.55, 28.7], + '南溪县': [104.98, 28.85], + '江安县': [105.07, 28.73], + '长宁县': [104.92, 28.58], + '高县': [104.52, 28.43], + '珙县': [104.72, 28.45], + '筠连县': [104.52, 28.17], + '兴文县': [105.23, 28.3], + '屏山县': [104.33, 28.83], + '广安市': [106.63, 30.47], + '岳池县': [106.43, 30.55], + '武胜县': [106.28, 30.35], + '邻水县': [106.93, 30.33], + '华蓥市': [106.77, 30.38], + '达州市': [107.5, 31.22], + '通川区': [107.48, 31.22], + '达县': [107.5, 31.2], + '宣汉县': [107.72, 31.35], + '开江县': [107.87, 31.08], + '大竹县': [107.2, 30.73], + '渠县': [106.97, 30.83], + '万源市': [108.03, 32.07], + '雅安市': [103.0, 29.98], + '雨城区': [103.0, 29.98], + '名山县': [103.12, 30.08], + '荥经县': [102.85, 29.8], + '汉源县': [102.65, 29.35], + '石棉县': [102.37, 29.23], + '天全县': [102.75, 30.07], + '芦山县': [102.92, 30.15], + '宝兴县': [102.82, 30.37], + '巴中市': [106.77, 31.85], + '巴州区': [106.77, 31.85], + '通江县': [107.23, 31.92], + '南江县': [106.83, 32.35], + '平昌县': [107.1, 31.57], + '资阳市': [104.65, 30.12], + '雁江区': [104.65, 30.12], + '安岳县': [105.33, 30.1], + '乐至县': [105.02, 30.28], + '简阳市': [104.55, 30.4], + '阿坝藏族羌族自治州': [102.22, 31.9], + '汶川县': [103.58, 31.48], + '理县': [103.17, 31.43], + '茂县': [103.85, 31.68], + '松潘县': [103.6, 32.63], + '九寨沟县': [104.23, 33.27], + '金川县': [102.07, 31.48], + '小金县': [102.37, 31.0], + '黑水县': [102.98, 32.07], + '马尔康县': [102.22, 31.9], + '壤塘县': [100.98, 32.27], + '阿坝县': [101.7, 32.9], + '若尔盖县': [102.95, 33.58], + '红原县': [102.55, 32.8], + '甘孜藏族自治州': [101.97, 30.05], + '康定县': [101.97, 30.05], + '泸定县': [102.23, 29.92], + '丹巴县': [101.88, 30.88], + '九龙县': [101.5, 29.0], + '雅江县': [101.02, 30.03], + '道孚县': [101.12, 30.98], + '炉霍县': [100.68, 31.4], + '甘孜县': [99.98, 31.62], + '新龙县': [100.32, 30.95], + '德格县': [98.58, 31.82], + '白玉县': [98.83, 31.22], + '石渠县': [98.1, 32.98], + '色达县': [100.33, 32.27], + '理塘县': [100.27, 30.0], + '巴塘县': [99.1, 30.0], + '乡城县': [99.8, 28.93], + '稻城县': [100.3, 29.03], + '得荣县': [99.28, 28.72], + '凉山彝族自治州': [102.27, 27.9], + '西昌市': [102.27, 27.9], + '木里藏族自治县': [101.28, 27.93], + '盐源县': [101.5, 27.43], + '德昌县': [102.18, 27.4], + '会理县': [102.25, 26.67], + '会东县': [102.58, 26.63], + '宁南县': [102.77, 27.07], + '普格县': [102.53, 27.38], + '布拖县': [102.82, 27.72], + '金阳县': [103.25, 27.7], + '昭觉县': [102.85, 28.02], + '喜德县': [102.42, 28.32], + '冕宁县': [102.17, 28.55], + '越西县': [102.52, 28.65], + '甘洛县': [102.77, 28.97], + '美姑县': [103.13, 28.33], + '雷波县': [103.57, 28.27], + '贵阳市': [106.63, 26.65], + '南明区': [106.72, 26.57], + '云岩区': [106.72, 26.62], + '乌当区': [106.75, 26.63], + '白云区': [106.65, 26.68], + '小河区': [106.7, 26.53], + '开阳县': [106.97, 27.07], + '息烽县': [106.73, 27.1], + '修文县': [106.58, 26.83], + '清镇市': [106.47, 26.55], + '六盘水市': [104.83, 26.6], + '钟山区': [104.83, 26.6], + '六枝特区': [105.48, 26.22], + '水城县': [104.95, 26.55], + '盘县': [104.47, 25.72], + '遵义市': [106.92, 27.73], + '红花岗区': [106.92, 27.65], + '汇川区': [106.92, 27.73], + '遵义县': [106.83, 27.53], + '桐梓县': [106.82, 28.13], + '绥阳县': [107.18, 27.95], + '正安县': [107.43, 28.55], + '道真仡佬族苗族自治县': [107.6, 28.88], + '务川仡佬族苗族自治县': [107.88, 28.53], + '凤冈县': [107.72, 27.97], + '湄潭县': [107.48, 27.77], + '余庆县': [107.88, 27.22], + '习水县': [106.22, 28.32], + '赤水市': [105.7, 28.58], + '仁怀市': [106.42, 27.82], + '安顺市': [105.95, 26.25], + '西秀区': [105.92, 26.25], + '平坝县': [106.25, 26.42], + '普定县': [105.75, 26.32], + '镇宁布依族苗族自治县': [105.77, 26.07], + '关岭布依族苗族自治县': [105.62, 25.95], + '紫云苗族布依族自治县': [106.08, 25.75], + '铜仁地区': [109.18, 27.72], + '铜仁市': [109.18, 27.72], + '江口县': [108.85, 27.7], + '玉屏侗族自治县': [108.92, 27.23], + '石阡县': [108.23, 27.52], + '思南县': [108.25, 27.93], + '印江土家族苗族自治县': [108.4, 28.0], + '德江县': [108.12, 28.27], + '沿河土家族自治县': [108.5, 28.57], + '松桃苗族自治县': [109.2, 28.17], + '万山特区': [109.2, 27.52], + '兴义市': [104.9, 25.08], + '兴仁县': [105.18, 25.43], + '普安县': [104.95, 25.78], + '晴隆县': [105.22, 25.83], + '贞丰县': [105.65, 25.38], + '望谟县': [106.1, 25.17], + '册亨县': [105.82, 24.98], + '安龙县': [105.47, 25.12], + '毕节地区': [105.28, 27.3], + '毕节市': [105.28, 27.3], + '大方县': [105.6, 27.15], + '黔西县': [106.03, 27.03], + '金沙县': [106.22, 27.47], + '织金县': [105.77, 26.67], + '纳雍县': [105.38, 26.78], + '赫章县': [104.72, 27.13], + '黔东南苗族侗族自治州': [107.97, 26.58], + '凯里市': [107.97, 26.58], + '黄平县': [107.9, 26.9], + '施秉县': [108.12, 27.03], + '三穗县': [108.68, 26.97], + '镇远县': [108.42, 27.05], + '岑巩县': [108.82, 27.18], + '天柱县': [109.2, 26.92], + '锦屏县': [109.2, 26.68], + '剑河县': [108.45, 26.73], + '台江县': [108.32, 26.67], + '黎平县': [109.13, 26.23], + '榕江县': [108.52, 25.93], + '从江县': [108.9, 25.75], + '雷山县': [108.07, 26.38], + '麻江县': [107.58, 26.5], + '丹寨县': [107.8, 26.2], + '黔南布依族苗族自治州': [107.52, 26.27], + '都匀市': [107.52, 26.27], + '福泉市': [107.5, 26.7], + '荔波县': [107.88, 25.42], + '贵定县': [107.23, 26.58], + '瓮安县': [107.47, 27.07], + '独山县': [107.53, 25.83], + '平塘县': [107.32, 25.83], + '罗甸县': [106.75, 25.43], + '长顺县': [106.45, 26.03], + '龙里县': [106.97, 26.45], + '惠水县': [106.65, 26.13], + '三都水族自治县': [107.87, 25.98], + '昆明市': [102.72, 25.05], + '五华区': [102.7, 25.05], + '盘龙区': [102.72, 25.03], + '官渡区': [102.75, 25.02], + '西山区': [102.67, 25.03], + '东川区': [103.18, 26.08], + '呈贡县': [102.8, 24.88], + '晋宁县': [102.6, 24.67], + '富民县': [102.5, 25.22], + '宜良县': [103.15, 24.92], + '石林彝族自治县': [103.27, 24.77], + '嵩明县': [103.03, 25.35], + '禄劝彝族苗族自治县': [102.47, 25.55], + '寻甸回族彝族自治县': [103.25, 25.57], + '安宁市': [102.48, 24.92], + '曲靖市': [103.8, 25.5], + '麒麟区': [103.8, 25.5], + '马龙县': [103.58, 25.43], + '陆良县': [103.67, 25.03], + '师宗县': [103.98, 24.83], + '罗平县': [104.3, 24.88], + '富源县': [104.25, 25.67], + '会泽县': [103.3, 26.42], + '沾益县': [103.82, 25.62], + '宣威市': [104.1, 26.22], + '玉溪市': [102.55, 24.35], + '江川县': [102.75, 24.28], + '澄江县': [102.92, 24.67], + '通海县': [102.75, 24.12], + '华宁县': [102.93, 24.2], + '易门县': [102.17, 24.67], + '峨山彝族自治县': [102.4, 24.18], + '新平彝族傣族自治县': [101.98, 24.07], + '保山市': [99.17, 25.12], + '隆阳区': [99.17, 25.12], + '施甸县': [99.18, 24.73], + '腾冲县': [98.5, 25.03], + '龙陵县': [98.68, 24.58], + '昌宁县': [99.6, 24.83], + '昭通市': [103.72, 27.33], + '昭阳区': [103.72, 27.33], + '鲁甸县': [103.55, 27.2], + '巧家县': [102.92, 26.92], + '盐津县': [104.23, 28.12], + '大关县': [103.88, 27.75], + '永善县': [103.63, 28.23], + '绥江县': [103.95, 28.6], + '镇雄县': [104.87, 27.45], + '彝良县': [104.05, 27.63], + '威信县': [105.05, 27.85], + '水富县': [104.4, 28.63], + '丽江市': [100.23, 26.88], + '古城区': [100.23, 26.88], + '玉龙纳西族自治县': [100.23, 26.82], + '永胜县': [100.75, 26.68], + '华坪县': [101.27, 26.63], + '宁蒗彝族自治县': [100.85, 27.28], + '墨江哈尼族自治县': [101.68, 23.43], + '景东彝族自治县': [100.83, 24.45], + '景谷傣族彝族自治县': [100.7, 23.5], + '江城哈尼族彝族自治县': [101.85, 22.58], + '澜沧拉祜族自治县': [99.93, 22.55], + '西盟佤族自治县': [99.62, 22.63], + '临沧市': [100.08, 23.88], + '临翔区': [100.08, 23.88], + '凤庆县': [99.92, 24.6], + '云县': [100.13, 24.45], + '永德县': [99.25, 24.03], + '镇康县': [98.83, 23.78], + '耿马傣族佤族自治县': [99.4, 23.55], + '沧源佤族自治县': [99.25, 23.15], + '楚雄彝族自治州': [101.55, 25.03], + '楚雄市': [101.55, 25.03], + '双柏县': [101.63, 24.7], + '牟定县': [101.53, 25.32], + '南华县': [101.27, 25.2], + '姚安县': [101.23, 25.5], + '大姚县': [101.32, 25.73], + '永仁县': [101.67, 26.07], + '元谋县': [101.88, 25.7], + '武定县': [102.4, 25.53], + '禄丰县': [102.08, 25.15], + '红河哈尼族彝族自治州': [103.4, 23.37], + '个旧市': [103.15, 23.37], + '开远市': [103.27, 23.72], + '蒙自县': [103.4, 23.37], + '屏边苗族自治县': [103.68, 22.98], + '建水县': [102.83, 23.62], + '石屏县': [102.5, 23.72], + '弥勒县': [103.43, 24.4], + '泸西县': [103.77, 24.53], + '元阳县': [102.83, 23.23], + '红河县': [102.42, 23.37], + '绿春县': [102.4, 23.0], + '河口瑶族自治县': [103.97, 22.52], + '文山壮族苗族自治州': [104.25, 23.37], + '文山县': [104.25, 23.37], + '砚山县': [104.33, 23.62], + '西畴县': [104.67, 23.45], + '麻栗坡县': [104.7, 23.12], + '马关县': [104.4, 23.02], + '丘北县': [104.18, 24.05], + '广南县': [105.07, 24.05], + '富宁县': [105.62, 23.63], + '西双版纳傣族自治州': [100.8, 22.02], + '景洪市': [100.8, 22.02], + '勐海县': [100.45, 21.97], + '勐腊县': [101.57, 21.48], + '大理白族自治州': [100.23, 25.6], + '大理市': [100.23, 25.6], + '漾濞彝族自治县': [99.95, 25.67], + '祥云县': [100.55, 25.48], + '宾川县': [100.58, 25.83], + '弥渡县': [100.48, 25.35], + '南涧彝族自治县': [100.52, 25.05], + '巍山彝族回族自治县': [100.3, 25.23], + '永平县': [99.53, 25.47], + '云龙县': [99.37, 25.88], + '洱源县': [99.95, 26.12], + '剑川县': [99.9, 26.53], + '鹤庆县': [100.18, 26.57], + '德宏傣族景颇族自治州': [98.58, 24.43], + '瑞丽市': [97.85, 24.02], + '潞西市': [98.58, 24.43], + '梁河县': [98.3, 24.82], + '盈江县': [97.93, 24.72], + '陇川县': [97.8, 24.2], + '怒江傈僳族自治州': [98.85, 25.85], + '泸水县': [98.85, 25.85], + '福贡县': [98.87, 26.9], + '贡山独龙族怒族自治县': [98.67, 27.73], + '兰坪白族普米族自治县': [99.42, 26.45], + '迪庆藏族自治州': [99.7, 27.83], + '香格里拉县': [99.7, 27.83], + '德钦县': [98.92, 28.48], + '维西傈僳族自治县': [99.28, 27.18], + '拉萨市': [91.13, 29.65], + '林周县': [91.25, 29.9], + '当雄县': [91.1, 30.48], + '尼木县': [90.15, 29.45], + '曲水县': [90.73, 29.37], + '堆龙德庆县': [91.0, 29.65], + '达孜县': [91.35, 29.68], + '墨竹工卡县': [91.73, 29.83], + '昌都地区': [97.18, 31.13], + '昌都县': [97.18, 31.13], + '江达县': [98.22, 31.5], + '贡觉县': [98.27, 30.87], + '类乌齐县': [96.6, 31.22], + '丁青县': [95.6, 31.42], + '察雅县': [97.57, 30.65], + '八宿县': [96.92, 30.05], + '左贡县': [97.85, 29.67], + '芒康县': [98.6, 29.68], + '洛隆县': [95.83, 30.75], + '边坝县': [94.7, 30.93], + '山南地区': [91.77, 29.23], + '乃东县': [91.77, 29.23], + '扎囊县': [91.33, 29.25], + '贡嘎县': [90.98, 29.3], + '桑日县': [92.02, 29.27], + '琼结县': [91.68, 29.03], + '曲松县': [92.2, 29.07], + '措美县': [91.43, 28.43], + '洛扎县': [90.87, 28.38], + '加查县': [92.58, 29.15], + '隆子县': [92.47, 28.42], + '错那县': [91.95, 28.0], + '浪卡子县': [90.4, 28.97], + '日喀则地区': [88.88, 29.27], + '日喀则市': [88.88, 29.27], + '南木林县': [89.1, 29.68], + '江孜县': [89.6, 28.92], + '定日县': [87.12, 28.67], + '萨迦县': [88.02, 28.9], + '拉孜县': [87.63, 29.08], + '昂仁县': [87.23, 29.3], + '谢通门县': [88.27, 29.43], + '白朗县': [89.27, 29.12], + '仁布县': [89.83, 29.23], + '康马县': [89.68, 28.57], + '定结县': [87.77, 28.37], + '仲巴县': [84.03, 29.77], + '亚东县': [88.9, 27.48], + '吉隆县': [85.3, 28.85], + '聂拉木县': [85.98, 28.17], + '萨嘎县': [85.23, 29.33], + '岗巴县': [88.52, 28.28], + '那曲地区': [92.07, 31.48], + '那曲县': [92.07, 31.48], + '嘉黎县': [93.25, 30.65], + '比如县': [93.68, 31.48], + '聂荣县': [92.3, 32.12], + '安多县': [91.68, 32.27], + '申扎县': [88.7, 30.93], + '索县': [93.78, 31.88], + '班戈县': [90.02, 31.37], + '巴青县': [94.03, 31.93], + '尼玛县': [87.23, 31.78], + '阿里地区': [80.1, 32.5], + '普兰县': [81.17, 30.3], + '札达县': [79.8, 31.48], + '噶尔县': [80.1, 32.5], + '日土县': [79.72, 33.38], + '革吉县': [81.12, 32.4], + '改则县': [84.07, 32.3], + '措勤县': [85.17, 31.02], + '林芝地区': [94.37, 29.68], + '林芝县': [94.37, 29.68], + '工布江达县': [93.25, 29.88], + '米林县': [94.22, 29.22], + '墨脱县': [95.33, 29.33], + '波密县': [95.77, 29.87], + '察隅县': [97.47, 28.67], + '朗县': [93.07, 29.05], + '西安市': [108.93, 34.27], + '新城区': [108.95, 34.27], + '碑林区': [108.93, 34.23], + '莲湖区': [108.93, 34.27], + '灞桥区': [109.07, 34.27], + '未央区': [108.93, 34.28], + '雁塔区': [108.95, 34.22], + '阎良区': [109.23, 34.65], + '临潼区': [109.22, 34.37], + '长安区': [108.93, 34.17], + '蓝田县': [109.32, 34.15], + '周至县': [108.2, 34.17], + '户县': [108.6, 34.1], + '高陵县': [109.08, 34.53], + '铜川市': [108.93, 34.9], + '王益区': [109.07, 35.07], + '印台区': [109.1, 35.1], + '耀州区': [108.98, 34.92], + '宜君县': [109.12, 35.4], + '宝鸡市': [107.13, 34.37], + '渭滨区': [107.15, 34.37], + '金台区': [107.13, 34.38], + '陈仓区': [107.37, 34.37], + '凤翔县': [107.38, 34.52], + '岐山县': [107.62, 34.45], + '扶风县': [107.87, 34.37], + '眉县': [107.75, 34.28], + '陇县': [106.85, 34.9], + '千阳县': [107.13, 34.65], + '麟游县': [107.78, 34.68], + '凤县': [106.52, 33.92], + '太白县': [107.32, 34.07], + '咸阳市': [108.7, 34.33], + '秦都区': [108.72, 34.35], + '杨凌区': [108.07, 34.28], + '渭城区': [108.73, 34.33], + '三原县': [108.93, 34.62], + '泾阳县': [108.83, 34.53], + '乾县': [108.23, 34.53], + '礼泉县': [108.42, 34.48], + '永寿县': [108.13, 34.7], + '彬县': [108.08, 35.03], + '长武县': [107.78, 35.2], + '旬邑县': [108.33, 35.12], + '淳化县': [108.58, 34.78], + '武功县': [108.2, 34.27], + '兴平市': [108.48, 34.3], + '渭南市': [109.5, 34.5], + '临渭区': [109.48, 34.5], + '华县': [109.77, 34.52], + '潼关县': [110.23, 34.55], + '大荔县': [109.93, 34.8], + '合阳县': [110.15, 35.23], + '澄城县': [109.93, 35.18], + '蒲城县': [109.58, 34.95], + '白水县': [109.58, 35.18], + '富平县': [109.18, 34.75], + '韩城市': [110.43, 35.48], + '华阴市': [110.08, 34.57], + '延安市': [109.48, 36.6], + '宝塔区': [109.48, 36.6], + '延长县': [110.0, 36.58], + '延川县': [110.18, 36.88], + '子长县': [109.67, 37.13], + '安塞县': [109.32, 36.87], + '志丹县': [108.77, 36.82], + '甘泉县': [109.35, 36.28], + '富县': [109.37, 35.98], + '洛川县': [109.43, 35.77], + '宜川县': [110.17, 36.05], + '黄龙县': [109.83, 35.58], + '黄陵县': [109.25, 35.58], + '汉中市': [107.02, 33.07], + '汉台区': [107.03, 33.07], + '南郑县': [106.93, 33.0], + '城固县': [107.33, 33.15], + '洋县': [107.55, 33.22], + '西乡县': [107.77, 32.98], + '勉县': [106.67, 33.15], + '宁强县': [106.25, 32.83], + '略阳县': [106.15, 33.33], + '镇巴县': [107.9, 32.53], + '留坝县': [106.92, 33.62], + '佛坪县': [107.98, 33.53], + '榆林市': [109.73, 38.28], + '榆阳区': [109.75, 38.28], + '神木县': [110.5, 38.83], + '府谷县': [111.07, 39.03], + '横山县': [109.28, 37.95], + '靖边县': [108.8, 37.6], + '定边县': [107.6, 37.58], + '绥德县': [110.25, 37.5], + '米脂县': [110.18, 37.75], + '佳县': [110.48, 38.02], + '吴堡县': [110.73, 37.45], + '清涧县': [110.12, 37.08], + '子洲县': [110.03, 37.62], + '安康市': [109.02, 32.68], + '汉滨区': [109.02, 32.68], + '汉阴县': [108.5, 32.9], + '石泉县': [108.25, 33.05], + '宁陕县': [108.32, 33.32], + '紫阳县': [108.53, 32.52], + '岚皋县': [108.9, 32.32], + '平利县': [109.35, 32.4], + '镇坪县': [109.52, 31.88], + '旬阳县': [109.38, 32.83], + '白河县': [110.1, 32.82], + '商洛市': [109.93, 33.87], + '商州区': [109.93, 33.87], + '洛南县': [110.13, 34.08], + '丹凤县': [110.33, 33.7], + '商南县': [110.88, 33.53], + '山阳县': [109.88, 33.53], + '镇安县': [109.15, 33.43], + '柞水县': [109.1, 33.68], + '兰州市': [103.82, 36.07], + '城关区': [103.83, 36.05], + '西固区': [103.62, 36.1], + '红古区': [102.87, 36.33], + '永登县': [103.27, 36.73], + '皋兰县': [103.95, 36.33], + '榆中县': [104.12, 35.85], + '嘉峪关市': [98.27, 39.8], + '金昌市': [102.18, 38.5], + '金川区': [102.18, 38.5], + '永昌县': [101.97, 38.25], + '白银市': [104.18, 36.55], + '白银区': [104.18, 36.55], + '平川区': [104.83, 36.73], + '靖远县': [104.68, 36.57], + '会宁县': [105.05, 35.7], + '景泰县': [104.07, 37.15], + '天水市': [105.72, 34.58], + '清水县': [106.13, 34.75], + '秦安县': [105.67, 34.87], + '甘谷县': [105.33, 34.73], + '武山县': [104.88, 34.72], + '张家川回族自治县': [106.22, 35.0], + '武威市': [102.63, 37.93], + '凉州区': [102.63, 37.93], + '民勤县': [103.08, 38.62], + '古浪县': [102.88, 37.47], + '天祝藏族自治县': [103.13, 36.98], + '张掖市': [100.45, 38.93], + '甘州区': [100.45, 38.93], + '肃南裕固族自治县': [99.62, 38.83], + '民乐县': [100.82, 38.43], + '临泽县': [100.17, 39.13], + '高台县': [99.82, 39.38], + '山丹县': [101.08, 38.78], + '平凉市': [106.67, 35.55], + '崆峒区': [106.67, 35.55], + '泾川县': [107.37, 35.33], + '灵台县': [107.62, 35.07], + '崇信县': [107.03, 35.3], + '华亭县': [106.65, 35.22], + '庄浪县': [106.05, 35.2], + '静宁县': [105.72, 35.52], + '酒泉市': [98.52, 39.75], + '肃州区': [98.52, 39.75], + '金塔县': [98.9, 39.98], + '肃北蒙古族自治县': [94.88, 39.52], + '阿克塞哈萨克族自治县': [94.33, 39.63], + '玉门市': [97.05, 40.28], + '敦煌市': [94.67, 40.13], + '庆阳市': [107.63, 35.73], + '西峰区': [107.63, 35.73], + '庆城县': [107.88, 36.0], + '环县': [107.3, 36.58], + '华池县': [107.98, 36.47], + '合水县': [108.02, 35.82], + '正宁县': [108.37, 35.5], + '宁县': [107.92, 35.5], + '镇原县': [107.2, 35.68], + '定西市': [104.62, 35.58], + '安定区': [104.62, 35.58], + '通渭县': [105.25, 35.2], + '陇西县': [104.63, 35.0], + '渭源县': [104.22, 35.13], + '临洮县': [103.87, 35.38], + '漳县': [104.47, 34.85], + '岷县': [104.03, 34.43], + '陇南市': [104.92, 33.4], + '武都区': [104.92, 33.4], + '成县': [105.72, 33.73], + '文县': [104.68, 32.95], + '宕昌县': [104.38, 34.05], + '康县': [105.6, 33.33], + '西和县': [105.3, 34.02], + '礼县': [105.17, 34.18], + '徽县': [106.08, 33.77], + '两当县': [106.3, 33.92], + '临夏回族自治州': [103.22, 35.6], + '临夏市': [103.22, 35.6], + '临夏县': [103.0, 35.5], + '康乐县': [103.72, 35.37], + '永靖县': [103.32, 35.93], + '广河县': [103.58, 35.48], + '和政县': [103.35, 35.43], + '东乡族自治县': [103.4, 35.67], + '甘南藏族自治州': [102.92, 34.98], + '合作市': [102.92, 34.98], + '临潭县': [103.35, 34.7], + '卓尼县': [103.5, 34.58], + '舟曲县': [104.37, 33.78], + '迭部县': [103.22, 34.05], + '玛曲县': [102.07, 34.0], + '碌曲县': [102.48, 34.58], + '夏河县': [102.52, 35.2], + '西宁市': [101.78, 36.62], + '城东区': [101.8, 36.62], + '城中区': [101.78, 36.62], + '城西区': [101.77, 36.62], + '城北区': [101.77, 36.67], + '大通回族土族自治县': [101.68, 36.93], + '湟中县': [101.57, 36.5], + '湟源县': [101.27, 36.68], + '海东地区': [102.12, 36.5], + '平安县': [102.12, 36.5], + '民和回族土族自治县': [102.8, 36.33], + '乐都县': [102.4, 36.48], + '互助土族自治县': [101.95, 36.83], + '化隆回族自治县': [102.27, 36.1], + '循化撒拉族自治县': [102.48, 35.85], + '海北藏族自治州': [100.9, 36.97], + '门源回族自治县': [101.62, 37.38], + '祁连县': [100.25, 38.18], + '海晏县': [100.98, 36.9], + '刚察县': [100.13, 37.33], + '黄南藏族自治州': [102.02, 35.52], + '同仁县': [102.02, 35.52], + '尖扎县': [102.03, 35.93], + '泽库县': [101.47, 35.03], + '河南蒙古族自治县': [101.6, 34.73], + '海南藏族自治州': [100.62, 36.28], + '共和县': [100.62, 36.28], + '同德县': [100.57, 35.25], + '贵德县': [101.43, 36.05], + '兴海县': [99.98, 35.58], + '贵南县': [100.75, 35.58], + '果洛藏族自治州': [100.23, 34.48], + '玛沁县': [100.23, 34.48], + '班玛县': [100.73, 32.93], + '甘德县': [99.9, 33.97], + '达日县': [99.65, 33.75], + '久治县': [101.48, 33.43], + '玛多县': [98.18, 34.92], + '玉树藏族自治州': [97.02, 33.0], + '玉树县': [97.02, 33.0], + '杂多县': [95.3, 32.9], + '称多县': [97.1, 33.37], + '治多县': [95.62, 33.85], + '囊谦县': [96.48, 32.2], + '曲麻莱县': [95.8, 34.13], + '海西蒙古族藏族自治州': [97.37, 37.37], + '格尔木市': [94.9, 36.42], + '德令哈市': [97.37, 37.37], + '乌兰县': [98.48, 36.93], + '都兰县': [98.08, 36.3], + '天峻县': [99.02, 37.3], + '银川市': [106.28, 38.47], + '兴庆区': [106.28, 38.48], + '西夏区': [106.18, 38.48], + '金凤区': [106.25, 38.47], + '永宁县': [106.25, 38.28], + '贺兰县': [106.35, 38.55], + '灵武市': [106.33, 38.1], + '石嘴山市': [106.38, 39.02], + '大武口区': [106.38, 39.02], + '惠农区': [106.78, 39.25], + '平罗县': [106.53, 38.9], + '吴忠市': [106.2, 37.98], + '利通区': [106.2, 37.98], + '盐池县': [107.4, 37.78], + '同心县': [105.92, 36.98], + '青铜峡市': [106.07, 38.02], + '固原市': [106.28, 36.0], + '原州区': [106.28, 36.0], + '西吉县': [105.73, 35.97], + '隆德县': [106.12, 35.62], + '泾源县': [106.33, 35.48], + '彭阳县': [106.63, 35.85], + '中卫市': [105.18, 37.52], + '沙坡头区': [105.18, 37.52], + '中宁县': [105.67, 37.48], + '海原县': [105.65, 36.57], + '乌鲁木齐市': [87.62, 43.82], + '天山区': [87.65, 43.78], + '沙依巴克区': [87.6, 43.78], + '新市区': [87.6, 43.85], + '水磨沟区': [87.63, 43.83], + '头屯河区': [87.42, 43.87], + '达坂城区': [88.3, 43.35], + '乌鲁木齐县': [87.6, 43.8], + '克拉玛依市': [84.87, 45.6], + '独山子区': [84.85, 44.32], + '克拉玛依区': [84.87, 45.6], + '白碱滩区': [85.13, 45.7], + '乌尔禾区': [85.68, 46.08], + '吐鲁番地区': [89.17, 42.95], + '吐鲁番市': [89.17, 42.95], + '鄯善县': [90.22, 42.87], + '托克逊县': [88.65, 42.78], + '哈密地区': [93.52, 42.83], + '哈密市': [93.52, 42.83], + '伊吾县': [94.7, 43.25], + '昌吉回族自治州': [87.3, 44.02], + '昌吉市': [87.3, 44.02], + '阜康市': [87.98, 44.15], + '米泉市': [87.65, 43.97], + '呼图壁县': [86.9, 44.18], + '玛纳斯县': [86.22, 44.3], + '奇台县': [89.58, 44.02], + '吉木萨尔县': [89.18, 44.0], + '木垒哈萨克自治县': [90.28, 43.83], + '博尔塔拉蒙古自治州': [82.07, 44.9], + '博乐市': [82.07, 44.9], + '精河县': [82.88, 44.6], + '温泉县': [81.03, 44.97], + '巴音郭楞蒙古自治州': [86.15, 41.77], + '库尔勒市': [86.15, 41.77], + '轮台县': [84.27, 41.78], + '尉犁县': [86.25, 41.33], + '若羌县': [88.17, 39.02], + '且末县': [85.53, 38.13], + '焉耆回族自治县': [86.57, 42.07], + '和静县': [86.4, 42.32], + '和硕县': [86.87, 42.27], + '博湖县': [86.63, 41.98], + '阿克苏地区': [80.27, 41.17], + '阿克苏市': [80.27, 41.17], + '温宿县': [80.23, 41.28], + '库车县': [82.97, 41.72], + '沙雅县': [82.78, 41.22], + '新和县': [82.6, 41.55], + '拜城县': [81.87, 41.8], + '乌什县': [79.23, 41.22], + '阿瓦提县': [80.38, 40.63], + '柯坪县': [79.05, 40.5], + '阿图什市': [76.17, 39.72], + '阿克陶县': [75.95, 39.15], + '阿合奇县': [78.45, 40.93], + '乌恰县': [75.25, 39.72], + '喀什地区': [75.98, 39.47], + '喀什市': [75.98, 39.47], + '疏附县': [75.85, 39.38], + '疏勒县': [76.05, 39.4], + '英吉沙县': [76.17, 38.93], + '泽普县': [77.27, 38.18], + '莎车县': [77.23, 38.42], + '叶城县': [77.42, 37.88], + '麦盖提县': [77.65, 38.9], + '岳普湖县': [76.77, 39.23], + '伽师县': [76.73, 39.5], + '巴楚县': [78.55, 39.78], + '和田地区': [79.92, 37.12], + '和田市': [79.92, 37.12], + '和田县': [79.93, 37.1], + '墨玉县': [79.73, 37.27], + '皮山县': [78.28, 37.62], + '洛浦县': [80.18, 37.07], + '策勒县': [80.8, 37.0], + '于田县': [81.67, 36.85], + '民丰县': [82.68, 37.07], + '伊犁哈萨克自治州': [81.32, 43.92], + '伊宁市': [81.32, 43.92], + '奎屯市': [84.9, 44.42], + '伊宁县': [81.52, 43.98], + '察布查尔锡伯自治县': [81.15, 43.83], + '霍城县': [80.88, 44.05], + '巩留县': [82.23, 43.48], + '新源县': [83.25, 43.43], + '昭苏县': [81.13, 43.15], + '特克斯县': [81.83, 43.22], + '尼勒克县': [82.5, 43.78], + '塔城地区': [82.98, 46.75], + '塔城市': [82.98, 46.75], + '乌苏市': [84.68, 44.43], + '额敏县': [83.63, 46.53], + '沙湾县': [85.62, 44.33], + '托里县': [83.6, 45.93], + '裕民县': [82.98, 46.2], + '和布克赛尔蒙古自治县': [85.72, 46.8], + '阿勒泰地区': [88.13, 47.85], + '阿勒泰市': [88.13, 47.85], + '布尔津县': [86.85, 47.7], + '富蕴县': [89.52, 47.0], + '福海县': [87.5, 47.12], + '哈巴河县': [86.42, 48.07], + '青河县': [90.38, 46.67], + '吉木乃县': [85.88, 47.43], + '石河子市': [86.03, 44.3], + '阿拉尔市': [81.28, 40.55], + '图木舒克市': [79.13, 39.85], + '五家渠市': [87.53, 44.17], + '台北市': [121.5, 25.03], + '高雄市': [120.28, 22.62], + '基隆市': [121.73, 25.13], + '台中市': [120.67, 24.15], + '台南市': [120.2, 23.0], + '新竹市': [120.95, 24.82], + '嘉义市': [120.43, 23.48], + '台北县': [121.47, 25.02], + '宜兰县': [121.75, 24.77], + '桃园县': [121.3, 24.97], + '苗栗县': [120.8, 24.53], + '台中县': [120.72, 24.25], + '彰化县': [120.53, 24.08], + '南投县': [120.67, 23.92], + '云林县': [120.53, 23.72], + '台南县': [120.32, 23.32], + '高雄县': [120.37, 22.63], + '屏东县': [120.48, 22.67], + '台东县': [121.15, 22.75], + '花莲县': [121.6, 23.98], + '澎湖县': [119.58, 23.58] +} diff --git a/pyecharts/custom/__init__.py b/pyecharts/custom/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pyecharts/custom/grid.py b/pyecharts/custom/grid.py new file mode 100644 index 000000000..ecfd2657d --- /dev/null +++ b/pyecharts/custom/grid.py @@ -0,0 +1,125 @@ +# coding=utf-8 +import copy + +from pyecharts.option import grid +from pyecharts.constants import PAGE_TITLE +from pyecharts.base import Base +from pyecharts.utils import merge_js_dependencies + + +class Grid(Base): + """ + 用户可以自定义结合 Line/Bar/Kline/Scatter/EffectScatter/Pie/HeatMap + /Boxplot 图表,将不同类型图表画在多张图上。第一个图需为 有 x/y 轴的图, + 即不能为 Pie,其他位置顺序任意。 + """ + + def __init__(self, page_title=PAGE_TITLE, + width=800, + height=400): + super(Grid, self).__init__( + width=width, height=height + ) + self._page_title = page_title + + def add(self, chart, + grid_width=None, + grid_height=None, + grid_top=None, + grid_bottom=None, + grid_left=None, + grid_right=None): + """ + + :param chart: + 图形实例 + :param grid_width: + grid 组件的宽度。默认自适应。 + :param grid_height: + grid 组件的高度。默认自适应。 + :param grid_top: + grid 组件离容器顶部的距离。默认为 None, 有'top', 'center', + 'middle'可选,也可以为百分数或者整数 + :param grid_bottom: + grid 组件离容器底部的距离。默认为 None, 有'top', 'center', + 'middle'可选,也可以为百分数或者整数 + :param grid_left: + grid 组件离容器左侧的距离。默认为 None, 有'left', 'center', + 'right'可选,也可以为百分数或者整数 + :param grid_right: + grid 组件离容器右侧的距离。默认为 None, 有'left', 'center', + 'right'可选,也可以为百分数或者整数 + """ + if not self._option: + self._option = copy.deepcopy(chart.options) + self._option.update(grid=[]) + self._js_dependencies = chart.js_dependencies + + _grid = grid( + grid_width, grid_height, + grid_top, grid_bottom, grid_left, grid_right) + if _grid: + for _ in range(len(self._option.get('series'))): + self._option.get('grid').append(_grid) + else: + _series = ( + chart.options.get('series'), + chart.options.get('xAxis', None), + chart.options.get('yAxis', None), + chart.options.get('legend')[0], + chart.options.get('title')[0] + ) + (_index, _index_once, _xaxis, + _yaxis, _legend, _title) = self.__custom(_series) + self._option.get('legend').append(_legend) + self._option.get('title').append(_title) + + if _xaxis and _yaxis is not None: + for _x in _xaxis: + _x.update(gridIndex=_index - 1) + self._option.get('xAxis').append(_x) + for _y in _yaxis: + _y.update(gridIndex=_index - 1) + self._option.get('yAxis').append(_y) + + # series id 是每个图实例的唯一标识 + _flag = self._option.get('series')[0].get('seriesId') + _series_index = 0 + for s in self._option.get('series'): + if _flag == s.get('seriesId'): + s.update(xAxisIndex=_series_index, + yAxisIndex=_series_index) + else: + _series_index += 1 + s.update(xAxisIndex=_series_index, + yAxisIndex=_series_index) + _flag = s.get('seriesId') + + _grid = grid( + grid_width, grid_height, + grid_top, grid_bottom, grid_left, grid_right) + for _ in range(_index_once): + self._option.get('grid').append(_grid) + self._js_dependencies = merge_js_dependencies( + self._js_dependencies, + chart.js_dependencies + ) + + def __custom(self, series): + """ + + :param series: + series data + :return: + """ + _series, _xaxis, _yaxis, _legend, _title = series + for s in _series: + self._option.get('series').append(s) + return ( + len(self._option.get('series')), + len(_series), + _xaxis, + _yaxis, + _legend, + _title + ) diff --git a/pyecharts/custom/overlap.py b/pyecharts/custom/overlap.py new file mode 100644 index 000000000..99bd98300 --- /dev/null +++ b/pyecharts/custom/overlap.py @@ -0,0 +1,81 @@ +# coding=utf-8 + +import copy +from pyecharts.constants import PAGE_TITLE +from pyecharts.base import Base +from pyecharts.utils import merge_js_dependencies + + +class Overlap(Base): + """ + 用户可以自定义结合 Line/Bar/Kline, Scatter/EffectScatter 图表, + 将不同类型图表画在一张图上。利用第一个图表为基础,往后的数据都将 + 会画在第一个图表上。 + """ + + def __init__(self, page_title=PAGE_TITLE, + width=800, + height=400): + super(Overlap, self).__init__( + width=width, height=height + ) + self._page_title = page_title + + def add(self, chart, + xaxis_index=0, + yaxis_index=0, + is_add_xaxis=False, + is_add_yaxis=False): + """ + + :param chart: + 图形实例 + :param xaxis_index: + x 坐标轴索引,默认为 0 + :param yaxis_index: + y 坐标轴索引,默认为 0 + :param is_add_xaxis: + 是否新增一个 x 坐标轴,默认为 False + :param is_add_yaxis: + 是否新增一个 y 坐标轴,默认为 False + """ + if not self._option: + self._option = copy.deepcopy(chart.options) + self._series_id = self._option.get('series')[0].get('seriesId') + self._js_dependencies = chart.js_dependencies + else: + _series = ( + chart.options.get('legend')[0].get('data'), + chart.options.get('series'), + chart.options.get('xAxis')[0], + chart.options.get('yAxis')[0], + is_add_xaxis, + is_add_yaxis, + xaxis_index, + yaxis_index + ) + self.__custom(_series) + self._js_dependencies = merge_js_dependencies( + self._js_dependencies, + chart.js_dependencies + ) + + def __custom(self, series): + """ Appends the data for the series of the chart type + + :param series: + series data + """ + (_name, _series, _xaxis, _yaxis, is_add_xaxis, is_add_yaxis, + _xaxis_index, _yaxis_index) = series + for n in _name: + self._option.get('legend')[0].get('data').append(n) + for s in _series: + s.update(xAxisIndex=_xaxis_index, yAxisIndex=_yaxis_index, + seriesId=self._series_id) + self._option.get('series').append(s) + + if is_add_xaxis: + self._option.get('xAxis').append(_xaxis) + if is_add_yaxis: + self._option.get('yAxis').append(_yaxis) diff --git a/pyecharts/custom/page.py b/pyecharts/custom/page.py new file mode 100644 index 000000000..4f18b39a5 --- /dev/null +++ b/pyecharts/custom/page.py @@ -0,0 +1,96 @@ +# coding=utf-8 + +from jinja2 import Markup + +import pyecharts.utils as utils +import pyecharts.engine as engine +from pyecharts.conf import CURRENT_CONFIG +import pyecharts.constants as constants + + +class Page(list): + """ + A composite object to present multiple charts vertically in a single page + """ + + def __init__(self, page_title=constants.PAGE_TITLE): + list.__init__([]) + self._page_title = page_title + + def add(self, achart_or_charts): + """ + Append chart(s) to the rendering page + + :param achart_or_charts: + :return: + """ + if isinstance(achart_or_charts, list): + self.extend(achart_or_charts) + else: + self.append(achart_or_charts) + + def render(self, + path='render.html', + template_name='simple_page.html', + object_name='page', + extra_context=None): + env = engine.create_default_environment() + env.render_chart_to_file( + chart=self, + object_name=object_name, + path=path, + template_name=template_name, + extra_context=extra_context + ) + + def render_embed(self): + """ + Produce rendered charts in html for embedding purpose + + :return: + """ + return Markup('<br/> '.join([chart.render_embed() for chart in self])) + + def get_js_dependencies(self): + """ + Declare its javascript dependencies for embedding purpose + """ + return CURRENT_CONFIG.produce_html_script_list( + self.js_dependencies) + + def _repr_html_(self): + """ + + :return: + """ + dependencies = self.js_dependencies + require_config = CURRENT_CONFIG.produce_require_configuration( + dependencies) + config_items = require_config['config_items'] + libraries = require_config['libraries'] + env = engine.create_default_environment() + return env.render_chart_to_notebook( + charts=self, + config_items=config_items, + libraries=libraries + ) + + @property + def js_dependencies(self): + # Treat self as a list,not a page + return utils.merge_js_dependencies(*self) + + @property + def page_title(self): + return self._page_title + + @classmethod + def from_charts(cls, *args): + """ + A shortcut class method for building page object from charts. + :param args: + :return: + """ + p = cls() + p.extend(args) + return p diff --git a/pyecharts/custom/timeline.py b/pyecharts/custom/timeline.py new file mode 100644 index 000000000..39317715a --- /dev/null +++ b/pyecharts/custom/timeline.py @@ -0,0 +1,132 @@ +# coding=utf-8 + +import copy + +from pyecharts.constants import PAGE_TITLE +from pyecharts.base import Base +from pyecharts.utils import merge_js_dependencies + + +class Timeline(Base): + """ + 时间线轮播多张图 + """ + + def __init__(self, page_title=PAGE_TITLE, + width=800, + height=400, + is_auto_play=False, + is_loop_play=True, + is_rewind_play=False, + is_timeline_show=True, + timeline_play_interval=2000, + timeline_symbol="emptyCircle", + timeline_symbol_size=10, + timeline_left="auto", + timeline_right="auto", + timeline_top="auto", + timeline_bottom="atuo"): + """ + + :param is_auto_play: + 是否自动播放,默认为 Flase + :param is_loop_play: + 是否循环播放,默认为 True + :param is_rewind_play: + 是否方向播放,默认为 Flase + :param is_timeline_show: + 是否显示 timeline 组件。默认为 True,如果设置为false,不会显示,但是功能还存在。 + :param timeline_play_interval: + 播放的速度(跳动的间隔),单位毫秒(ms)。 + :param timeline_symbol: + 标记的图形。有'circle', 'rect', 'roundRect', 'triangle', 'diamond', + 'pin', 'arrow'可选 + :param timeline_symbol_size: + 标记的图形大小,可以设置成诸如 10 这样单一的数字,也可以用数组分开表示 + 宽和高,例如 [20, 10] 表示标记宽为 20,高为 10。 + :param timeline_left: + timeline 组件离容器左侧的距离。 + left 的值可以是像 20 这样的具体像素值,可以是像 '20%' 这样相对于容器高宽的百分比, + 也可以是 'left', 'center', 'right'。如果 left 的值为'left', 'center', + 'right',组件会根据相应的位置自动对齐。 + :param timeline_right: + timeline 组件离容器右侧的距离。同 left + :param timeline_top: + timeline 组件离容器顶侧的距离。同 left + :param timeline_bottom: + timeline 组件离容器底侧的距离。同 left + """ + + super(Timeline, self).__init__( + width=width, height=height + ) + self._page_title = page_title + self._time_points = [] + self._option = { + "baseOption": { + "timeline": { + "axisType": "category", + "autoPlay": is_auto_play, + "loop": is_loop_play, + "rewind": is_rewind_play, + "show": is_timeline_show, + "symbol": timeline_symbol, + "symbolSize": timeline_symbol_size, + "playInterval": timeline_play_interval, + "left": timeline_left, + "right": timeline_right, + "top": timeline_top, + "bottom": timeline_bottom + }, + "series": [], + }, + "options": [], + } + + def add(self, chart, time_point): + """ + + :param chart: + 图形实例 + :param time_point: + 指定时间点 + """ + self._js_dependencies = merge_js_dependencies( + self._js_dependencies, + chart.js_dependencies + ) + self.__check_components(chart) + self._time_points.append(time_point) + self._option.get('baseOption').update( + backgroundColor=chart.options.get('backgroundColor') + ) + self._option.get('baseOption').get('timeline').update( + data=self._time_points + ) + self._option.get('options').append({ + "legend": chart.options.get('legend'), + "series": chart.options.get('series'), + "title": chart.options.get('title'), + "tooltip": chart.options.get('tooltip') + }) + _tmp_series = copy.deepcopy(chart.options.get('series')) + for _s in _tmp_series: + if _s.get("type") == "map": + _s.pop("data", None) + self._option.get("baseOption").get("series").append(_s) + + def __check_components(self, chart): + """ + + :param chart: + 图形实例 + """ + _compoents = [ + 'grid', 'xAxis', 'yAxis', 'polar', 'radiusAxis', 'geo', + 'angleAxis', 'radar', 'visualMap', 'dataZoom', 'parallelAxis' + ] + + for component in _compoents: + _c = chart.options.get(component, None) + if _c is not None: + self._option.get('baseOption').update({component: _c}) diff --git a/pyecharts/engine.py b/pyecharts/engine.py new file mode 100644 index 000000000..b2d2d3de8 --- /dev/null +++ b/pyecharts/engine.py @@ -0,0 +1,216 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from jinja2 import Environment, FileSystemLoader, environmentfunction, Markup + +import pyecharts.conf as conf +import pyecharts.utils as utils + +LINK_SCRIPT_FORMATTER = '<script type="text/javascript" src="{}"></script>' +EMBED_SCRIPT_FORMATTER = '<script type="text/javascript">\n{}\n</script>' +CHART_DIV_FORMATTER = '<div id="{chart_id}" style="width:{width};height:{height};"></div>' # flake8: noqa +CHART_CONFIG_FORMATTER = """ +var myChart_{chart_id} = echarts.init(document.getElementById('{chart_id}'), null, {{renderer: '{renderer}'}}); +var option_{chart_id} = {options}; +myChart_{chart_id}.setOption(option_{chart_id}); +""" + + +@environmentfunction +def echarts_js_dependencies(env, *args): + """ Render script html nodes in external link mode. + + :param env: + :param args: + """ + current_config = env.pyecharts_config + dependencies = utils.merge_js_dependencies(*args) + + if current_config.js_embed: + contents = current_config.read_file_contents_from_local(dependencies) + + return Markup( + '\n'.join([EMBED_SCRIPT_FORMATTER.format(c) for c in contents]) + ) + else: + js_links = current_config.generate_js_link(dependencies) + return Markup( + '\n'.join([LINK_SCRIPT_FORMATTER.format(j) for j in js_links]) + ) + + +@environmentfunction +def echarts_js_dependencies_embed(env, *args): + """ Render script html nodes in embed mode,Only used for local files. + + :param env: + :param args: + """ + current_config = env.pyecharts_config + dependencies = utils.merge_js_dependencies(*args) + contents = current_config.read_file_contents_from_local(dependencies) + return Markup( + '\n'.join([EMBED_SCRIPT_FORMATTER.format(c) for c in contents]) + ) + + +@environmentfunction +def echarts_container(env, chart): + """ Render a div html element for a chart. + + :param env: + :param chart: A pyecharts.base.Base object + """ + + return Markup( + CHART_DIV_FORMATTER.format( + chart_id=chart.chart_id, + width=utils.to_css_length(chart.width), + height=utils.to_css_length(chart.height) + )) + + +def generate_js_content(*charts): + """ Generate the initial code fragment for one or some chart instances. + + :param charts: + :return: + """ + contents = [] + for chart in charts: + js_content = CHART_CONFIG_FORMATTER.format( + chart_id=chart.chart_id, + renderer=chart.renderer, + options=utils.json_dumps(chart.options, indent=4) + ) + contents.append(js_content) + contents = '\n'.join(contents) + return contents + + +@environmentfunction +def echarts_js_content(env, *charts): + """ Render script html node for echarts initial code. + + :param env: + :param chart: + """ + return Markup(EMBED_SCRIPT_FORMATTER.format(generate_js_content(*charts))) + + +@environmentfunction +def echarts_js_content_wrap(env, *charts): + """ Render echarts initial code for a chart. + + :param env: + :param charts: + """ + return Markup(generate_js_content(*charts)) + + +# Public API,see document for more detail. + +ECHAERTS_TEMPLATE_FUNCTIONS = { + 'echarts_js_dependencies': echarts_js_dependencies, + 'echarts_js_dependencies_embed': echarts_js_dependencies_embed, + 'echarts_container': echarts_container, + 'echarts_js_content': echarts_js_content, + 'echarts_js_content_wrap': echarts_js_content_wrap +} + + +class BaseEnvironment(Environment): + """ + Add config and echarts template functions to a Environment object. + """ + + def __init__(self, *args, **kwargs): + self.pyecharts_config = kwargs.pop('pyecharts_config', None) + if self.pyecharts_config is None: + raise TypeError( + 'no pyecharts_config for this environment specified') + super(BaseEnvironment, self).__init__(*args, **kwargs) + self.globals.update(ECHAERTS_TEMPLATE_FUNCTIONS) + + +class EchartsEnvironment(BaseEnvironment): + """ + Built-in jinja2 template engine for pyecharts + This class provides some shortcut methods for rendering charts. + """ + + def __init__(self, pyecharts_config=None, *args, **kwargs): + pyecharts_config = pyecharts_config or conf.PyEchartsConfig() + loader = kwargs.pop('loader', None) + if loader is None: + loader = FileSystemLoader(pyecharts_config.echarts_template_dir) + super(EchartsEnvironment, self).__init__( + pyecharts_config=pyecharts_config, + keep_trailing_newline=True, + trim_blocks=True, + lstrip_blocks=True, + loader=loader, + *args, + **kwargs) + + def render_container_and_echarts_code(self, chart): + """ + Render <div> and <script> code fragment for a chart. + :param chart: + :return: + """ + tpl_string = """ + {{ echarts_container(chart) }} + {{ echarts_js_content(chart) }} + """ + tpl = self.from_string(tpl_string) + return tpl.render(chart=chart) + + def render_chart_to_file( + self, + chart, + object_name='chart', + path='render.html', + template_name='simple_chart.html', + extra_context=None + ): + """ + Render a chart or page to local html files. + + :param chart: A Chart or Page object + :param object_name: Variable name for chart/page used in template + :param path: The destination file which the html code write to + :param template_name: The name of template file. + :param extra_context: A dictionary containing extra data. + :return: None + """ + context = {object_name: chart} + context.update(extra_context or {}) + tpl = self.get_template(template_name) + html = tpl.render(**context) + utils.write_utf8_html_file(path, html) + + def render_chart_to_notebook(self, **context): + """ + Return html string for rendering a chart/page to a notebook cell. + + :param context: A dictionary containing data. + :return: A unicode string that will be displayed in notebook cell. + """ + tpl = self.get_template('notebook.html') + return tpl.render(**context) + + +def create_default_environment(): + """ + Create environment object with pyecharts default single PyEchartsConfig. + + :return: A new EchartsEnvironment object. + """ + config = conf.CURRENT_CONFIG + echarts_env = EchartsEnvironment( + pyecharts_config=config, + loader=FileSystemLoader( + [config.echarts_template_dir, conf.DEFAULT_TEMPLATE_DIR]) + ) + return echarts_env diff --git a/pyecharts/exceptions.py b/pyecharts/exceptions.py new file mode 100644 index 000000000..2eab543c5 --- /dev/null +++ b/pyecharts/exceptions.py @@ -0,0 +1,6 @@ +class NoJsExtensionFound(Exception): + pass + + +class InvalidRegistry(Exception): + pass diff --git a/pyecharts/js_extensions.py b/pyecharts/js_extensions.py new file mode 100644 index 000000000..be6ac61e4 --- /dev/null +++ b/pyecharts/js_extensions.py @@ -0,0 +1,133 @@ +# coding=utf-8 + +import os +import json +import codecs + +from lml.loader import scan_plugins +from lml.plugin import PluginManager + +import pyecharts.exceptions as exceptions + +# here are all plugins from pyecharts team +OFFICIAL_PLUGINS = [ + "jupyter_echarts_pypkg" +] +THIRD_PARTY_PLUGIN_PREFIX = "echarts_" + +JS_EXTENSION_REGISTRY = 'registry.json' +REGISTRY_JS_FOLDER = 'JS_FOLDER' +REGISTRY_FILE_MAP = 'FILE_MAP' +REGISTRY_GITHUB_URL = 'GITHUB_URL' +REGISTRY_JUPYTER_URL = 'JUPYTER_URL' +REGISTRY_PINYIN_MAP = 'PINYIN_MAP' + + +class JsExtension(object): + def __init__(self, extension_home, registry_content): + self.registry = registry_content + self.home = os.path.join(extension_home, + self.registry[REGISTRY_JS_FOLDER]) + + @classmethod + def from_registry_path(cls, extension_installation_path): + __registry_json__ = os.path.join( + extension_installation_path, JS_EXTENSION_REGISTRY) + __registry__ = read_a_map_registry(__registry_json__) + _validate_registry(__registry__) + return cls(extension_installation_path, __registry__) + + def get_js_library(self, pinyin): + file_map = self.registry.get(REGISTRY_FILE_MAP) + return file_map.get(pinyin) + + def read_js_library(self, pinyin): + filename = self.get_js_library(pinyin) + if filename: + abs_path = os.path.join(self.home, filename + '.js') + with codecs.open(abs_path, 'r', encoding='utf-8') as pf: + return pf.read() + else: + return None + + def get_js_link(self, pinyin, jshost=None): + filename = self.get_js_library(pinyin) + if filename: + if jshost is None: + jshost = self.home + return '%s/%s.js' % (jshost, filename) + else: + return None + + def produce_require_config_syntax( + self, pinyin, jshost=None, use_github=False): + filename = self.get_js_library(pinyin) + if filename: + jshost = self._resolve_jshost(jshost, use_github) + return "'%s': '%s/%s'" % (pinyin, jshost, filename) + else: + return None + + def chinese_to_pinyin(self, chinese): + __PINYIN_MAP__ = self.registry.get(REGISTRY_PINYIN_MAP, {}) + return __PINYIN_MAP__.get(chinese) + + def _resolve_jshost(self, jshost, use_github=False): + __jshost__ = jshost + if jshost is None: + if use_github: + __jshost__ = self.registry[REGISTRY_GITHUB_URL] + else: + __jshost__ = self.registry[REGISTRY_JUPYTER_URL] + return __jshost__ + + +class JsExtensionManager(PluginManager): + def __init__(self): + super(JsExtensionManager, self).__init__('pyecharts_js_extension') + self.js_extensions = [] + + def get_all_extensions(self): + if len(self.js_extensions) == 0: + for pypkgs in self.registry.values(): + for pypkg_info in pypkgs: + __pypkg__ = pypkg_info.cls() + __js_extension__ = JsExtension.from_registry_path( + __pypkg__.js_extension_path) + self.js_extensions.append(__js_extension__) + return self.js_extensions + + def get_a_extension(self, name): + if len(self.js_extensions) == 0: + self.get_all_extensions() + for __extension__ in self.js_extensions: + if __extension__.registry['JS_FOLDER'] == name: + return __extension__ + return None + + +EXTENSION_MANAGER = JsExtensionManager() +# Load js & map file index into a dictionary. +scan_plugins( + THIRD_PARTY_PLUGIN_PREFIX, + "pyecharts", # <- useful for pyinstaller only + white_list=OFFICIAL_PLUGINS) + + +def read_a_map_registry(registry_json): + with codecs.open(registry_json, 'r', 'utf-8') as f: + content = f.read() + return json.loads(content) + + +def _validate_registry(registry): + __registry_keys__ = [ + REGISTRY_JS_FOLDER, + REGISTRY_FILE_MAP, + REGISTRY_GITHUB_URL, + REGISTRY_JUPYTER_URL, + REGISTRY_PINYIN_MAP + ] + for key in __registry_keys__: + if key not in registry: + raise exceptions.InvalidRegistry("%s is missing" % key) diff --git a/pyecharts/option.py b/pyecharts/option.py index 691d88c47..9b97bcac9 100644 --- a/pyecharts/option.py +++ b/pyecharts/option.py @@ -1,10 +1,11 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 +# coding=utf-8 +from __future__ import unicode_literals import random fs = [] +SYMBOLS = ('rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow') + def collectfuncs(func): fs.append(func) @@ -13,48 +14,78 @@ def collectfuncs(func): @collectfuncs def label(type=None, - is_emphasis=True, - label_pos=None, is_label_show=False, + is_label_emphasis=True, + label_pos=None, label_text_color="#000", label_text_size=12, - formatter=None, + label_formatter=None, + label_emphasis_pos=None, + label_emphasis_textcolor='#fff', + label_emphasis_textsize=12, **kwargs): - """ + """ 图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。 :param type: - 图例类型 - :param is_emphasis: - 是否高亮显示标签 - :param label_pos: - 标签位置 + 图形类型 + :param is_label_emphasis: + 是否高亮显示标签,默认显示。高亮标签即选中数据时显示的信息项。 :param is_label_show: - 是否正常显示标签 + 是否正常显示标签,默认不显示。标签即各点的数据项信息 + :param label_pos: + 标签的位置,Bar 图默认为'top'。有'top', 'left', 'right', 'bottom', + 'inside', 'outside'可选 :param label_text_color: - 标签字体颜色 + 标签字体颜色,默认为 "#000" :param label_text_size: - 标签字体大小 - :param formatter: - 标签内容格式器,有 series,name,value,percent 可选 + 标签字体大小,默认为 12 + :param label_formatter: + 模板变量有 {a}, {b},{c},{d},{e},分别表示系列名,数据名,数据值等。 + 使用示例,如 label_formatter='{a}' + 在 trigger 为 'axis' 的时候,会有多个系列的数据,此时可以通过 {a0}, {a1}, {a2} + 这种后面加索引的方式表示系列的索引。不同图表类型下的 {a},{b},{c},{d} 含义不一样。 + 其中变量 {a}, {b}, {c}, {d} 在不同图表类型下代表数据含义为: + 折线(区域)图、柱状(条形)图、K线图 : + {a}(系列名称),{b}(类目值),{c}(数值), {d}(无) + 散点图(气泡)图 : + {a}(系列名称),{b}(数据名称),{c}(数值数组), {d}(无) + 地图 : + {a}(系列名称),{b}(区域名称),{c}(合并数值), {d}(无) + 饼图、仪表盘、漏斗图: + {a}(系列名称),{b}(数据项名称),{c}(数值), {d}(百分比) + :param label_emphasis_pos: + 高亮标签的位置,Bar 图默认为'top'。有'top', 'left', 'right', 'bottom', + 'inside', 'outside'可选 + :param label_emphasis_textcolor: + 高亮标签字体颜色,默认为 "#fff" + :param label_emphasis_textsize: + 高亮标签字体大小,默认为 12 :param kwargs: - :return: """ if label_pos is None: label_pos = "outside" if type in ["pie", "graph"] else "top" _label = { - "normal": {"show": is_label_show, - "position": label_pos, - "textStyle": {"color": label_text_color, - "fontSize": label_text_size}}, - "emphasis": {"show": is_emphasis} + "normal": { + "show": is_label_show, + "position": label_pos, + "textStyle": { + "color": label_text_color, + "fontSize": label_text_size + }}, + "emphasis": { + "show": is_label_emphasis, + "position": label_emphasis_pos, + "textStyle": { + "color": label_emphasis_textcolor, + "fontSize": label_emphasis_textsize, + }} } - fmat = {"series": "{a} ", "name": "{b} ", "value": "{c} ", "percent": "{d}% "} - if formatter is None: - _formatter = "{b} {d}%" if type == "pie" else None - else: - _formatter = "".join([fmat.get(f) for f in formatter if fmat.get(f, None)]) + + if label_formatter is None: + if type == "pie": + label_formatter = "{b}: {d}%" if type != "graph": - _label.get("normal").update(formatter=_formatter) + _label.get("normal").update(formatter=label_formatter) return _label @@ -68,11 +99,10 @@ def color(colorlst=None, :param colorlst: 全局颜色列表 :param is_random: - 是否随机排列颜色列表 + 指定是否随机打乱全局颜色列表 :param label_color: - 追加颜色项 + 追加的颜色列表 :param kwargs: - :return: """ if colorlst is None: colorlst = [] @@ -85,29 +115,40 @@ def color(colorlst=None, @collectfuncs -def line_style(line_width=1, +def line_style(type=None, + line_width=1, line_opacity=1, line_curve=0, line_type="solid", + line_color=None, **kwargs): - """ + """ 带线图形的线的风格选项 + :param type: + 图形类型 :param line_width: - 线的宽度 + 线的宽度,默认为 1 :param line_opacity: - 线的透明度,0 为完全透明,1 为完全不透明 + 线的透明度,0 为完全透明,1 为完全不透明。默认为 1 :param line_curve: - 线的弯曲程度,0 为完全不弯曲,1 为最弯曲 + 线的弯曲程度,0 为完全不弯曲,1 为最弯曲。默认为 0 :param line_type: - 线的类型,有 solid,dashed,dotted + 线的类型,有'solid', 'dashed', 'dotted'可选。默认为'solid' + :param line_color: + 线的颜色 :param kwargs: - :return: """ + if line_color is None and type == "graph": + line_color = '#aaa' + _line_style = { - "normal": {"width": line_width, - "opacity": line_opacity, - "curveness": line_curve, - "type": line_type} + "normal": { + "width": line_width, + "opacity": line_opacity, + "curveness": line_curve, + "type": line_type, + "color": line_color + } } return _line_style @@ -117,9 +158,8 @@ def split_line(is_splitline_show=True, **kwargs): """ :param is_splitline_show: - 是否显示分割线 + 指定是否显示分割线 :param kwargs: - :return: """ _split_line = { "show": is_splitline_show, @@ -133,9 +173,8 @@ def axis_line(is_axisline_show=True, **kwargs): """ :param is_axisline_show: - 是否显示坐标轴线 + 指定是否显示坐标轴线 :param kwargs: - :return: """ _axis_line = { "show": is_axisline_show, @@ -149,13 +188,12 @@ def split_area(is_area_show=True, **kwargs): """ :param is_area_show: - 是否显示填充区域 + 指定是否显示标记区域 :param kwargs: - :return: """ _split_area = { "show": is_area_show, - "areaStyle": axis_line(**kwargs) + "areaStyle": area_style(**kwargs) } return _split_area @@ -168,13 +206,12 @@ def area_style(flag=False, """ :param flag: - 图例类型标记位 + 判断符 :param area_opacity: - 填充区域透明度 + 区域透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形。 :param area_color: - 填充区域颜色 + 填充的颜色 :param kwargs: - :return: """ if area_opacity is None: area_opacity = 0 if flag else 1 @@ -187,193 +224,544 @@ def area_style(flag=False, @collectfuncs def xy_axis(type=None, - xy_font_size=14, - namegap=25, + x_axis=None, + xaxis_margin=8, + xaxis_name_size=14, + xaxis_name_gap=25, xaxis_name="", xaxis_name_pos="middle", - interval="auto", + xaxis_rotate=0, + xaxis_min=None, + xaxis_max=None, + xaxis_type=None, + xaxis_interval="auto", + xaxis_force_interval=None, + xaxis_pos=None, + xaxis_label_textsize=12, + xaxis_label_textcolor="#000", + yaxis_margin=8, + yaxis_name_size=14, + yaxis_name_gap=25, yaxis_name="", yaxis_name_pos="middle", + yaxis_rotate=0, + yaxis_min=None, + yaxis_max=None, + yaxis_type=None, + yaxis_interval="auto", + yaxis_force_interval=None, + yaxis_pos=None, + yaxis_label_textsize=12, + yaxis_label_textcolor="#000", + yaxis_formatter="", is_convert=False, - x_axis=None, + is_xaxis_inverse=False, + is_yaxis_inverse=False, + is_xaxislabel_align=False, + is_yaxislabel_align=False, + is_xaxis_boundarygap=True, + is_yaxis_boundarygap=True, + is_xaxis_show=True, + is_yaxis_show=True, + is_splitline_show=True, **kwargs): - """ + """ 直角坐标系中的 x、y 轴(Line、Bar、Scatter、EffectScatter、Kline)。 :param type: - 图例类型 - :param xy_font_size: - x 轴和 y 轴字体大小 - :param namegap: - 坐标轴名称与轴线之间的距离 + 图形类型。 + :param x_axis: + x 轴数据项。 + :param xaxis_margin: + x 轴刻度标签与轴线之间的距离。默认为 8 + :param xaxis_name_size: + x 轴名称体大小,默认为 14 + :param xaxis_name_gap: + x 轴名称与轴线之间的距离,默认为 25 :param xaxis_name: x 轴名称 :param xaxis_name_pos: - x 轴名称位置,有 start,middle,end 可选 - :param interval: - 坐标轴刻度标签的显示间隔,在类目轴中有效 - 默认会采用标签不重叠的策略间隔显示标签 - 可以设置成 0 强制显示所有标签 - 如果设置为 1,表示『隔一个标签显示一个标签』,如果值为 2,表示隔两个标签显示一个标签,以此类推 + x 轴名称位置,有'start','middle','end'可选 + :param xaxis_rotate: + x 轴刻度标签旋转的角度,在类目轴的类目标签显示不下的时候可以通过旋转防止标 + 签之间重叠。默认为 0,即不旋转。旋转的角度从 -90 度到 90 度。 + :param xaxis_min: + x 坐标轴刻度最小值,默认为自适应。使用特殊值 "dataMin" 可自定以数 + 据中最小值为 x 轴最小值。 + :param xaxis_max: + x 坐标轴刻度最大值,默认为自适应。使用特殊值 "dataMax" 可自定以数 + 据中最小值为 x 轴最大值。 + :param xaxis_type: + x 坐标轴类型 + 'value':数值轴,适用于连续数据。 + 'category':类目轴,适用于离散的类目数据。 + 'log':对数轴。适用于对数数据。 + :param xaxis_interval: + x 轴刻度标签的显示间隔,在类目轴中有效。默认会采用标签不重叠的策略间隔显示标签。 + 设置成 0 强制显示所有标签。设置为 1,表示『隔一个标签显示一个标签』, + 如果值为 2,表示隔两个标签显示一个标签,以此类推 + :param xaxis_force_interval: + 强制设置 x 坐标轴分割间隔。如设置为 50 则刻度为 [0, 50, 150, ...],设置为 "auto" + 则只显示两个刻度。一般情况下不建议设置这个参数!! + 因为 splitNumber 是预估的值,实际根据策略计算出来的刻度可能无法达到想要的效果, + 这时候可以使用 interval 配合 min、max 强制设定刻度划分。在类目轴中无效。 + :param xaxis_pos: + x 坐标轴位置,有'top','bottom'可选 + :param xaxis_label_textsize: + x 坐标轴标签字体大小 + :param xaxis_label_textcolor: + x 坐标轴标签字体颜色 + :param yaxis_margin: + y 轴刻度标签与轴线之间的距离。默认为 8 + :param yaxis_name_size: + y 轴名称体大小,默认为 14 + :param yaxis_name_gap: + y 轴名称与轴线之间的距离,默认为 25 :param yaxis_name: y 轴名称 :param yaxis_name_pos: - y 轴名称位置,有 start,middle,end 可选 + y 轴名称位置,有'start', 'middle','end'可选 + :param yaxis_rotate: + y 轴刻度标签旋转的角度,在类目轴的类目标签显示不下的时候可以通过旋转防止标 + 签之间重叠。默认为 0,即不旋转。旋转的角度从 -90 度到 90 度。 + :param yaxis_min: + y 坐标轴刻度最小值,默认为自适应。使用特殊值 "dataMin" 可自定以数 + 据中最小值为 y 轴最小值。 + :param yaxis_max: + y 坐标轴刻度最大值,默认为自适应。使用特殊值 "dataMax" 可自定以数 + 据中最小值为 y 轴最大值。 + :param yaxis_type: + y 坐标轴类型 + 'value':数值轴,适用于连续数据。 + 'category':类目轴,适用于离散的类目数据。 + 'log':对数轴。适用于对数数据。 + :param yaxis_interval: + y 轴刻度标签的显示间隔,在类目轴中有效。默认会采用标签不重叠的策略间隔显示标签。 + 设置成 0 强制显示所有标签。设置为 1,表示『隔一个标签显示一个标签』, + 如果值为 2,表示隔两个标签显示一个标签,以此类推 + :param yaxis_force_interval: + 强制设置 y 坐标轴分割间隔。如设置为 50 则刻度为 [0, 50, 150, ...],设置为 "auto" + 则只显示两个刻度。一般情况下不建议设置这个参数!! + 因为 splitNumber 是预估的值,实际根据策略计算出来的刻度可能无法达到想要的效果, + 这时候可以使用 interval 配合 min、max 强制设定刻度划分。在类目轴中无效。 + :param yaxis_pos: + y 坐标轴位置,有'left','right'可选 + :param yaxis_label_textsize: + y 坐标轴标签字体大小 + :param yaxis_label_textcolor: + y 坐标轴标签字体颜色 + :param yaxis_formatter: + y 轴标签格式器,如 '天',则 y 轴的标签为数据加'天'(3 天,4 天),默认为 "" :param is_convert: 是否交换 x 轴与 y 轴 - :param x_axis: - x 轴数据项 + :param is_xaxis_inverse: + 是否反向 x 坐标轴,默认为 False + :param is_yaxis_inverse: + 是否反向 y 坐标轴,默认为 False + :param is_xaxislabel_align: + x 轴刻度线和标签是否对齐,默认为 False + :param is_yaxislabel_align: + y 轴刻度线和标签是否对齐,默认为 False + :param is_xaxis_boundarygap: + x 轴两边留白策略,适用于类目轴。类目轴中 boundaryGap 可以配置为 True 和 False。 + 默认为 True,这时候刻度只是作为分隔线,标签和数据点都会在两个刻度之间的带(band) + 中间,即两边留白。 + :param is_yaxis_boundarygap: + y 轴两边留白策略,适用于类目轴。类目轴中 boundaryGap 可以配置为 True 和 False。 + 默认为 True,这时候刻度只是作为分隔线,标签和数据点都会在两个刻度之间的带(band) + 中间,即两边留白。 + :param is_xaxis_show: + 是否显示 x 轴 + :param is_yaxis_show: + 是否显示 y 轴 + :param is_splitline_show: + 是否显示 y 轴网格线,默认为 True。 :param kwargs: - :return: """ _xAxis = { "name": xaxis_name, + "show": is_xaxis_show, "nameLocation": xaxis_name_pos, - "nameGap": namegap, - "nameTextStyle": {"fontSize": xy_font_size}, - "axisLabel": {"interval": interval} + "nameGap": xaxis_name_gap, + "nameTextStyle": {"fontSize": xaxis_name_size}, + "axisLabel": { + "interval": xaxis_interval, + "rotate": xaxis_rotate, + "margin": xaxis_margin, + "textStyle": { + "fontSize": xaxis_label_textsize, + "color": xaxis_label_textcolor, + } + }, + "axisTick": { + "alignWithLabel": is_xaxislabel_align + }, + "inverse": is_xaxis_inverse, + "position": xaxis_pos, + "boundaryGap": is_xaxis_boundarygap, + "min": xaxis_min, + "max": xaxis_max } _yAxis = { "name": yaxis_name, + "show": is_yaxis_show, "nameLocation": yaxis_name_pos, - "nameGap": namegap, - "nameTextStyle": {"fontSize": xy_font_size} + "nameGap": yaxis_name_gap, + "nameTextStyle": {"fontSize": yaxis_name_size}, + "axisLabel": { + "formatter": "{value} " + yaxis_formatter, + "rotate": yaxis_rotate, + "interval": yaxis_interval, + "margin": yaxis_margin, + "textStyle": { + "fontSize": yaxis_label_textsize, + "color": yaxis_label_textcolor, + } + }, + "axisTick": { + "alignWithLabel": is_yaxislabel_align + }, + "inverse": is_yaxis_inverse, + "position": yaxis_pos, + "boundaryGap": is_yaxis_boundarygap, + "min": yaxis_min, + "max": yaxis_max, + "splitLine": { + "show": is_splitline_show + } } + + if xaxis_type is None: + xaxis_type = "value" if type == "scatter" else "category" + if yaxis_type is None: + yaxis_type = "value" + if is_convert: - _yAxis.update(data=x_axis, type="category") - _xAxis.update(type="value") + xaxis_type, yaxis_type = yaxis_type, xaxis_type + _xAxis.update(type=xaxis_type) + _yAxis.update(data=x_axis, type=yaxis_type) else: - _xAxis.update(data=x_axis, type="category") - _yAxis.update(type="value") - if type == "scatter": - _xAxis.update(data=x_axis, type="value") - _yAxis.update(type="value") - return _xAxis, _yAxis + _xAxis.update(data=x_axis, type=xaxis_type) + _yAxis.update(type=yaxis_type) + # 强制分割数值轴,在多 x、y 轴中可以使用强制分割使标刻线对齐 + if xaxis_force_interval is not None: + _xAxis.update(interval=xaxis_force_interval) + if yaxis_force_interval is not None: + _yAxis.update(interval=yaxis_force_interval) -def _mark(data): - """ + return [_xAxis], [_yAxis] + + +def _mark(data, + mark_point_symbol='pin', + mark_point_symbolsize=50, + mark_point_textcolor='#fff', + mark_line_symbolsize=10, + mark_line_valuedim="", + mark_line_coords=None, + mark_point_valuedim="", + _is_markline=False, + **kwargs): + """ 图形标记组件,用于标记指定的特殊数据,有标记线和标记点两种 :param data: - 标记数据项,有最小值,最大值,平均值可选 - :return: + 标记点 + 默认有'min', 'max', 'average'可选。支持自定义标记点,具体使用如下 + [ + { + "coord": [a1, b1], + "name": "first markpoint" + }, + { + "coord": [a2, b2], + "name": "second markpoint" + } + ] + 需自己传入标记点字典,共有两个键值对,'coord' 对应为 x y 轴坐标,'name' 为标记点名称 + 标记线 + 只支持默认的 'min', 'max', 'average' + :param mark_point_symbol: + 标记点图形,,默认为'pin',有'circle', 'rect', 'roundRect', 'triangle', + 'diamond', 'pin', 'arrow'可选 + :param mark_point_symbolsize: + 标记点图形大小,默认为 50 + :param mark_point_textcolor: + 标记点字体颜色,默认为'#fff' + :param mark_line_symbolsize: + 标记线图形大小,默认为 15 + :param mark_line_valuedim: + 标记线指定在哪个维度上指定最大值最小值。这可以是维度的直接名称,Line 时可以 + 是 x、angle 等、Kline 图时可以是 open、close、highest、lowest。 + 可同时制定多个维度,如 + mark_line=['min', 'max'], mark_line_valuedim=['lowest', 'highest'] + 则表示 min 使用 lowest 维度,max 使用 highest 维度,以此类推 + :param mark_line_coords: + 标记线指定起点坐标和终点坐标,如 [[10, 10], [30, 30]],两个点分别为横 + 纵坐标轴点。 + :param mark_point_valuedim: + 标记点指定在哪个维度上指定最大值最小值。这可以是维度的直接名称,Line 时可以 + 是 x、angle 等、Kline 图时可以是 open、close、highest、lowest。 + 可同时制定多个维度,如 + mark_point=['min', 'max'], mark_point_valuedim=['lowest', 'highest'] + 则表示 min 使用 lowest 维度,max 使用 highest 维度,以此类推 + :param _is_markline: + 指定是否为 markline """ mark = {"data": []} if data: - for d in list(data): - if "max" in d: - mark.get("data").append({"type": "max", "name": "最大值"}) - elif "min" in d: - mark.get("data").append({"type": "min", "name": "最小值"}) - elif "average" in d: - mark.get("data").append({"type": "average", "name": "平均值"}) + _markpv = _marklv = [None for _ in range(len(data))] + _markpv[: len(mark_point_valuedim)] = mark_point_valuedim + _marklv[: len(mark_line_valuedim)] = mark_line_valuedim + for index, d in enumerate(list(data)): + # 自定义坐标点数据 + if isinstance(d, dict): + _coord = d.get('coord', None) + _pname = d.get('name', None) + _marktmp = { + "coord": _coord, + "name": _pname, + "symbol": mark_point_symbol, + "symbolSize": mark_point_symbolsize, + "label": {"normal": { + "textStyle": {"color": mark_point_textcolor}} + }} + mark.get("data").append(_marktmp) + else: + _type, _name = "", "" + if "max" in d: + _type, _name = "max", "Maximum" + elif "min" in d: + _type, _name = "min", "Minimum" + elif "average" in d: + _type, _name = "average", "mean-Value" + + if _is_markline: + _marktmp = { + "type": _type, + "name": _name, + 'valueDim': _marklv[index], + } + if _type: + mark.get("data").append(_marktmp) + mark.update(symbolSize=mark_line_symbolsize) + else: + _marktmp = { + "type": _type, + "name": _name, + 'valueDim': _markpv[index], + } + _marktmp.update( + symbol=mark_point_symbol, + symbolSize=mark_point_symbolsize, + label={"normal": { + "textStyle": {"color": mark_point_textcolor}} + }) + if _type: + mark.get("data").append(_marktmp) + + if mark_line_coords and len(mark_line_coords) == 2: + return { + "data": [ + [{"coord": mark_line_coords[0]}, + {"coord": mark_line_coords[1]}] + ] + } + return mark @collectfuncs def mark_point(mark_point=None, **kwargs): - """ + """ 标记点配置项 :param mark_point: - 标记点,有最小值,最大值,平均值可选 + 默认有'min', 'max', 'average'可选。支持自定义标记点,具体使用如下 + [ + { + "coord": [a1, b1], + "name": "first markpoint" + }, + { + "coord": [a2, b2], + "name": "second markpoint" + } + ] + 需自己传入标记点字典,共有两个键值对,'coord' 对应为 x y 轴坐标,'name' 为标记点名称 :param kwargs: - :return: """ - return _mark(mark_point) + return _mark(mark_point, **kwargs) @collectfuncs def mark_line(mark_line=None, **kwargs): - """ + """ 标记线配置项 :param mark_line: - 标记线,有最小值,最大值,平均值可选 + 只支持默认的 'min', 'max', 'average' :param kwargs: - :return: """ - - return _mark(mark_line) + return _mark(mark_line, _is_markline=True, **kwargs) @collectfuncs def legend(is_legend_show=True, legend_orient="horizontal", legend_pos="center", + legend_top='top', + legend_selectedmode='multiple', + legend_text_size=12, + legend_text_color='#333', **kwargs): - """ + """ 图例组件。图例组件展现了不同系列的标记(symbol),颜色和名字。 + 可以通过点击图例控制哪些系列不显示。 :param is_legend_show: - 是否显示顶端图例 + 是否显示顶端图例,默认为 True :param legend_orient: - 图例列表的布局朝向,有 horizontal,vertical 可选 + 图例列表的布局朝向,默认为'horizontal',有'horizontal', 'vertical'可选 :param legend_pos: - 图例位置,有 left, center, right 可选 + 图例组件离容器左侧的距离,默认为'center',有'left', 'center', 'right'可选, + 也可以为百分数,如 "%60" + :param legend_top: + 图例组件离容器上侧的距离,默认为'top',有'top', 'center', 'bottom'可选, + 也可以为百分数,如 "%60" + :param legend_selectedmode: + 图例选择的模式,控制是否可以通过点击图例改变系列的显示状态。默认为'multiple', + 可以设成 'single' 或者 'multiple' 使用单选或者多选模式。 + 也可以设置为 False 关闭显示状态。 + :param legend_text_size: + 图例名称字体大小 + :param legend_text_color: + 图例名称字体颜色 :param kwargs: - :return: """ _legend = { + "selectedMode": legend_selectedmode, "show": is_legend_show, "left": legend_pos, - "orient": legend_orient + "top": legend_top, + "orient": legend_orient, + "textStyle": { + "fontSize": legend_text_size, + "color": legend_text_color, + } } return _legend @collectfuncs -def visual_map(visual_range=None, +def visual_map(visual_type='color', + visual_range=None, visual_text_color=None, visual_range_text=None, visual_range_color=None, + visual_range_size=None, + visual_orient='vertical', + visual_pos="left", + visual_top="bottom", + visual_split_number=5, + visual_dimension=None, is_calculable=True, + is_piecewise=False, + pieces=None, **kwargs): - """ + """ 是视觉映射组件,用于进行『视觉编码』,也就是将数据映射到视觉元素(视觉通道) + :param visual_type: + 制定组件映射方式,默认为'color‘,即通过颜色来映射数值。有'color', 'size'可选。 + 'size'通过数值点的大小,也就是图形点的大小来映射数值。 :param visual_range: - 指定组件的允许的最小值与最大值 + 指定组件的允许的最小值与最大值。默认为 [0, 100] :param visual_text_color: - 两端文本颜色 + 两端文本颜色。 :param visual_range_text: - 两端文本 + 两端文本。默认为 ['low', 'hight'] + :param visual_range_size: + 数值映射的范围,也就是图形点大小的范围。默认为 [20, 50] :param visual_range_color: - 过渡的颜色,列表类型 + 过渡颜色。默认为 ['#50a3ba', '#eac763', '#d94e5d'] + :param visual_orient: + visualMap 组件条的方向,默认为'vertical',有'vertical', 'horizontal'可选。 + :param visual_pos: + visualmap 组件条距离左侧的位置,默认为'left'。有'right', 'center', + 'right'可选,也可为百分数或整数。 + :param visual_top: + visualmap 组件条距离顶部的位置,默认为'top'。有'top', 'center', + 'bottom'可选,也可为百分数或整数。 + :param visual_split_number: + 分段型中分割的段数,在设置为分段型时生效。默认分为 5 段。 + :param visual_dimension: + 指定用数据的『哪个维度』,映射到视觉元素上。默认映射到最后一个维度。索引从 0 开始。 + 在直角坐标系中,x 轴为第一个维度(0),y 轴为第二个维度(1)。 :param is_calculable: - 是否显示拖拽用的手柄(手柄能拖拽调整选中范围) + 是否显示拖拽用的手柄(手柄能拖拽调整选中范围)。默认为 True + :param is_piecewise: + 是否将组件转换为分段型(默认为连续型),默认为 False + :param pieces: + 自定义『分段式视觉映射组件(visualMapPiecewise)』的每一段的范围, + 以及每一段的文字,以及每一段的特别的样式(仅在 is_piecewise 为 True + 时生效)。例如: + pieces: [ + {min: 1500}, // 不指定 max,表示 max 为无限大(Infinity)。 + {min: 900, max: 1500}, + {min: 310, max: 1000}, + {min: 200, max: 300}, + {min: 10, max: 200, label: '10 到 200(自定义label)'}, + // 表示 value 等于 123 的情况。 + {value: 123, label: '123(自定义特殊颜色)', color: 'grey'} + {max: 5} // 不指定 min,表示 min 为无限大(-Infinity)。 + ] :param kwargs: - :return: """ - # 组件允许的最大值最小值默认为 [0,100] _min, _max = 0, 100 if visual_range: if len(visual_range) == 2: _min, _max = visual_range - # 两端文本默认值为 ['low','hight'] - _tlow, _thight = "low", "hight" + + _tlow, _thigh = "low", "high" if visual_range_text: if len(visual_range_text) == 2: - _tlow, _thight = visual_range_text - # 过渡颜色默认为 ['#50a3ba', '#eac763', '#d94e5d'] - inrange = ['#50a3ba', '#eac763', '#d94e5d'] - if visual_range_color: - if len(visual_range_color) >= 2: - inrange = visual_range_color + _tlow, _thigh = visual_range_text + + _inrange_op = {} + if visual_type == 'color': + range_color = ['#50a3ba', '#eac763', '#d94e5d'] + if visual_range_color: + if len(visual_range_color) >= 2: + range_color = visual_range_color + _inrange_op.update(color=range_color) + + if visual_type == 'size': + range_size = [20, 50] + if visual_range_size: + if len(visual_range_size) >= 2: + range_size = visual_range_size + _inrange_op.update(symbolSize=range_size) + + _type = "piecewise" if is_piecewise else "continuous" _visual_map = { - "type": "continuous", + "type": _type, "min": _min, "max": _max, - "text": [_thight, _tlow], + "text": [_thigh, _tlow], "textStyle": {"color": visual_text_color}, - "inRange": {"color": inrange}, + "inRange": _inrange_op, "calculable": is_calculable, - "left": "left", - "top": "bottom" + "splitNumber": visual_split_number, + "dimension": visual_dimension, + "orient": visual_orient, + "left": visual_pos, + "top": visual_top, + "showLabel": True, } + if is_piecewise: + _visual_map.update(pieces=pieces) return _visual_map def gen_color(): - """ 随机生成颜色,用于词云图 - - :return: + """ 为词云图生成随机颜色 """ return "rgb(%s,%s,%s)" % (random.randint(0, 160), random.randint(0, 160), @@ -385,15 +773,15 @@ def symbol(type=None, symbol="", **kwargs): """ :param symbol: - 标记类型 + 标记类型, 有'rect', 'roundRect', 'triangle', 'diamond', + 'pin', 'arrow'可选 :param kwargs: - :return: """ if symbol is None: # Radar symbol = 'none' elif type == "line" and symbol == "": # Line symbol = "emptyCircle" - elif symbol not in ('rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow'): + elif symbol not in SYMBOLS: symbol = 'circle' return symbol @@ -403,30 +791,396 @@ def effect(effect_brushtype="stroke", effect_scale=2.5, effect_period=4, **kwargs): - """ + """ 涟漪动画配置项 :param effect_brushtype: - 波纹绘制方式,有 stroke/fill 可选 + 波纹绘制方式,有'stroke', 'fill'可选。默认为'stroke' :param effect_scale: - 动画中波纹的最大缩放比例 + 动画中波纹的最大缩放比例。默认为 2.5 :param effect_period: - 动画持续的时间 + 动画持续的时间。默认为 4(s) :param kwargs: - :return: """ _effect = { "brushType": effect_brushtype, "scale": effect_scale, - "period":effect_period + "period": effect_period } return _effect -def get_all_options(**kwargs): - """ 返回所有配置项 +@collectfuncs +def datazoom(is_datazoom_show=False, + datazoom_type='slider', + datazoom_range=None, + datazoom_orient='horizontal', + datazoom_xaxis_index=None, + datazoom_yaxis_index=None, + **kwargs): + """ dataZoom 组件 用于区域缩放,从而能自由关注细节的数据信息,或者概览数据整 + 体,或者去除离群点的影响。 + :param is_datazoom_show: + 是否使用区域缩放组件,默认为 False + :param datazoom_type: + 区域缩放组件类型,默认为'slider',有'slider', 'inside', 'both'可选 + :param datazoom_range: + 区域缩放的范围,默认为[50, 100] + :param datazoom_orient: + datazoom 组件在直角坐标系中的方向,默认为 'horizontal',效果显示在 x 轴。 + 如若设置为 'vertical' 的话效果显示在 y 轴。 + :param datazoom_xaxis_index: + datazoom 组件控制的 x 轴索引 + 默认控制第一个 x 轴,如没特殊需求无须显示指定。单个为 int 类型而控制多个为 list + 类型,如 [0, 1] 表示控制第一个和第二个 x 轴。 + :param datazoom_yaxis_index: + datazoom 组件控制的 y 轴索引 + 默认控制第一个 y 轴,如没特殊需求无须显示指定。单个为 int 类型而控制多个为 list + 类型,如 [0, 1] 表示控制第一个和第二个 x 轴。 :param kwargs: - :return: + """ + _min, _max = 50, 100 + if datazoom_range: + if len(datazoom_range) == 2: + _min, _max = datazoom_range + if datazoom_type not in ("slider", "inside", "both"): + datazoom_type = "slider" + _datazoom = [] + _datazoom_config = { + "show": is_datazoom_show, + "type": "slider", + "start": _min, + "end": _max, + "orient": datazoom_orient, + "xAxisIndex": datazoom_xaxis_index, + "yAxisIndex": datazoom_yaxis_index + } + if datazoom_type == "both": + _datazoom.append(_datazoom_config.copy()) + datazoom_type = 'inside' + _datazoom_config['type'] = datazoom_type + _datazoom.append(_datazoom_config) + return _datazoom + + +@collectfuncs +def grid(grid_width=None, + grid_height=None, + grid_top=None, + grid_bottom=None, + grid_left=None, + grid_right=None, + **kwargs): + """ Grid 类组件配置项 + + :param grid_width: + grid 组件的宽度。默认自适应。 + :param grid_height: + grid 组件的高度。默认自适应。 + :param grid_top: + grid 组件离容器顶部的距离。默认为 None, 有'top', 'center', 'middle'可选, + 也可以为百分数或者整数 + :param grid_bottom: + grid 组件离容器底部的距离。默认为 None, 有'top', 'center', 'middle'可选, + 也可以为百分数或者整数 + :param grid_left: + grid 组件离容器左侧的距离。默认为 None, 有'left', 'center', 'right'可选, + 也可以为百分数或者整数 + :param grid_right: + grid 组件离容器右侧的距离。默认为 None, 有'left', 'center', 'right'可选 + 也可以为百分数或者整数 + """ + _grid = {} + if grid_width is not None: + _grid.update(width=grid_width) + if grid_height is not None: + _grid.update(height=grid_height) + if grid_top is not None: + _grid.update(top=grid_top) + if grid_bottom is not None: + _grid.update(bottom=grid_bottom) + if grid_left is not None: + _grid.update(left=grid_left) + if grid_right is not None: + _grid.update(right=grid_right) + return _grid + + +@collectfuncs +def grid3D(grid3d_width=100, + grid3d_height=100, + grid3d_depth=100, + grid3d_rotate_speed=10, + grid3d_rotate_sensitivity=1, + is_grid3d_rotate=False, + **kwargs): + """ 3D 笛卡尔坐标系组配置项,适用于 3D 图形。 + + :param grid3d_width: + 三维笛卡尔坐标系组件在三维场景中的高度。默认为 100 + :param grid3d_height: + 三维笛卡尔坐标系组件在三维场景中的高度。默认为 100 + :param grid3d_depth: + 三维笛卡尔坐标系组件在三维场景中的高度。默认为 100 + :param grid3d_rotate_speed: + 物体自传的速度。单位为角度 / 秒,默认为 10 ,也就是 36 秒转一圈。 + :param is_grid3d_rotate: + 是否开启视角绕物体的自动旋转查看。默认为 False + :param grid3d_rotate_sensitivity: + 旋转操作的灵敏度,值越大越灵敏。默认为 1, 设置为 0 后无法旋转。 + :param kwargs: + """ + _grid3D = { + "boxWidth": grid3d_width, + "boxHeight": grid3d_height, + "boxDepth": grid3d_depth, + "viewControl": { + "autoRotate": is_grid3d_rotate, + "autoRotateSpeed": grid3d_rotate_speed, + "rotateSensitivity": grid3d_rotate_sensitivity + } + } + return _grid3D + + +@collectfuncs +def xaxis3D(xaxis3d_type=None, + xaxis3d_name="", + xaxis3d_name_size=16, + xaxis3d_name_gap=20, + xaxis3d_min=None, + xaxis3d_max=None, + xaxis3d_interval="auto", + xaxis3d_margin=8, + **kwargs): + """ 3D x 轴配置项 + + :param xaxis3d_type: + 3D x 轴类型 + :param xaxis3d_name: + x 轴名称,默认为 "" + :param xaxis3d_name_size: + x 轴名称体大小,默认为 16 + :param xaxis3d_name_gap: + x 轴名称与轴线之间的距离,默认为 25 + :param xaxis3d_min: + x 坐标轴刻度最小值,默认为自适应。 + :param xaxis3d_max: + x 坐标轴刻度最大值,默认为自适应。 + :param xaxis3d_interval: + x 轴刻度标签的显示间隔,在类目轴中有效。默认会采用标签不重叠的策略间隔显示标签。 + 设置成 0 强制显示所有标签。设置为 1,表示『隔一个标签显示一个标签』,如果值 + 为 2,表示隔两个标签显示一个标签,以此类推 + :param xaxis3d_margin: + x 轴刻度标签与轴线之间的距离。默认为 8 + """ + _xaxis3D = { + "name": xaxis3d_name, + "nameGap": xaxis3d_name_gap, + "nameTextStyle": {"fontSize": xaxis3d_name_size}, + "type": xaxis3d_type, + "min": xaxis3d_min, + "max": xaxis3d_max, + "axisLabel": { + "margin": xaxis3d_margin, + "interval": xaxis3d_interval + } + } + return _xaxis3D + + +@collectfuncs +def yaxis3D(yaxis3d_type=None, + yaxis3d_name="", + yaxis3d_name_size=16, + yaxis3d_name_gap=20, + yaxis3d_min=None, + yaxis3d_max=None, + yaxis3d_interval="auto", + yaxis3d_margin=8, + **kwargs): + """ 3D y 轴配置项 + + :param yaxis3d_type: + 3D x 轴类型 + :param yaxis3d_name: + y 轴名称,默认为 "" + :param yaxis3d_name_size: + y 轴名称体大小,默认为 16 + :param yaxis3d_name_gap: + y 轴名称与轴线之间的距离,默认为 25 + :param yaxis3d_min: + y 坐标轴刻度最小值,默认为自适应。 + :param yaxis3d_max: + y 坐标轴刻度最大值,默认为自适应。 + :param yaxis3d_interval: + y 轴刻度标签的显示间隔,在类目轴中有效。默认会采用标签不重叠的策略间隔显示标签。 + 设置成 0 强制显示所有标签。设置为 1,表示『隔一个标签显示一个标签』,如果值 + 为 2,表示隔两个标签显示一个标签,以此类推 + :param yaxis3d_margin: + y 轴刻度标签与轴线之间的距离。默认为 8 + """ + _yaxis3D = { + "name": yaxis3d_name, + "nameGap": yaxis3d_name_gap, + "nameTextStyle": {"fontSize": yaxis3d_name_size}, + "type": yaxis3d_type, + "min": yaxis3d_min, + "max": yaxis3d_max, + "axisLabel": { + "margin": yaxis3d_margin, + "interval": yaxis3d_interval + } + } + return _yaxis3D + + +@collectfuncs +def zaxis3D(zaxis3d_type=None, + zaxis3d_name="", + zaxis3d_name_size=16, + zaxis3d_name_gap=20, + zaxis3d_min=None, + zaxis3d_max=None, + zaxis3d_margin=8, + **kwargs): + """ 3D y 轴配置项 + + :param zaxis3d_type: + 3D y 轴类型 + :param zaxis3d_name: + z 轴名称,默认为 "" + :param zaxis3d_name_size: + z 轴名称体大小,默认为 16 + :param zaxis3d_name_gap: + z 轴名称与轴线之间的距离,默认为 25 + :param zaxis3d_min: + z 坐标轴刻度最小值,默认为自适应。 + :param zaxis3d_max: + z 坐标轴刻度最大值,默认为自适应。 + :param zaxis3d_margin: + z 轴刻度标签与轴线之间的距离。默认为 8 + """ + _zaxis3D = { + "name": zaxis3d_name, + "nameGap": zaxis3d_name_gap, + "nameTextStyle": {"fontSize": zaxis3d_name_size}, + "type": zaxis3d_type, + "min": zaxis3d_min, + "max": zaxis3d_max, + "axisLabel": { + "margin": zaxis3d_margin, + } + } + return _zaxis3D + + +@collectfuncs +def tooltip(type=None, + tooltip_tragger="item", + tooltip_tragger_on="mousemove|click", + tooltip_axispointer_type="line", + tooltip_formatter=None, + tooltip_text_color="#fff", + tooltip_font_size=14, + tooltip_background_color="rgba(50,50,50,0.7)", + tooltip_border_color="#333", + tooltip_border_width=0, + **kwargs): + """ 提示框组件,用于移动或点击鼠标时弹出数据内容 + + :param type: + 图形类型 + :param tooltip_tragger: + 触发类型。默认为 'item' + 'item': 数据项图形触发,主要在散点图,饼图等无类目轴的图表中使用。 + 'axis': 坐标轴触发,主要在柱状图,折线图等会使用类目轴的图表中使用。 + 'none': 什么都不触发。 + :param tooltip_tragger_on: + 提示框触发的条件。默认为 "mousemove|click" + 'mousemove': 鼠标移动时触发。 + 'click': 鼠标点击时触发。 + 'mousemove|click': 同时鼠标移动和点击时触发。 + 'none': 不在 'mousemove' 或 'click' 时触发 + :param tooltip_axispointer_type: + 指示器类型。默认为 "line" + 'line': 直线指示器 + 'shadow': 阴影指示器 + 'cross': 十字准星指示器。其实是种简写,表示启用两个正交的轴的 axisPointer。 + :param tooltip_formatter: + 模板变量有 {a}, {b},{c},{d},{e},分别表示系列名,数据名,数据值等。 + 使用示例,如 label_formatter='{a}' + 在 trigger 为 'axis' 的时候,会有多个系列的数据,此时可以通过 {a0}, {a1}, {a2} + 这种后面加索引的方式表示系列的索引。不同图表类型下的 {a},{b},{c},{d} 含义不一样。 + 其中变量 {a}, {b}, {c}, {d} 在不同图表类型下代表数据含义为: + 折线(区域)图、柱状(条形)图、K线图 : + {a}(系列名称),{b}(类目值),{c}(数值), {d}(无) + 散点图(气泡)图 : + {a}(系列名称),{b}(数据名称),{c}(数值数组), {d}(无) + 地图 : + {a}(系列名称),{b}(区域名称),{c}(合并数值), {d}(无) + 饼图、仪表盘、漏斗图: + {a}(系列名称),{b}(数据项名称),{c}(数值), {d}(百分比) + :param tooltip_text_color: + 提示框字体颜色,默认为 '#fff' + :param tooltip_font_size: + 提示框字体大小,默认为 14 + :param tooltip_background_color: + 提示框浮层的背景颜色。默认为 "rgba(50,50,50,0.7)" + :param tooltip_border_color: + 提示框浮层的边框颜色。默认为 "#333" + :param tooltip_border_width: + 提示框浮层的边框宽。默认为 0 + """ + if tooltip_formatter is None: + if type == "gauge": + tooltip_formatter = "{a} <br/>{b} : {c}%" + elif type == "geo": + tooltip_formatter = "{b}: {c}" + + _tooltip = { + "trigger": tooltip_tragger, + "triggerOn": tooltip_tragger_on, + "axisPointer": {"type": tooltip_axispointer_type}, + "formatter": tooltip_formatter, + "textStyle": { + "color": tooltip_text_color, + "fontSize": tooltip_font_size + }, + "backgroundColor": tooltip_background_color, + "borderColor": tooltip_border_color, + "borderWidth": tooltip_border_width + } + return _tooltip + + +@collectfuncs +def calendar(calendar_date_range=None, + calendar_cell_size=None, + **kwargs): + """ + + :param calendar_date_range: + 日历热力图的日期, "2016" 表示 2016 年, ["2016-5-5", "2017-5-5"] + 表示 2016 年 5 月 5 日至 2017 年 5 月 5 日 + :param calendar_cell_size: + 日历每格框的大小,可设置单值 或数组 第一个元素是宽 第二个元素是高,支持 + 设置自适应 "auto"。默认为 ["auto", 20] + :param kwargs: + """ + + if calendar_cell_size is None: + calendar_cell_size = ['auto', 20] + + _calendar = { + "range": calendar_date_range, + "cellSize": calendar_cell_size + } + return _calendar + + +def get_all_options(**kwargs): + """ 返回图形实例的所有配置项 """ _funcs = {} for f in fs: diff --git a/pyecharts/style.py b/pyecharts/style.py new file mode 100644 index 000000000..f3f6a16e4 --- /dev/null +++ b/pyecharts/style.py @@ -0,0 +1,28 @@ +# coding=utf-8 + +from pyecharts.chart import Chart + + +class Style(Chart): + """ + `Style`类可用于简化配置项编写,可用于在同一个图或者多个图内保持统一的风格 + """ + def __init__(self, title="", subtitle="", **kwargs): + super(Style, self).__init__(title, subtitle, **kwargs) + self._add_style = None + self.init_style = {} + for key in kwargs: + value = kwargs.get(key) + if value is not None: + self.init_style.update({key: value}) + + def add(self, **kwargs): + self._add_style = {} + return self.__add(**kwargs) + + def __add(self, **kwargs): + for key in kwargs: + value = kwargs.get(key) + if value is not None: + self._add_style.update({key: value}) + return self._add_style diff --git a/pyecharts/templates/notebook.html b/pyecharts/templates/notebook.html new file mode 100644 index 000000000..52b889da2 --- /dev/null +++ b/pyecharts/templates/notebook.html @@ -0,0 +1,17 @@ +<script> + require.config({ + paths: { + {{ config_items | join(', ') }} + } + }); +</script> +{% for chart in charts %} + {{ echarts_container(chart) }} +{% endfor %} + + +<script> + require([{{ libraries | join(', ') }}], function(echarts) { + {{ echarts_js_content_wrap(*charts) }} + }); +</script> diff --git a/pyecharts/templates/simple_chart.html b/pyecharts/templates/simple_chart.html new file mode 100644 index 000000000..cdcf4a9b6 --- /dev/null +++ b/pyecharts/templates/simple_chart.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="UTF-8"> + <title>{{ chart.page_title }} + {{ echarts_js_dependencies(chart) }} + + + {{ echarts_container(chart) }} + {{ echarts_js_content(chart) }} + + \ No newline at end of file diff --git a/pyecharts/templates/simple_page.html b/pyecharts/templates/simple_page.html new file mode 100644 index 000000000..85118962d --- /dev/null +++ b/pyecharts/templates/simple_page.html @@ -0,0 +1,14 @@ + + + + + {{ page.page_title }} + {{ echarts_js_dependencies(page) }} + + +{% for chart in page %} + {{ echarts_container(chart) }} +{% endfor %} +{{ echarts_js_content(*page) }} + + \ No newline at end of file diff --git a/pyecharts/temple.py b/pyecharts/temple.py deleted file mode 100644 index 79e1b7780..000000000 --- a/pyecharts/temple.py +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#coding=utf-8 - -_temple = """ - - - - - - ECharts - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -""" - -_temple_wd = """ - - - - - - ECharts - - - - - - - - -
-
- - - - -""" - -temple = """ - - - - - - ECharts - - - - - - - -
- - - - -""" \ No newline at end of file diff --git a/pyecharts/utils.py b/pyecharts/utils.py new file mode 100644 index 000000000..62162cc3c --- /dev/null +++ b/pyecharts/utils.py @@ -0,0 +1,106 @@ +# coding=utf-8 +from __future__ import unicode_literals + +import codecs +import datetime +import os +import json + + +def get_resource_dir(*paths): + """ + + :param path: + :return: + """ + current_path = os.path.dirname(__file__) + resource_path = os.path.join(current_path, *paths) + return resource_path + + +def write_utf8_html_file(file_name, html_content): + """ + + :param file_name: + :param html_content: + :return: + """ + with codecs.open(file_name, 'w+', encoding='utf-8') as f: + f.write(html_content) + + +class UnknownTypeEncoder(json.JSONEncoder): + """ + UnknownTypeEncoder`类用于处理数据的编码,使其能够被正常的序列化 + """ + + def default(self, obj): + if isinstance(obj, (datetime.datetime, datetime.date)): + return obj.isoformat() + else: + # Pandas and Numpy lists + try: + return obj.astype(float).tolist() + except Exception: + try: + return obj.astype(str).tolist() + except Exception: + return json.JSONEncoder.default(self, obj) + + +def json_dumps(data, indent=0): + """ json 序列化编码处理 + + :param data: 字典数据 + :param indent: 缩进量 + """ + return json.dumps(data, indent=indent, cls=UnknownTypeEncoder) + + +def to_css_length(x): + """ + Return the standard length string of css. + It's compatible with number values in old versions. + + :param x: + :return: + """ + if isinstance(x, (int, float)): + return '{}px'.format(x) + else: + return x + + +def merge_js_dependencies(*chart_or_name_list): + """ + Merge multiple dependencies to a total list. + This will ensure the order and unique in the items. + + :param chart_or_name_list: + :return: A list containing dependency items. + """ + front_must_items = ['echarts'] # items which must be included. + front_optional_items = ['echartsgl'] + dependencies = [] + fist_items = set() + + def _add(_items): + if _items in front_must_items: + pass + elif _items in front_optional_items: + fist_items.add(_items) + elif _items not in dependencies: + dependencies.append(_items) + + for d in chart_or_name_list: + if hasattr(d, 'js_dependencies'): + for x in d.js_dependencies: + _add(x) + elif isinstance(d, (list, tuple, set)): + for x in d: + _add(x) + else: + _add(d) + # items which should be included in front part. + fol = [x for x in front_optional_items if x in fist_items] + return front_must_items + fol + dependencies diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..ef6507766 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +jinja2>=2.8 +future +pillow +lml>=0.0.2 +jupyter-echarts-pypkg>=0.1.0 diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 000000000..2a9acf13d --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[bdist_wheel] +universal = 1 diff --git a/setup.py b/setup.py index 0bb40653d..71c456ae9 100644 --- a/setup.py +++ b/setup.py @@ -1,22 +1,43 @@ +# coding=utf-8 +import os +from setuptools import setup, find_packages -try: - from setuptools import setup -except ImportError: - from distutils.core import setup -import pyecharts.__version__ as about +__title__ = 'pyecharts' +__description__ = 'Python echarts, make charting easier' +__url__ = 'https://github.com/chenjiandongx/pyecharts' +__author_email__ = 'chenjiandongx@qq.com' +__license__ = 'MIT' + +__requires__ = ['pillow', + 'jinja2', + 'future', + 'jupyter-echarts-pypkg==0.1.0', + 'lml==0.0.2'] + +__keywords__ = ['Echarts', + 'charts', + 'plotting-tool'] + +# Load the package's _version.py module as a dictionary. +here = os.path.abspath(os.path.dirname(__file__)) +about = {} +with open(os.path.join(here, __title__, '_version.py')) as f: + exec(f.read(), about) setup( - name=about.__title__, - version=about.__version__, - description=about.__description__, - url=about.__url__, - author=about.__author__, - author_email=about.__author_email__, - license=about.__license__, - packages=about.__packages__, - keywords=about.__keywords__, - install_requires=about.__requires__, + name=__title__, + version=about['__version__'], + description=__description__, + url=__url__, + author=about['__author__'], + author_email=__author_email__, + license=__license__, + packages=find_packages(exclude=('test',)), + keywords=__keywords__, + install_requires=__requires__, + zip_safe=False, + include_package_data=True, classifiers=[ 'Development Status :: 4 - Beta', 'Environment :: Console', @@ -33,4 +54,4 @@ 'Programming Language :: Python :: 3.6', 'Topic :: Software Development :: Libraries' ] -) \ No newline at end of file +) diff --git a/test.sh b/test.sh new file mode 100644 index 000000000..8588254b6 --- /dev/null +++ b/test.sh @@ -0,0 +1,2 @@ +cd test +nosetests --with-coverage --cover-package pyecharts --cover-package test && cd .. && flake8 --exclude docs --builtins=unicode,xrange,long diff --git a/test/constants.py b/test/constants.py new file mode 100644 index 000000000..7f168730f --- /dev/null +++ b/test/constants.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals + +RANGE_COLOR = [ + '#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', + '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026' + ] + +X_TIME = [ + "12a", "1a", "2a", "3a", "4a", "5a", "6a", "7a", "8a", "9a", "10a", "11a", + "12p", "1p", "2p", "3p", "4p", "5p", "6p", "7p", "8p", "9p", "10p", "11p" + ] + +Y_WEEK = [ + "Saturday", "Friday", "Thursday", "Wednesday", + "Tuesday", "Monday", "Sunday" + ] + +CLOTHES = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] + +WEEK = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] diff --git a/test/fixtures/energy.json b/test/fixtures/energy.json new file mode 100644 index 000000000..1732724f7 --- /dev/null +++ b/test/fixtures/energy.json @@ -0,0 +1,488 @@ +{ + "nodes": [{ + "name": "Agricultural 'waste'" + }, + { + "name": "Bio-conversion" + }, + { + "name": "Liquid" + }, + { + "name": "Losses" + }, + { + "name": "Solid" + }, + { + "name": "Gas" + }, + { + "name": "Biofuel imports" + }, + { + "name": "Biomass imports" + }, + { + "name": "Coal imports" + }, + { + "name": "Coal" + }, + { + "name": "Coal reserves" + }, + { + "name": "District heating" + }, + { + "name": "Industry" + }, + { + "name": "Heating and cooling - commercial" + }, + { + "name": "Heating and cooling - homes" + }, + { + "name": "Electricity grid" + }, + { + "name": "Over generation / exports" + }, + { + "name": "H2 conversion" + }, + { + "name": "Road transport" + }, + { + "name": "Agriculture" + }, + { + "name": "Rail transport" + }, + { + "name": "Lighting & appliances - commercial" + }, + { + "name": "Lighting & appliances - homes" + }, + { + "name": "Gas imports" + }, + { + "name": "Ngas" + }, + { + "name": "Gas reserves" + }, + { + "name": "Thermal generation" + }, + { + "name": "Geothermal" + }, + { + "name": "H2" + }, + { + "name": "Hydro" + }, + { + "name": "International shipping" + }, + { + "name": "Domestic aviation" + }, + { + "name": "International aviation" + }, + { + "name": "National navigation" + }, + { + "name": "Marine algae" + }, + { + "name": "Nuclear" + }, + { + "name": "Oil imports" + }, + { + "name": "Oil" + }, + { + "name": "Oil reserves" + }, + { + "name": "Other waste" + }, + { + "name": "Pumped heat" + }, + { + "name": "Solar PV" + }, + { + "name": "Solar Thermal" + }, + { + "name": "Solar" + }, + { + "name": "Tidal" + }, + { + "name": "UK land based bioenergy" + }, + { + "name": "Wave" + }, + { + "name": "Wind" + } + ], + "links": [{ + "source": "Agricultural 'waste'", + "target": "Bio-conversion", + "value": 124.729 + }, + { + "source": "Bio-conversion", + "target": "Liquid", + "value": 0.597 + }, + { + "source": "Bio-conversion", + "target": "Losses", + "value": 26.862 + }, + { + "source": "Bio-conversion", + "target": "Solid", + "value": 280.322 + }, + { + "source": "Bio-conversion", + "target": "Gas", + "value": 81.144 + }, + { + "source": "Biofuel imports", + "target": "Liquid", + "value": 35 + }, + { + "source": "Biomass imports", + "target": "Solid", + "value": 35 + }, + { + "source": "Coal imports", + "target": "Coal", + "value": 11.606 + }, + { + "source": "Coal reserves", + "target": "Coal", + "value": 63.965 + }, + { + "source": "Coal", + "target": "Solid", + "value": 75.571 + }, + { + "source": "District heating", + "target": "Industry", + "value": 10.639 + }, + { + "source": "District heating", + "target": "Heating and cooling - commercial", + "value": 22.505 + }, + { + "source": "District heating", + "target": "Heating and cooling - homes", + "value": 46.184 + }, + { + "source": "Electricity grid", + "target": "Over generation / exports", + "value": 104.453 + }, + { + "source": "Electricity grid", + "target": "Heating and cooling - homes", + "value": 113.726 + }, + { + "source": "Electricity grid", + "target": "H2 conversion", + "value": 27.14 + }, + { + "source": "Electricity grid", + "target": "Industry", + "value": 342.165 + }, + { + "source": "Electricity grid", + "target": "Road transport", + "value": 37.797 + }, + { + "source": "Electricity grid", + "target": "Agriculture", + "value": 4.412 + }, + { + "source": "Electricity grid", + "target": "Heating and cooling - commercial", + "value": 40.858 + }, + { + "source": "Electricity grid", + "target": "Losses", + "value": 56.691 + }, + { + "source": "Electricity grid", + "target": "Rail transport", + "value": 7.863 + }, + { + "source": "Electricity grid", + "target": "Lighting & appliances - commercial", + "value": 90.008 + }, + { + "source": "Electricity grid", + "target": "Lighting & appliances - homes", + "value": 93.494 + }, + { + "source": "Gas imports", + "target": "Ngas", + "value": 40.719 + }, + { + "source": "Gas reserves", + "target": "Ngas", + "value": 82.233 + }, + { + "source": "Gas", + "target": "Heating and cooling - commercial", + "value": 0.129 + }, + { + "source": "Gas", + "target": "Losses", + "value": 1.401 + }, + { + "source": "Gas", + "target": "Thermal generation", + "value": 151.891 + }, + { + "source": "Gas", + "target": "Agriculture", + "value": 2.096 + }, + { + "source": "Gas", + "target": "Industry", + "value": 48.58 + }, + { + "source": "Geothermal", + "target": "Electricity grid", + "value": 7.013 + }, + { + "source": "H2 conversion", + "target": "H2", + "value": 20.897 + }, + { + "source": "H2 conversion", + "target": "Losses", + "value": 6.242 + }, + { + "source": "H2", + "target": "Road transport", + "value": 20.897 + }, + { + "source": "Hydro", + "target": "Electricity grid", + "value": 6.995 + }, + { + "source": "Liquid", + "target": "Industry", + "value": 121.066 + }, + { + "source": "Liquid", + "target": "International shipping", + "value": 128.69 + }, + { + "source": "Liquid", + "target": "Road transport", + "value": 135.835 + }, + { + "source": "Liquid", + "target": "Domestic aviation", + "value": 14.458 + }, + { + "source": "Liquid", + "target": "International aviation", + "value": 206.267 + }, + { + "source": "Liquid", + "target": "Agriculture", + "value": 3.64 + }, + { + "source": "Liquid", + "target": "National navigation", + "value": 33.218 + }, + { + "source": "Liquid", + "target": "Rail transport", + "value": 4.413 + }, + { + "source": "Marine algae", + "target": "Bio-conversion", + "value": 4.375 + }, + { + "source": "Ngas", + "target": "Gas", + "value": 122.952 + }, + { + "source": "Nuclear", + "target": "Thermal generation", + "value": 839.978 + }, + { + "source": "Oil imports", + "target": "Oil", + "value": 504.287 + }, + { + "source": "Oil reserves", + "target": "Oil", + "value": 107.703 + }, + { + "source": "Oil", + "target": "Liquid", + "value": 611.99 + }, + { + "source": "Other waste", + "target": "Solid", + "value": 56.587 + }, + { + "source": "Other waste", + "target": "Bio-conversion", + "value": 77.81 + }, + { + "source": "Pumped heat", + "target": "Heating and cooling - homes", + "value": 193.026 + }, + { + "source": "Pumped heat", + "target": "Heating and cooling - commercial", + "value": 70.672 + }, + { + "source": "Solar PV", + "target": "Electricity grid", + "value": 59.901 + }, + { + "source": "Solar Thermal", + "target": "Heating and cooling - homes", + "value": 19.263 + }, + { + "source": "Solar", + "target": "Solar Thermal", + "value": 19.263 + }, + { + "source": "Solar", + "target": "Solar PV", + "value": 59.901 + }, + { + "source": "Solid", + "target": "Agriculture", + "value": 0.882 + }, + { + "source": "Solid", + "target": "Thermal generation", + "value": 400.12 + }, + { + "source": "Solid", + "target": "Industry", + "value": 46.477 + }, + { + "source": "Thermal generation", + "target": "Electricity grid", + "value": 525.531 + }, + { + "source": "Thermal generation", + "target": "Losses", + "value": 787.129 + }, + { + "source": "Thermal generation", + "target": "District heating", + "value": 79.329 + }, + { + "source": "Tidal", + "target": "Electricity grid", + "value": 9.452 + }, + { + "source": "UK land based bioenergy", + "target": "Bio-conversion", + "value": 182.01 + }, + { + "source": "Wave", + "target": "Electricity grid", + "value": 19.013 + }, + { + "source": "Wind", + "target": "Electricity grid", + "value": 289.366 + } + ] +} \ No newline at end of file diff --git a/test/fixtures/registry.json b/test/fixtures/registry.json new file mode 100644 index 000000000..d43a3fb7f --- /dev/null +++ b/test/fixtures/registry.json @@ -0,0 +1,12 @@ +{ + "JUPYTER_URL": "/nbextensions/test-js", + "GITHUB_URL": "https://your.github.io/test-js/test-js", + "JUPYTER_ENTRY": "test-js/index", + "JS_FOLDER": "test-js", + "PINYIN_MAP": { + "Chinese": "pinyin" + }, + "FILE_MAP": { + "pinyin": "the_js_file_name" + } +} diff --git a/test/fixtures/treemap.json b/test/fixtures/treemap.json new file mode 100644 index 000000000..18cd22a1f --- /dev/null +++ b/test/fixtures/treemap.json @@ -0,0 +1,21035 @@ +[ + { + "value": 40, + "name": "Accessibility", + "path": "Accessibility" + }, + { + "value": 180, + "name": "Accounts", + "path": "Accounts", + "children": [ + { + "value": 76, + "name": "Access", + "path": "Accounts/Access", + "children": [ + { + "value": 12, + "name": "DefaultAccessPlugin.bundle", + "path": "Accounts/Access/DefaultAccessPlugin.bundle" + }, + { + "value": 28, + "name": "FacebookAccessPlugin.bundle", + "path": "Accounts/Access/FacebookAccessPlugin.bundle" + }, + { + "value": 20, + "name": "LinkedInAccessPlugin.bundle", + "path": "Accounts/Access/LinkedInAccessPlugin.bundle" + }, + { + "value": 16, + "name": "TencentWeiboAccessPlugin.bundle", + "path": "Accounts/Access/TencentWeiboAccessPlugin.bundle" + } + ] + }, + { + "value": 92, + "name": "Authentication", + "path": "Accounts/Authentication", + "children": [ + { + "value": 24, + "name": "FacebookAuthenticationPlugin.bundle", + "path": "Accounts/Authentication/FacebookAuthenticationPlugin.bundle" + }, + { + "value": 16, + "name": "LinkedInAuthenticationPlugin.bundle", + "path": "Accounts/Authentication/LinkedInAuthenticationPlugin.bundle" + }, + { + "value": 20, + "name": "TencentWeiboAuthenticationPlugin.bundle", + "path": "Accounts/Authentication/TencentWeiboAuthenticationPlugin.bundle" + }, + { + "value": 16, + "name": "TwitterAuthenticationPlugin.bundle", + "path": "Accounts/Authentication/TwitterAuthenticationPlugin.bundle" + }, + { + "value": 16, + "name": "WeiboAuthenticationPlugin.bundle", + "path": "Accounts/Authentication/WeiboAuthenticationPlugin.bundle" + } + ] + }, + { + "value": 12, + "name": "Notification", + "path": "Accounts/Notification", + "children": [ + { + "value": 12, + "name": "SPAAccountsNotificationPlugin.bundle", + "path": "Accounts/Notification/SPAAccountsNotificationPlugin.bundle" + } + ] + } + ] + }, + { + "value": 1904, + "name": "AddressBook Plug-Ins", + "path": "AddressBook Plug-Ins", + "children": [ + { + "value": 744, + "name": "CardDAVPlugin.sourcebundle", + "path": "AddressBook Plug-Ins/CardDAVPlugin.sourcebundle", + "children": [ + { + "value": 744, + "name": "Contents", + "path": "AddressBook Plug-Ins/CardDAVPlugin.sourcebundle/Contents" + } + ] + }, + { + "value": 28, + "name": "DirectoryServices.sourcebundle", + "path": "AddressBook Plug-Ins/DirectoryServices.sourcebundle", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "AddressBook Plug-Ins/DirectoryServices.sourcebundle/Contents" + } + ] + }, + { + "value": 680, + "name": "Exchange.sourcebundle", + "path": "AddressBook Plug-Ins/Exchange.sourcebundle", + "children": [ + { + "value": 680, + "name": "Contents", + "path": "AddressBook Plug-Ins/Exchange.sourcebundle/Contents" + } + ] + }, + { + "value": 432, + "name": "LDAP.sourcebundle", + "path": "AddressBook Plug-Ins/LDAP.sourcebundle", + "children": [ + { + "value": 432, + "name": "Contents", + "path": "AddressBook Plug-Ins/LDAP.sourcebundle/Contents" + } + ] + }, + { + "value": 20, + "name": "LocalSource.sourcebundle", + "path": "AddressBook Plug-Ins/LocalSource.sourcebundle", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "AddressBook Plug-Ins/LocalSource.sourcebundle/Contents" + } + ] + } + ] + }, + { + "value": 36, + "name": "Assistant", + "path": "Assistant", + "children": [ + { + "value": 36, + "name": "Plugins", + "path": "Assistant/Plugins", + "children": [ + { + "value": 36, + "name": "AddressBook.assistantBundle", + "path": "Assistant/Plugins/AddressBook.assistantBundle" + }, + { + "value": 8, + "name": "GenericAddressHandler.addresshandler", + "path": "Recents/Plugins/GenericAddressHandler.addresshandler" + }, + { + "value": 12, + "name": "MapsRecents.addresshandler", + "path": "Recents/Plugins/MapsRecents.addresshandler" + } + ] + } + ] + }, + { + "value": 53228, + "name": "Automator", + "path": "Automator", + "children": [ + { + "value": 0, + "name": "ActivateFonts.action", + "path": "Automator/ActivateFonts.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/ActivateFonts.action/Contents" + } + ] + }, + { + "value": 12, + "name": "AddAttachments to Front Message.action", + "path": "Automator/AddAttachments to Front Message.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/AddAttachments to Front Message.action/Contents" + } + ] + }, + { + "value": 276, + "name": "AddColor Profile.action", + "path": "Automator/AddColor Profile.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/AddColor Profile.action/Contents" + } + ] + }, + { + "value": 32, + "name": "AddGrid to PDF Documents.action", + "path": "Automator/AddGrid to PDF Documents.action", + "children": [ + { + "value": 32, + "name": "Contents", + "path": "Automator/AddGrid to PDF Documents.action/Contents" + } + ] + }, + { + "value": 12, + "name": "AddMovie to iDVD Menu.action", + "path": "Automator/AddMovie to iDVD Menu.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/AddMovie to iDVD Menu.action/Contents" + } + ] + }, + { + "value": 20, + "name": "AddPhotos to Album.action", + "path": "Automator/AddPhotos to Album.action", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Automator/AddPhotos to Album.action/Contents" + } + ] + }, + { + "value": 12, + "name": "AddSongs to iPod.action", + "path": "Automator/AddSongs to iPod.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/AddSongs to iPod.action/Contents" + } + ] + }, + { + "value": 44, + "name": "AddSongs to Playlist.action", + "path": "Automator/AddSongs to Playlist.action", + "children": [ + { + "value": 44, + "name": "Contents", + "path": "Automator/AddSongs to Playlist.action/Contents" + } + ] + }, + { + "value": 12, + "name": "AddThumbnail Icon to Image Files.action", + "path": "Automator/AddThumbnail Icon to Image Files.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/AddThumbnail Icon to Image Files.action/Contents" + } + ] + }, + { + "value": 268, + "name": "Addto Font Library.action", + "path": "Automator/Addto Font Library.action", + "children": [ + { + "value": 268, + "name": "Contents", + "path": "Automator/Addto Font Library.action/Contents" + } + ] + }, + { + "value": 0, + "name": "AddressBook.definition", + "path": "Automator/AddressBook.definition", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/AddressBook.definition/Contents" + } + ] + }, + { + "value": 408, + "name": "AppleVersioning Tool.action", + "path": "Automator/AppleVersioning Tool.action", + "children": [ + { + "value": 408, + "name": "Contents", + "path": "Automator/AppleVersioning Tool.action/Contents" + } + ] + }, + { + "value": 568, + "name": "ApplyColorSync Profile to Images.action", + "path": "Automator/ApplyColorSync Profile to Images.action", + "children": [ + { + "value": 568, + "name": "Contents", + "path": "Automator/ApplyColorSync Profile to Images.action/Contents" + } + ] + }, + { + "value": 348, + "name": "ApplyQuartz Composition Filter to Image Files.action", + "path": "Automator/ApplyQuartz Composition Filter to Image Files.action", + "children": [ + { + "value": 348, + "name": "Contents", + "path": "Automator/ApplyQuartz Composition Filter to Image Files.action/Contents" + } + ] + }, + { + "value": 368, + "name": "ApplyQuartz Filter to PDF Documents.action", + "path": "Automator/ApplyQuartz Filter to PDF Documents.action", + "children": [ + { + "value": 368, + "name": "Contents", + "path": "Automator/ApplyQuartz Filter to PDF Documents.action/Contents" + } + ] + }, + { + "value": 96, + "name": "ApplySQL.action", + "path": "Automator/ApplySQL.action", + "children": [ + { + "value": 96, + "name": "Contents", + "path": "Automator/ApplySQL.action/Contents" + } + ] + }, + { + "value": 372, + "name": "Askfor Confirmation.action", + "path": "Automator/Askfor Confirmation.action", + "children": [ + { + "value": 372, + "name": "Contents", + "path": "Automator/Askfor Confirmation.action/Contents" + } + ] + }, + { + "value": 104, + "name": "Askfor Finder Items.action", + "path": "Automator/Askfor Finder Items.action", + "children": [ + { + "value": 104, + "name": "Contents", + "path": "Automator/Askfor Finder Items.action/Contents" + } + ] + }, + { + "value": 52, + "name": "Askfor Movies.action", + "path": "Automator/Askfor Movies.action", + "children": [ + { + "value": 52, + "name": "Contents", + "path": "Automator/Askfor Movies.action/Contents" + } + ] + }, + { + "value": 44, + "name": "Askfor Photos.action", + "path": "Automator/Askfor Photos.action", + "children": [ + { + "value": 44, + "name": "Contents", + "path": "Automator/Askfor Photos.action/Contents" + } + ] + }, + { + "value": 16, + "name": "Askfor Servers.action", + "path": "Automator/Askfor Servers.action", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "Automator/Askfor Servers.action/Contents" + } + ] + }, + { + "value": 52, + "name": "Askfor Songs.action", + "path": "Automator/Askfor Songs.action", + "children": [ + { + "value": 52, + "name": "Contents", + "path": "Automator/Askfor Songs.action/Contents" + } + ] + }, + { + "value": 288, + "name": "Askfor Text.action", + "path": "Automator/Askfor Text.action", + "children": [ + { + "value": 288, + "name": "Contents", + "path": "Automator/Askfor Text.action/Contents" + } + ] + }, + { + "value": 0, + "name": "Automator.definition", + "path": "Automator/Automator.definition", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/Automator.definition/Contents" + } + ] + }, + { + "value": 12, + "name": "BrowseMovies.action", + "path": "Automator/BrowseMovies.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/BrowseMovies.action/Contents" + } + ] + }, + { + "value": 552, + "name": "BuildXcode Project.action", + "path": "Automator/BuildXcode Project.action", + "children": [ + { + "value": 552, + "name": "Contents", + "path": "Automator/BuildXcode Project.action/Contents" + } + ] + }, + { + "value": 296, + "name": "BurnA Disc.action", + "path": "Automator/BurnA Disc.action", + "children": [ + { + "value": 296, + "name": "Contents", + "path": "Automator/BurnA Disc.action/Contents" + } + ] + }, + { + "value": 8, + "name": "ChangeCase of Song Names.action", + "path": "Automator/ChangeCase of Song Names.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ChangeCase of Song Names.action/Contents" + } + ] + }, + { + "value": 60, + "name": "ChangeType of Images.action", + "path": "Automator/ChangeType of Images.action", + "children": [ + { + "value": 60, + "name": "Contents", + "path": "Automator/ChangeType of Images.action/Contents" + } + ] + }, + { + "value": 24, + "name": "Choosefrom List.action", + "path": "Automator/Choosefrom List.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/Choosefrom List.action/Contents" + } + ] + }, + { + "value": 12, + "name": "CombineMail Messages.action", + "path": "Automator/CombineMail Messages.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/CombineMail Messages.action/Contents" + } + ] + }, + { + "value": 24, + "name": "CombinePDF Pages.action", + "path": "Automator/CombinePDF Pages.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/CombinePDF Pages.action/Contents" + } + ] + }, + { + "value": 12, + "name": "CombineText Files.action", + "path": "Automator/CombineText Files.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/CombineText Files.action/Contents" + } + ] + }, + { + "value": 24, + "name": "CompressImages in PDF Documents.action", + "path": "Automator/CompressImages in PDF Documents.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/CompressImages in PDF Documents.action/Contents" + } + ] + }, + { + "value": 8, + "name": "Connectto Servers.action", + "path": "Automator/Connectto Servers.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/Connectto Servers.action/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertAccount object to Mailbox object.caction", + "path": "Automator/ConvertAccount object to Mailbox object.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertAccount object to Mailbox object.caction/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertAlbum object to Photo object.caction", + "path": "Automator/ConvertAlbum object to Photo object.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertAlbum object to Photo object.caction/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertAlias object to Finder object.caction", + "path": "Automator/ConvertAlias object to Finder object.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertAlias object to Finder object.caction/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertAlias object to iPhoto photo object.caction", + "path": "Automator/ConvertAlias object to iPhoto photo object.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertAlias object to iPhoto photo object.caction/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertCalendar object to Event object.caction", + "path": "Automator/ConvertCalendar object to Event object.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertCalendar object to Event object.caction/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertCalendar object to Reminders object.caction", + "path": "Automator/ConvertCalendar object to Reminders object.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertCalendar object to Reminders object.caction/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertCocoa Data To Cocoa String.caction", + "path": "Automator/ConvertCocoa Data To Cocoa String.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertCocoa Data To Cocoa String.caction/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertCocoa String To Cocoa Data.caction", + "path": "Automator/ConvertCocoa String To Cocoa Data.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertCocoa String To Cocoa Data.caction/Contents" + } + ] + }, + { + "value": 12, + "name": "ConvertCocoa URL to iTunes Track Object.caction", + "path": "Automator/ConvertCocoa URL to iTunes Track Object.caction", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/ConvertCocoa URL to iTunes Track Object.caction/Contents" + } + ] + }, + { + "value": 12, + "name": "ConvertCocoa URL to RSS Feed.caction", + "path": "Automator/ConvertCocoa URL to RSS Feed.caction", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/ConvertCocoa URL to RSS Feed.caction/Contents" + } + ] + }, + { + "value": 40, + "name": "ConvertCSV to SQL.action", + "path": "Automator/ConvertCSV to SQL.action", + "children": [ + { + "value": 40, + "name": "Contents", + "path": "Automator/ConvertCSV to SQL.action/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertFeeds to Articles.caction", + "path": "Automator/ConvertFeeds to Articles.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertFeeds to Articles.caction/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertFinder object to Alias object.caction", + "path": "Automator/ConvertFinder object to Alias object.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertFinder object to Alias object.caction/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertGroup object to Person object.caction", + "path": "Automator/ConvertGroup object to Person object.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertGroup object to Person object.caction/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertiPhoto Album to Alias object.caction", + "path": "Automator/ConvertiPhoto Album to Alias object.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertiPhoto Album to Alias object.caction/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertiTunes object to Alias object.caction", + "path": "Automator/ConvertiTunes object to Alias object.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertiTunes object to Alias object.caction/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertiTunes Playlist object to Alias object.caction", + "path": "Automator/ConvertiTunes Playlist object to Alias object.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertiTunes Playlist object to Alias object.caction/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertMailbox object to Message object.caction", + "path": "Automator/ConvertMailbox object to Message object.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertMailbox object to Message object.caction/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertPhoto object to Alias object.caction", + "path": "Automator/ConvertPhoto object to Alias object.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertPhoto object to Alias object.caction/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertPlaylist object to Song object.caction", + "path": "Automator/ConvertPlaylist object to Song object.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertPlaylist object to Song object.caction/Contents" + } + ] + }, + { + "value": 2760, + "name": "ConvertQuartz Compositions to QuickTime Movies.action", + "path": "Automator/ConvertQuartz Compositions to QuickTime Movies.action", + "children": [ + { + "value": 2760, + "name": "Contents", + "path": "Automator/ConvertQuartz Compositions to QuickTime Movies.action/Contents" + } + ] + }, + { + "value": 8, + "name": "ConvertSource object to Playlist object.caction", + "path": "Automator/ConvertSource object to Playlist object.caction", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ConvertSource object to Playlist object.caction/Contents" + } + ] + }, + { + "value": 96, + "name": "CopyFinder Items.action", + "path": "Automator/CopyFinder Items.action", + "children": [ + { + "value": 96, + "name": "Contents", + "path": "Automator/CopyFinder Items.action/Contents" + } + ] + }, + { + "value": 8, + "name": "Copyto Clipboard.action", + "path": "Automator/Copyto Clipboard.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/Copyto Clipboard.action/Contents" + } + ] + }, + { + "value": 72, + "name": "CreateAnnotated Movie File.action", + "path": "Automator/CreateAnnotated Movie File.action", + "children": [ + { + "value": 72, + "name": "Contents", + "path": "Automator/CreateAnnotated Movie File.action/Contents" + } + ] + }, + { + "value": 96, + "name": "CreateArchive.action", + "path": "Automator/CreateArchive.action", + "children": [ + { + "value": 96, + "name": "Contents", + "path": "Automator/CreateArchive.action/Contents" + } + ] + }, + { + "value": 412, + "name": "CreateBanner Image from Text.action", + "path": "Automator/CreateBanner Image from Text.action", + "children": [ + { + "value": 412, + "name": "Contents", + "path": "Automator/CreateBanner Image from Text.action/Contents" + } + ] + }, + { + "value": 392, + "name": "CreatePackage.action", + "path": "Automator/CreatePackage.action", + "children": [ + { + "value": 392, + "name": "Contents", + "path": "Automator/CreatePackage.action/Contents" + } + ] + }, + { + "value": 208, + "name": "CreateThumbnail Images.action", + "path": "Automator/CreateThumbnail Images.action", + "children": [ + { + "value": 208, + "name": "Contents", + "path": "Automator/CreateThumbnail Images.action/Contents" + } + ] + }, + { + "value": 712, + "name": "CropImages.action", + "path": "Automator/CropImages.action", + "children": [ + { + "value": 712, + "name": "Contents", + "path": "Automator/CropImages.action/Contents" + } + ] + }, + { + "value": 8, + "name": "CVSAdd.action", + "path": "Automator/CVSAdd.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/CVSAdd.action/Contents" + } + ] + }, + { + "value": 24, + "name": "CVSCheckout.action", + "path": "Automator/CVSCheckout.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/CVSCheckout.action/Contents" + } + ] + }, + { + "value": 24, + "name": "CVSCommit.action", + "path": "Automator/CVSCommit.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/CVSCommit.action/Contents" + } + ] + }, + { + "value": 276, + "name": "CVSUpdate.action", + "path": "Automator/CVSUpdate.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/CVSUpdate.action/Contents" + } + ] + }, + { + "value": 0, + "name": "DeactivateFonts.action", + "path": "Automator/DeactivateFonts.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/DeactivateFonts.action/Contents" + } + ] + }, + { + "value": 12, + "name": "DeleteAll iPod Notes.action", + "path": "Automator/DeleteAll iPod Notes.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/DeleteAll iPod Notes.action/Contents" + } + ] + }, + { + "value": 32, + "name": "DeleteCalendar Events.action", + "path": "Automator/DeleteCalendar Events.action", + "children": [ + { + "value": 32, + "name": "Contents", + "path": "Automator/DeleteCalendar Events.action/Contents" + } + ] + }, + { + "value": 8, + "name": "DeleteCalendar Items.action", + "path": "Automator/DeleteCalendar Items.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/DeleteCalendar Items.action/Contents" + } + ] + }, + { + "value": 8, + "name": "DeleteCalendars.action", + "path": "Automator/DeleteCalendars.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/DeleteCalendars.action/Contents" + } + ] + }, + { + "value": 8, + "name": "DeleteReminders.action", + "path": "Automator/DeleteReminders.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/DeleteReminders.action/Contents" + } + ] + }, + { + "value": 12, + "name": "DisplayMail Messages.action", + "path": "Automator/DisplayMail Messages.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/DisplayMail Messages.action/Contents" + } + ] + }, + { + "value": 16, + "name": "DisplayNotification.action", + "path": "Automator/DisplayNotification.action", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "Automator/DisplayNotification.action/Contents" + } + ] + }, + { + "value": 8, + "name": "DisplayWebpages 2.action", + "path": "Automator/DisplayWebpages 2.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/DisplayWebpages 2.action/Contents" + } + ] + }, + { + "value": 12, + "name": "DisplayWebpages.action", + "path": "Automator/DisplayWebpages.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/DisplayWebpages.action/Contents" + } + ] + }, + { + "value": 276, + "name": "DownloadPictures.action", + "path": "Automator/DownloadPictures.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/DownloadPictures.action/Contents" + } + ] + }, + { + "value": 24, + "name": "DownloadURLs.action", + "path": "Automator/DownloadURLs.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/DownloadURLs.action/Contents" + } + ] + }, + { + "value": 8, + "name": "DuplicateFinder Items.action", + "path": "Automator/DuplicateFinder Items.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/DuplicateFinder Items.action/Contents" + } + ] + }, + { + "value": 8, + "name": "EjectDisk.action", + "path": "Automator/EjectDisk.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/EjectDisk.action/Contents" + } + ] + }, + { + "value": 12, + "name": "EjectiPod.action", + "path": "Automator/EjectiPod.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/EjectiPod.action/Contents" + } + ] + }, + { + "value": 276, + "name": "Enableor Disable Tracks.action", + "path": "Automator/Enableor Disable Tracks.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/Enableor Disable Tracks.action/Contents" + } + ] + }, + { + "value": 464, + "name": "EncodeMedia.action", + "path": "Automator/EncodeMedia.action", + "children": [ + { + "value": 464, + "name": "Contents", + "path": "Automator/EncodeMedia.action/Contents" + } + ] + }, + { + "value": 80, + "name": "Encodeto MPEG Audio.action", + "path": "Automator/Encodeto MPEG Audio.action", + "children": [ + { + "value": 80, + "name": "Contents", + "path": "Automator/Encodeto MPEG Audio.action/Contents" + } + ] + }, + { + "value": 24, + "name": "EncryptPDF Documents.action", + "path": "Automator/EncryptPDF Documents.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/EncryptPDF Documents.action/Contents" + } + ] + }, + { + "value": 12, + "name": "EventSummary.action", + "path": "Automator/EventSummary.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/EventSummary.action/Contents" + } + ] + }, + { + "value": 24, + "name": "ExecuteSQL.action", + "path": "Automator/ExecuteSQL.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/ExecuteSQL.action/Contents" + } + ] + }, + { + "value": 264, + "name": "ExportFont Files.action", + "path": "Automator/ExportFont Files.action", + "children": [ + { + "value": 264, + "name": "Contents", + "path": "Automator/ExportFont Files.action/Contents" + } + ] + }, + { + "value": 24, + "name": "ExportMovies for iPod.action", + "path": "Automator/ExportMovies for iPod.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/ExportMovies for iPod.action/Contents" + } + ] + }, + { + "value": 44, + "name": "ExportvCards.action", + "path": "Automator/ExportvCards.action", + "children": [ + { + "value": 44, + "name": "Contents", + "path": "Automator/ExportvCards.action/Contents" + } + ] + }, + { + "value": 12, + "name": "ExtractData from Text.action", + "path": "Automator/ExtractData from Text.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/ExtractData from Text.action/Contents" + } + ] + }, + { + "value": 24, + "name": "ExtractOdd & Even Pages.action", + "path": "Automator/ExtractOdd & Even Pages.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/ExtractOdd & Even Pages.action/Contents" + } + ] + }, + { + "value": 276, + "name": "ExtractPDF Annotations.action", + "path": "Automator/ExtractPDF Annotations.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/ExtractPDF Annotations.action/Contents" + } + ] + }, + { + "value": 2620, + "name": "ExtractPDF Text.action", + "path": "Automator/ExtractPDF Text.action", + "children": [ + { + "value": 2620, + "name": "Contents", + "path": "Automator/ExtractPDF Text.action/Contents" + } + ] + }, + { + "value": 44, + "name": "FilterArticles.action", + "path": "Automator/FilterArticles.action", + "children": [ + { + "value": 44, + "name": "Contents", + "path": "Automator/FilterArticles.action/Contents" + } + ] + }, + { + "value": 272, + "name": "FilterCalendar Items 2.action", + "path": "Automator/FilterCalendar Items 2.action", + "children": [ + { + "value": 272, + "name": "Contents", + "path": "Automator/FilterCalendar Items 2.action/Contents" + } + ] + }, + { + "value": 280, + "name": "FilterContacts Items 2.action", + "path": "Automator/FilterContacts Items 2.action", + "children": [ + { + "value": 280, + "name": "Contents", + "path": "Automator/FilterContacts Items 2.action/Contents" + } + ] + }, + { + "value": 280, + "name": "FilterFinder Items 2.action", + "path": "Automator/FilterFinder Items 2.action", + "children": [ + { + "value": 280, + "name": "Contents", + "path": "Automator/FilterFinder Items 2.action/Contents" + } + ] + }, + { + "value": 12, + "name": "FilterFinder Items.action", + "path": "Automator/FilterFinder Items.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/FilterFinder Items.action/Contents" + } + ] + }, + { + "value": 264, + "name": "FilterFonts by Font Type.action", + "path": "Automator/FilterFonts by Font Type.action", + "children": [ + { + "value": 264, + "name": "Contents", + "path": "Automator/FilterFonts by Font Type.action/Contents" + } + ] + }, + { + "value": 280, + "name": "FilteriPhoto Items 2.action", + "path": "Automator/FilteriPhoto Items 2.action", + "children": [ + { + "value": 280, + "name": "Contents", + "path": "Automator/FilteriPhoto Items 2.action/Contents" + } + ] + }, + { + "value": 272, + "name": "FilterItems.action", + "path": "Automator/FilterItems.action", + "children": [ + { + "value": 272, + "name": "Contents", + "path": "Automator/FilterItems.action/Contents" + } + ] + }, + { + "value": 276, + "name": "FilteriTunes Items 2.action", + "path": "Automator/FilteriTunes Items 2.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/FilteriTunes Items 2.action/Contents" + } + ] + }, + { + "value": 276, + "name": "FilterMail Items 2.action", + "path": "Automator/FilterMail Items 2.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/FilterMail Items 2.action/Contents" + } + ] + }, + { + "value": 60, + "name": "FilterParagraphs.action", + "path": "Automator/FilterParagraphs.action", + "children": [ + { + "value": 60, + "name": "Contents", + "path": "Automator/FilterParagraphs.action/Contents" + } + ] + }, + { + "value": 276, + "name": "FilterURLs 2.action", + "path": "Automator/FilterURLs 2.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/FilterURLs 2.action/Contents" + } + ] + }, + { + "value": 12, + "name": "FilterURLs.action", + "path": "Automator/FilterURLs.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/FilterURLs.action/Contents" + } + ] + }, + { + "value": 272, + "name": "FindCalendar Items 2.action", + "path": "Automator/FindCalendar Items 2.action", + "children": [ + { + "value": 272, + "name": "Contents", + "path": "Automator/FindCalendar Items 2.action/Contents" + } + ] + }, + { + "value": 276, + "name": "FindContacts Items 2.action", + "path": "Automator/FindContacts Items 2.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/FindContacts Items 2.action/Contents" + } + ] + }, + { + "value": 276, + "name": "FindFinder Items 2.action", + "path": "Automator/FindFinder Items 2.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/FindFinder Items 2.action/Contents" + } + ] + }, + { + "value": 280, + "name": "FindFinder Items.action", + "path": "Automator/FindFinder Items.action", + "children": [ + { + "value": 280, + "name": "Contents", + "path": "Automator/FindFinder Items.action/Contents" + } + ] + }, + { + "value": 276, + "name": "FindiPhoto Items 2.action", + "path": "Automator/FindiPhoto Items 2.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/FindiPhoto Items 2.action/Contents" + } + ] + }, + { + "value": 272, + "name": "FindItems.action", + "path": "Automator/FindItems.action", + "children": [ + { + "value": 272, + "name": "Contents", + "path": "Automator/FindItems.action/Contents" + } + ] + }, + { + "value": 276, + "name": "FindiTunes Items 2.action", + "path": "Automator/FindiTunes Items 2.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/FindiTunes Items 2.action/Contents" + } + ] + }, + { + "value": 280, + "name": "FindMail Items 2.action", + "path": "Automator/FindMail Items 2.action", + "children": [ + { + "value": 280, + "name": "Contents", + "path": "Automator/FindMail Items 2.action/Contents" + } + ] + }, + { + "value": 84, + "name": "FindPeople with Birthdays.action", + "path": "Automator/FindPeople with Birthdays.action", + "children": [ + { + "value": 84, + "name": "Contents", + "path": "Automator/FindPeople with Birthdays.action/Contents" + } + ] + }, + { + "value": 0, + "name": "Finder.definition", + "path": "Automator/Finder.definition", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/Finder.definition/Contents" + } + ] + }, + { + "value": 104, + "name": "FlipImages.action", + "path": "Automator/FlipImages.action", + "children": [ + { + "value": 104, + "name": "Contents", + "path": "Automator/FlipImages.action/Contents" + } + ] + }, + { + "value": 0, + "name": "FontBook.definition", + "path": "Automator/FontBook.definition", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/FontBook.definition/Contents" + } + ] + }, + { + "value": 36, + "name": "GetAttachments from Mail Messages.action", + "path": "Automator/GetAttachments from Mail Messages.action", + "children": [ + { + "value": 36, + "name": "Contents", + "path": "Automator/GetAttachments from Mail Messages.action/Contents" + } + ] + }, + { + "value": 180, + "name": "GetContact Information.action", + "path": "Automator/GetContact Information.action", + "children": [ + { + "value": 180, + "name": "Contents", + "path": "Automator/GetContact Information.action/Contents" + } + ] + }, + { + "value": 8, + "name": "GetContents of Clipboard.action", + "path": "Automator/GetContents of Clipboard.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/GetContents of Clipboard.action/Contents" + } + ] + }, + { + "value": 8, + "name": "GetContents of TextEdit Document.action", + "path": "Automator/GetContents of TextEdit Document.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/GetContents of TextEdit Document.action/Contents" + } + ] + }, + { + "value": 12, + "name": "GetContents of Webpages.action", + "path": "Automator/GetContents of Webpages.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/GetContents of Webpages.action/Contents" + } + ] + }, + { + "value": 8, + "name": "GetCurrent Webpage from Safari.action", + "path": "Automator/GetCurrent Webpage from Safari.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/GetCurrent Webpage from Safari.action/Contents" + } + ] + }, + { + "value": 84, + "name": "GetDefinition of Word.action", + "path": "Automator/GetDefinition of Word.action", + "children": [ + { + "value": 84, + "name": "Contents", + "path": "Automator/GetDefinition of Word.action/Contents" + } + ] + }, + { + "value": 8, + "name": "GetEnclosure URLs from Articles.action", + "path": "Automator/GetEnclosure URLs from Articles.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/GetEnclosure URLs from Articles.action/Contents" + } + ] + }, + { + "value": 12, + "name": "GetFeeds from URLs.action", + "path": "Automator/GetFeeds from URLs.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/GetFeeds from URLs.action/Contents" + } + ] + }, + { + "value": 0, + "name": "GetFiles for Fonts.action", + "path": "Automator/GetFiles for Fonts.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/GetFiles for Fonts.action/Contents" + } + ] + }, + { + "value": 12, + "name": "GetFolder Contents.action", + "path": "Automator/GetFolder Contents.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/GetFolder Contents.action/Contents" + } + ] + }, + { + "value": 412, + "name": "GetFont Info.action", + "path": "Automator/GetFont Info.action", + "children": [ + { + "value": 412, + "name": "Contents", + "path": "Automator/GetFont Info.action/Contents" + } + ] + }, + { + "value": 0, + "name": "GetFonts from Font Files.action", + "path": "Automator/GetFonts from Font Files.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/GetFonts from Font Files.action/Contents" + } + ] + }, + { + "value": 0, + "name": "GetFonts of TextEdit Document.action", + "path": "Automator/GetFonts of TextEdit Document.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/GetFonts of TextEdit Document.action/Contents" + } + ] + }, + { + "value": 20, + "name": "GetiDVD Slideshow Images.action", + "path": "Automator/GetiDVD Slideshow Images.action", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Automator/GetiDVD Slideshow Images.action/Contents" + } + ] + }, + { + "value": 28, + "name": "GetImage URLs from Articles.action", + "path": "Automator/GetImage URLs from Articles.action", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "Automator/GetImage URLs from Articles.action/Contents" + } + ] + }, + { + "value": 52, + "name": "GetImage URLs from Webpage.action", + "path": "Automator/GetImage URLs from Webpage.action", + "children": [ + { + "value": 52, + "name": "Contents", + "path": "Automator/GetImage URLs from Webpage.action/Contents" + } + ] + }, + { + "value": 12, + "name": "GetLink URLs from Articles.action", + "path": "Automator/GetLink URLs from Articles.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/GetLink URLs from Articles.action/Contents" + } + ] + }, + { + "value": 24, + "name": "GetLink URLs from Webpages.action", + "path": "Automator/GetLink URLs from Webpages.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/GetLink URLs from Webpages.action/Contents" + } + ] + }, + { + "value": 20, + "name": "GetNew Mail.action", + "path": "Automator/GetNew Mail.action", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Automator/GetNew Mail.action/Contents" + } + ] + }, + { + "value": 276, + "name": "GetPDF Metadata.action", + "path": "Automator/GetPDF Metadata.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/GetPDF Metadata.action/Contents" + } + ] + }, + { + "value": 8, + "name": "GetPermalinks of Articles.action", + "path": "Automator/GetPermalinks of Articles.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/GetPermalinks of Articles.action/Contents" + } + ] + }, + { + "value": 0, + "name": "GetPostScript name of Font.action", + "path": "Automator/GetPostScript name of Font.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/GetPostScript name of Font.action/Contents" + } + ] + }, + { + "value": 44, + "name": "GetSelected Contacts Items 2.action", + "path": "Automator/GetSelected Contacts Items 2.action", + "children": [ + { + "value": 44, + "name": "Contents", + "path": "Automator/GetSelected Contacts Items 2.action/Contents" + } + ] + }, + { + "value": 8, + "name": "GetSelected Finder Items 2.action", + "path": "Automator/GetSelected Finder Items 2.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/GetSelected Finder Items 2.action/Contents" + } + ] + }, + { + "value": 28, + "name": "GetSelected iPhoto Items 2.action", + "path": "Automator/GetSelected iPhoto Items 2.action", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "Automator/GetSelected iPhoto Items 2.action/Contents" + } + ] + }, + { + "value": 8, + "name": "GetSelected Items.action", + "path": "Automator/GetSelected Items.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/GetSelected Items.action/Contents" + } + ] + }, + { + "value": 28, + "name": "GetSelected iTunes Items 2.action", + "path": "Automator/GetSelected iTunes Items 2.action", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "Automator/GetSelected iTunes Items 2.action/Contents" + } + ] + }, + { + "value": 28, + "name": "GetSelected Mail Items 2.action", + "path": "Automator/GetSelected Mail Items 2.action", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "Automator/GetSelected Mail Items 2.action/Contents" + } + ] + }, + { + "value": 540, + "name": "GetSpecified Calendar Items.action", + "path": "Automator/GetSpecified Calendar Items.action", + "children": [ + { + "value": 540, + "name": "Contents", + "path": "Automator/GetSpecified Calendar Items.action/Contents" + } + ] + }, + { + "value": 292, + "name": "GetSpecified Contacts Items.action", + "path": "Automator/GetSpecified Contacts Items.action", + "children": [ + { + "value": 292, + "name": "Contents", + "path": "Automator/GetSpecified Contacts Items.action/Contents" + } + ] + }, + { + "value": 308, + "name": "GetSpecified Finder Items.action", + "path": "Automator/GetSpecified Finder Items.action", + "children": [ + { + "value": 308, + "name": "Contents", + "path": "Automator/GetSpecified Finder Items.action/Contents" + } + ] + }, + { + "value": 288, + "name": "GetSpecified iPhoto Items.action", + "path": "Automator/GetSpecified iPhoto Items.action", + "children": [ + { + "value": 288, + "name": "Contents", + "path": "Automator/GetSpecified iPhoto Items.action/Contents" + } + ] + }, + { + "value": 288, + "name": "GetSpecified iTunes Items.action", + "path": "Automator/GetSpecified iTunes Items.action", + "children": [ + { + "value": 288, + "name": "Contents", + "path": "Automator/GetSpecified iTunes Items.action/Contents" + } + ] + }, + { + "value": 380, + "name": "GetSpecified Mail Items.action", + "path": "Automator/GetSpecified Mail Items.action", + "children": [ + { + "value": 380, + "name": "Contents", + "path": "Automator/GetSpecified Mail Items.action/Contents" + } + ] + }, + { + "value": 288, + "name": "GetSpecified Movies.action", + "path": "Automator/GetSpecified Movies.action", + "children": [ + { + "value": 288, + "name": "Contents", + "path": "Automator/GetSpecified Movies.action/Contents" + } + ] + }, + { + "value": 276, + "name": "GetSpecified Servers.action", + "path": "Automator/GetSpecified Servers.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/GetSpecified Servers.action/Contents" + } + ] + }, + { + "value": 272, + "name": "GetSpecified Text.action", + "path": "Automator/GetSpecified Text.action", + "children": [ + { + "value": 272, + "name": "Contents", + "path": "Automator/GetSpecified Text.action/Contents" + } + ] + }, + { + "value": 288, + "name": "GetSpecified URLs.action", + "path": "Automator/GetSpecified URLs.action", + "children": [ + { + "value": 288, + "name": "Contents", + "path": "Automator/GetSpecified URLs.action/Contents" + } + ] + }, + { + "value": 8, + "name": "GetText from Articles.action", + "path": "Automator/GetText from Articles.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/GetText from Articles.action/Contents" + } + ] + }, + { + "value": 40, + "name": "GetText from Webpage.action", + "path": "Automator/GetText from Webpage.action", + "children": [ + { + "value": 40, + "name": "Contents", + "path": "Automator/GetText from Webpage.action/Contents" + } + ] + }, + { + "value": 8, + "name": "Getthe Current Song.action", + "path": "Automator/Getthe Current Song.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/Getthe Current Song.action/Contents" + } + ] + }, + { + "value": 36, + "name": "GetValue of Variable.action", + "path": "Automator/GetValue of Variable.action", + "children": [ + { + "value": 36, + "name": "Contents", + "path": "Automator/GetValue of Variable.action/Contents" + } + ] + }, + { + "value": 280, + "name": "GroupMailer.action", + "path": "Automator/GroupMailer.action", + "children": [ + { + "value": 280, + "name": "Contents", + "path": "Automator/GroupMailer.action/Contents" + } + ] + }, + { + "value": 8, + "name": "HideAll Applications.action", + "path": "Automator/HideAll Applications.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/HideAll Applications.action/Contents" + } + ] + }, + { + "value": 12, + "name": "HintMovies.action", + "path": "Automator/HintMovies.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/HintMovies.action/Contents" + } + ] + }, + { + "value": 0, + "name": "iCal.definition", + "path": "Automator/iCal.definition", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/iCal.definition/Contents" + } + ] + }, + { + "value": 44, + "name": "ImportAudio Files.action", + "path": "Automator/ImportAudio Files.action", + "children": [ + { + "value": 44, + "name": "Contents", + "path": "Automator/ImportAudio Files.action/Contents" + } + ] + }, + { + "value": 28, + "name": "ImportFiles into iPhoto.action", + "path": "Automator/ImportFiles into iPhoto.action", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "Automator/ImportFiles into iPhoto.action/Contents" + } + ] + }, + { + "value": 24, + "name": "ImportFiles into iTunes.action", + "path": "Automator/ImportFiles into iTunes.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/ImportFiles into iTunes.action/Contents" + } + ] + }, + { + "value": 256, + "name": "InitiateRemote Broadcast.action", + "path": "Automator/InitiateRemote Broadcast.action", + "children": [ + { + "value": 256, + "name": "Contents", + "path": "Automator/InitiateRemote Broadcast.action/Contents" + } + ] + }, + { + "value": 0, + "name": "iPhoto.definition", + "path": "Automator/iPhoto.definition", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/iPhoto.definition/Contents" + } + ] + }, + { + "value": 0, + "name": "iTunes.definition", + "path": "Automator/iTunes.definition", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/iTunes.definition/Contents" + } + ] + }, + { + "value": 24, + "name": "LabelFinder Items.action", + "path": "Automator/LabelFinder Items.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/LabelFinder Items.action/Contents" + } + ] + }, + { + "value": 8, + "name": "LaunchApplication.action", + "path": "Automator/LaunchApplication.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/LaunchApplication.action/Contents" + } + ] + }, + { + "value": 24, + "name": "Loop.action", + "path": "Automator/Loop.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/Loop.action/Contents" + } + ] + }, + { + "value": 0, + "name": "Mail.definition", + "path": "Automator/Mail.definition", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/Mail.definition/Contents" + } + ] + }, + { + "value": 16, + "name": "MarkArticles.action", + "path": "Automator/MarkArticles.action", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "Automator/MarkArticles.action/Contents" + } + ] + }, + { + "value": 12, + "name": "MountDisk Image.action", + "path": "Automator/MountDisk Image.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/MountDisk Image.action/Contents" + } + ] + }, + { + "value": 12, + "name": "MoveFinder Items to Trash.action", + "path": "Automator/MoveFinder Items to Trash.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/MoveFinder Items to Trash.action/Contents" + } + ] + }, + { + "value": 28, + "name": "MoveFinder Items.action", + "path": "Automator/MoveFinder Items.action", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "Automator/MoveFinder Items.action/Contents" + } + ] + }, + { + "value": 108, + "name": "NewAliases.action", + "path": "Automator/NewAliases.action", + "children": [ + { + "value": 108, + "name": "Contents", + "path": "Automator/NewAliases.action/Contents" + } + ] + }, + { + "value": 0, + "name": "NewAudio Capture.action", + "path": "Automator/NewAudio Capture.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/NewAudio Capture.action/Contents" + } + ] + }, + { + "value": 676, + "name": "NewCalendar Events Leopard.action", + "path": "Automator/NewCalendar Events Leopard.action", + "children": [ + { + "value": 676, + "name": "Contents", + "path": "Automator/NewCalendar Events Leopard.action/Contents" + } + ] + }, + { + "value": 24, + "name": "NewCalendar.action", + "path": "Automator/NewCalendar.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/NewCalendar.action/Contents" + } + ] + }, + { + "value": 64, + "name": "NewDisk Image.action", + "path": "Automator/NewDisk Image.action", + "children": [ + { + "value": 64, + "name": "Contents", + "path": "Automator/NewDisk Image.action/Contents" + } + ] + }, + { + "value": 20, + "name": "NewFolder.action", + "path": "Automator/NewFolder.action", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Automator/NewFolder.action/Contents" + } + ] + }, + { + "value": 20, + "name": "NewiDVD Menu.action", + "path": "Automator/NewiDVD Menu.action", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Automator/NewiDVD Menu.action/Contents" + } + ] + }, + { + "value": 20, + "name": "NewiDVD Movie Sequence.action", + "path": "Automator/NewiDVD Movie Sequence.action", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Automator/NewiDVD Movie Sequence.action/Contents" + } + ] + }, + { + "value": 64, + "name": "NewiDVD Slideshow.action", + "path": "Automator/NewiDVD Slideshow.action", + "children": [ + { + "value": 64, + "name": "Contents", + "path": "Automator/NewiDVD Slideshow.action/Contents" + } + ] + }, + { + "value": 12, + "name": "NewiPhoto Album.action", + "path": "Automator/NewiPhoto Album.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/NewiPhoto Album.action/Contents" + } + ] + }, + { + "value": 32, + "name": "NewiPod Note.action", + "path": "Automator/NewiPod Note.action", + "children": [ + { + "value": 32, + "name": "Contents", + "path": "Automator/NewiPod Note.action/Contents" + } + ] + }, + { + "value": 12, + "name": "NewiTunes Playlist.action", + "path": "Automator/NewiTunes Playlist.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/NewiTunes Playlist.action/Contents" + } + ] + }, + { + "value": 576, + "name": "NewMail Message.action", + "path": "Automator/NewMail Message.action", + "children": [ + { + "value": 576, + "name": "Contents", + "path": "Automator/NewMail Message.action/Contents" + } + ] + }, + { + "value": 32, + "name": "NewPDF Contact Sheet.action", + "path": "Automator/NewPDF Contact Sheet.action", + "children": [ + { + "value": 32, + "name": "Contents", + "path": "Automator/NewPDF Contact Sheet.action/Contents" + } + ] + }, + { + "value": 4444, + "name": "NewPDF from Images.action", + "path": "Automator/NewPDF from Images.action", + "children": [ + { + "value": 4444, + "name": "Contents", + "path": "Automator/NewPDF from Images.action/Contents" + } + ] + }, + { + "value": 1976, + "name": "NewQuickTime Slideshow.action", + "path": "Automator/NewQuickTime Slideshow.action", + "children": [ + { + "value": 1976, + "name": "Contents", + "path": "Automator/NewQuickTime Slideshow.action/Contents" + } + ] + }, + { + "value": 808, + "name": "NewReminders Item.action", + "path": "Automator/NewReminders Item.action", + "children": [ + { + "value": 808, + "name": "Contents", + "path": "Automator/NewReminders Item.action/Contents" + } + ] + }, + { + "value": 0, + "name": "NewScreen Capture.action", + "path": "Automator/NewScreen Capture.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/NewScreen Capture.action/Contents" + } + ] + }, + { + "value": 64, + "name": "NewText File.action", + "path": "Automator/NewText File.action", + "children": [ + { + "value": 64, + "name": "Contents", + "path": "Automator/NewText File.action/Contents" + } + ] + }, + { + "value": 8, + "name": "NewTextEdit Document.action", + "path": "Automator/NewTextEdit Document.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/NewTextEdit Document.action/Contents" + } + ] + }, + { + "value": 0, + "name": "NewVideo Capture.action", + "path": "Automator/NewVideo Capture.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/NewVideo Capture.action/Contents" + } + ] + }, + { + "value": 28, + "name": "OpenFinder Items.action", + "path": "Automator/OpenFinder Items.action", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "Automator/OpenFinder Items.action/Contents" + } + ] + }, + { + "value": 12, + "name": "OpenImages in Preview.action", + "path": "Automator/OpenImages in Preview.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/OpenImages in Preview.action/Contents" + } + ] + }, + { + "value": 12, + "name": "OpenKeynote Presentations.action", + "path": "Automator/OpenKeynote Presentations.action", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Automator/OpenKeynote Presentations.action/Contents" + } + ] + }, + { + "value": 60, + "name": "PadImages.action", + "path": "Automator/PadImages.action", + "children": [ + { + "value": 60, + "name": "Contents", + "path": "Automator/PadImages.action/Contents" + } + ] + }, + { + "value": 0, + "name": "PauseCapture.action", + "path": "Automator/PauseCapture.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/PauseCapture.action/Contents" + } + ] + }, + { + "value": 8, + "name": "PauseDVD Playback.action", + "path": "Automator/PauseDVD Playback.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/PauseDVD Playback.action/Contents" + } + ] + }, + { + "value": 8, + "name": "PauseiTunes.action", + "path": "Automator/PauseiTunes.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/PauseiTunes.action/Contents" + } + ] + }, + { + "value": 20, + "name": "Pause.action", + "path": "Automator/Pause.action", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Automator/Pause.action/Contents" + } + ] + }, + { + "value": 3696, + "name": "PDFto Images.action", + "path": "Automator/PDFto Images.action", + "children": [ + { + "value": 3696, + "name": "Contents", + "path": "Automator/PDFto Images.action/Contents" + } + ] + }, + { + "value": 276, + "name": "PlayDVD.action", + "path": "Automator/PlayDVD.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/PlayDVD.action/Contents" + } + ] + }, + { + "value": 8, + "name": "PlayiPhoto Slideshow.action", + "path": "Automator/PlayiPhoto Slideshow.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/PlayiPhoto Slideshow.action/Contents" + } + ] + }, + { + "value": 8, + "name": "PlayiTunes Playlist.action", + "path": "Automator/PlayiTunes Playlist.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/PlayiTunes Playlist.action/Contents" + } + ] + }, + { + "value": 264, + "name": "PlayMovies.action", + "path": "Automator/PlayMovies.action", + "children": [ + { + "value": 264, + "name": "Contents", + "path": "Automator/PlayMovies.action/Contents" + } + ] + }, + { + "value": 20, + "name": "PrintFinder Items.action", + "path": "Automator/PrintFinder Items.action", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Automator/PrintFinder Items.action/Contents" + } + ] + }, + { + "value": 108, + "name": "PrintImages.action", + "path": "Automator/PrintImages.action", + "children": [ + { + "value": 108, + "name": "Contents", + "path": "Automator/PrintImages.action/Contents" + } + ] + }, + { + "value": 32, + "name": "PrintKeynote Presentation.action", + "path": "Automator/PrintKeynote Presentation.action", + "children": [ + { + "value": 32, + "name": "Contents", + "path": "Automator/PrintKeynote Presentation.action/Contents" + } + ] + }, + { + "value": 288, + "name": "QuitAll Applications.action", + "path": "Automator/QuitAll Applications.action", + "children": [ + { + "value": 288, + "name": "Contents", + "path": "Automator/QuitAll Applications.action/Contents" + } + ] + }, + { + "value": 24, + "name": "QuitApplication.action", + "path": "Automator/QuitApplication.action", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "Automator/QuitApplication.action/Contents" + } + ] + }, + { + "value": 8, + "name": "RemoveEmpty Playlists.action", + "path": "Automator/RemoveEmpty Playlists.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/RemoveEmpty Playlists.action/Contents" + } + ] + }, + { + "value": 0, + "name": "RemoveFont Files.action", + "path": "Automator/RemoveFont Files.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/RemoveFont Files.action/Contents" + } + ] + }, + { + "value": 1092, + "name": "RenameFinder Items.action", + "path": "Automator/RenameFinder Items.action", + "children": [ + { + "value": 1092, + "name": "Contents", + "path": "Automator/RenameFinder Items.action/Contents" + } + ] + }, + { + "value": 16, + "name": "RenamePDF Documents.action", + "path": "Automator/RenamePDF Documents.action", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "Automator/RenamePDF Documents.action/Contents" + } + ] + }, + { + "value": 32, + "name": "RenderPDF Pages as Images.action", + "path": "Automator/RenderPDF Pages as Images.action", + "children": [ + { + "value": 32, + "name": "Contents", + "path": "Automator/RenderPDF Pages as Images.action/Contents" + } + ] + }, + { + "value": 2888, + "name": "RenderQuartz Compositions to Image Files.action", + "path": "Automator/RenderQuartz Compositions to Image Files.action", + "children": [ + { + "value": 2888, + "name": "Contents", + "path": "Automator/RenderQuartz Compositions to Image Files.action/Contents" + } + ] + }, + { + "value": 0, + "name": "ResumeCapture.action", + "path": "Automator/ResumeCapture.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/ResumeCapture.action/Contents" + } + ] + }, + { + "value": 8, + "name": "ResumeDVD Playback.action", + "path": "Automator/ResumeDVD Playback.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ResumeDVD Playback.action/Contents" + } + ] + }, + { + "value": 8, + "name": "RevealFinder Items.action", + "path": "Automator/RevealFinder Items.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/RevealFinder Items.action/Contents" + } + ] + }, + { + "value": 428, + "name": "ReviewPhotos.action", + "path": "Automator/ReviewPhotos.action", + "children": [ + { + "value": 428, + "name": "Contents", + "path": "Automator/ReviewPhotos.action/Contents" + } + ] + }, + { + "value": 56, + "name": "RotateImages.action", + "path": "Automator/RotateImages.action", + "children": [ + { + "value": 56, + "name": "Contents", + "path": "Automator/RotateImages.action/Contents" + } + ] + }, + { + "value": 308, + "name": "RunAppleScript.action", + "path": "Automator/RunAppleScript.action", + "children": [ + { + "value": 308, + "name": "Contents", + "path": "Automator/RunAppleScript.action/Contents" + } + ] + }, + { + "value": 20, + "name": "RunSelf-Test.action", + "path": "Automator/RunSelf-Test.action", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Automator/RunSelf-Test.action/Contents" + } + ] + }, + { + "value": 316, + "name": "RunShell Script.action", + "path": "Automator/RunShell Script.action", + "children": [ + { + "value": 316, + "name": "Contents", + "path": "Automator/RunShell Script.action/Contents" + } + ] + }, + { + "value": 36, + "name": "RunWeb Service.action", + "path": "Automator/RunWeb Service.action", + "children": [ + { + "value": 36, + "name": "Contents", + "path": "Automator/RunWeb Service.action/Contents" + } + ] + }, + { + "value": 416, + "name": "RunWorkflow.action", + "path": "Automator/RunWorkflow.action", + "children": [ + { + "value": 416, + "name": "Contents", + "path": "Automator/RunWorkflow.action/Contents" + } + ] + }, + { + "value": 32, + "name": "SaveImages from Web Content.action", + "path": "Automator/SaveImages from Web Content.action", + "children": [ + { + "value": 32, + "name": "Contents", + "path": "Automator/SaveImages from Web Content.action/Contents" + } + ] + }, + { + "value": 20, + "name": "ScaleImages.action", + "path": "Automator/ScaleImages.action", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Automator/ScaleImages.action/Contents" + } + ] + }, + { + "value": 2112, + "name": "SearchPDFs.action", + "path": "Automator/SearchPDFs.action", + "children": [ + { + "value": 2112, + "name": "Contents", + "path": "Automator/SearchPDFs.action/Contents" + } + ] + }, + { + "value": 0, + "name": "SelectFonts in Font Book.action", + "path": "Automator/SelectFonts in Font Book.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/SelectFonts in Font Book.action/Contents" + } + ] + }, + { + "value": 944, + "name": "SendBirthday Greetings.action", + "path": "Automator/SendBirthday Greetings.action", + "children": [ + { + "value": 944, + "name": "Contents", + "path": "Automator/SendBirthday Greetings.action/Contents" + } + ] + }, + { + "value": 8, + "name": "SendOutgoing Messages.action", + "path": "Automator/SendOutgoing Messages.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/SendOutgoing Messages.action/Contents" + } + ] + }, + { + "value": 16, + "name": "SetApplication for Files.action", + "path": "Automator/SetApplication for Files.action", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "Automator/SetApplication for Files.action/Contents" + } + ] + }, + { + "value": 340, + "name": "SetComputer Volume.action", + "path": "Automator/SetComputer Volume.action", + "children": [ + { + "value": 340, + "name": "Contents", + "path": "Automator/SetComputer Volume.action/Contents" + } + ] + }, + { + "value": 44, + "name": "SetContents of TextEdit Document.action", + "path": "Automator/SetContents of TextEdit Document.action", + "children": [ + { + "value": 44, + "name": "Contents", + "path": "Automator/SetContents of TextEdit Document.action/Contents" + } + ] + }, + { + "value": 8, + "name": "SetDesktop Picture.action", + "path": "Automator/SetDesktop Picture.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/SetDesktop Picture.action/Contents" + } + ] + }, + { + "value": 820, + "name": "SetFolder Views.action", + "path": "Automator/SetFolder Views.action", + "children": [ + { + "value": 820, + "name": "Contents", + "path": "Automator/SetFolder Views.action/Contents" + } + ] + }, + { + "value": 8, + "name": "SetiDVD Background Image.action", + "path": "Automator/SetiDVD Background Image.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/SetiDVD Background Image.action/Contents" + } + ] + }, + { + "value": 20, + "name": "SetiDVD Button Face.action", + "path": "Automator/SetiDVD Button Face.action", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Automator/SetiDVD Button Face.action/Contents" + } + ] + }, + { + "value": 112, + "name": "SetInfo of iTunes Songs.action", + "path": "Automator/SetInfo of iTunes Songs.action", + "children": [ + { + "value": 112, + "name": "Contents", + "path": "Automator/SetInfo of iTunes Songs.action/Contents" + } + ] + }, + { + "value": 408, + "name": "SetiTunes Equalizer.action", + "path": "Automator/SetiTunes Equalizer.action", + "children": [ + { + "value": 408, + "name": "Contents", + "path": "Automator/SetiTunes Equalizer.action/Contents" + } + ] + }, + { + "value": 32, + "name": "SetiTunes Volume.action", + "path": "Automator/SetiTunes Volume.action", + "children": [ + { + "value": 32, + "name": "Contents", + "path": "Automator/SetiTunes Volume.action/Contents" + } + ] + }, + { + "value": 280, + "name": "SetMovie Annotations.action", + "path": "Automator/SetMovie Annotations.action", + "children": [ + { + "value": 280, + "name": "Contents", + "path": "Automator/SetMovie Annotations.action/Contents" + } + ] + }, + { + "value": 256, + "name": "SetMovie Playback Properties.action", + "path": "Automator/SetMovie Playback Properties.action", + "children": [ + { + "value": 256, + "name": "Contents", + "path": "Automator/SetMovie Playback Properties.action/Contents" + } + ] + }, + { + "value": 0, + "name": "SetMovie URL.action", + "path": "Automator/SetMovie URL.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/SetMovie URL.action/Contents" + } + ] + }, + { + "value": 408, + "name": "SetOptions of iTunes Songs.action", + "path": "Automator/SetOptions of iTunes Songs.action", + "children": [ + { + "value": 408, + "name": "Contents", + "path": "Automator/SetOptions of iTunes Songs.action/Contents" + } + ] + }, + { + "value": 408, + "name": "SetPDF Metadata.action", + "path": "Automator/SetPDF Metadata.action", + "children": [ + { + "value": 408, + "name": "Contents", + "path": "Automator/SetPDF Metadata.action/Contents" + } + ] + }, + { + "value": 8, + "name": "SetSpotlight Comments for Finder Items.action", + "path": "Automator/SetSpotlight Comments for Finder Items.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/SetSpotlight Comments for Finder Items.action/Contents" + } + ] + }, + { + "value": 20, + "name": "SetValue of Variable.action", + "path": "Automator/SetValue of Variable.action", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Automator/SetValue of Variable.action/Contents" + } + ] + }, + { + "value": 8, + "name": "ShowMain iDVD Menu.action", + "path": "Automator/ShowMain iDVD Menu.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ShowMain iDVD Menu.action/Contents" + } + ] + }, + { + "value": 8, + "name": "ShowNext Keynote Slide.action", + "path": "Automator/ShowNext Keynote Slide.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ShowNext Keynote Slide.action/Contents" + } + ] + }, + { + "value": 8, + "name": "ShowPrevious Keynote Slide.action", + "path": "Automator/ShowPrevious Keynote Slide.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/ShowPrevious Keynote Slide.action/Contents" + } + ] + }, + { + "value": 16, + "name": "ShowSpecified Keynote Slide.action", + "path": "Automator/ShowSpecified Keynote Slide.action", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "Automator/ShowSpecified Keynote Slide.action/Contents" + } + ] + }, + { + "value": 36, + "name": "SortFinder Items.action", + "path": "Automator/SortFinder Items.action", + "children": [ + { + "value": 36, + "name": "Contents", + "path": "Automator/SortFinder Items.action/Contents" + } + ] + }, + { + "value": 32, + "name": "SpeakText.action", + "path": "Automator/SpeakText.action", + "children": [ + { + "value": 32, + "name": "Contents", + "path": "Automator/SpeakText.action/Contents" + } + ] + }, + { + "value": 20, + "name": "SpotlightLeopard.action", + "path": "Automator/SpotlightLeopard.action", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Automator/SpotlightLeopard.action/Contents" + } + ] + }, + { + "value": 0, + "name": "StartCapture.action", + "path": "Automator/StartCapture.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/StartCapture.action/Contents" + } + ] + }, + { + "value": 8, + "name": "StartiTunes Playing.action", + "path": "Automator/StartiTunes Playing.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/StartiTunes Playing.action/Contents" + } + ] + }, + { + "value": 8, + "name": "StartiTunes Visuals.action", + "path": "Automator/StartiTunes Visuals.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/StartiTunes Visuals.action/Contents" + } + ] + }, + { + "value": 16, + "name": "StartKeynote Slideshow.action", + "path": "Automator/StartKeynote Slideshow.action", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "Automator/StartKeynote Slideshow.action/Contents" + } + ] + }, + { + "value": 8, + "name": "StartScreen Saver.action", + "path": "Automator/StartScreen Saver.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/StartScreen Saver.action/Contents" + } + ] + }, + { + "value": 0, + "name": "StopCapture.action", + "path": "Automator/StopCapture.action", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Automator/StopCapture.action/Contents" + } + ] + }, + { + "value": 8, + "name": "StopDVD Playback.action", + "path": "Automator/StopDVD Playback.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/StopDVD Playback.action/Contents" + } + ] + }, + { + "value": 8, + "name": "StopiTunes Visuals.action", + "path": "Automator/StopiTunes Visuals.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/StopiTunes Visuals.action/Contents" + } + ] + }, + { + "value": 8, + "name": "StopKeynote Slideshow.action", + "path": "Automator/StopKeynote Slideshow.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/StopKeynote Slideshow.action/Contents" + } + ] + }, + { + "value": 28, + "name": "SystemProfile.action", + "path": "Automator/SystemProfile.action", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "Automator/SystemProfile.action/Contents" + } + ] + }, + { + "value": 276, + "name": "TakePicture.action", + "path": "Automator/TakePicture.action", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Automator/TakePicture.action/Contents" + } + ] + }, + { + "value": 420, + "name": "TakeScreenshot.action", + "path": "Automator/TakeScreenshot.action", + "children": [ + { + "value": 420, + "name": "Contents", + "path": "Automator/TakeScreenshot.action/Contents" + } + ] + }, + { + "value": 20, + "name": "TakeVideo Snapshot.action", + "path": "Automator/TakeVideo Snapshot.action", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Automator/TakeVideo Snapshot.action/Contents" + } + ] + }, + { + "value": 100, + "name": "Textto Audio File.action", + "path": "Automator/Textto Audio File.action", + "children": [ + { + "value": 100, + "name": "Contents", + "path": "Automator/Textto Audio File.action/Contents" + } + ] + }, + { + "value": 436, + "name": "Textto EPUB File.action", + "path": "Automator/Textto EPUB File.action", + "children": [ + { + "value": 436, + "name": "Contents", + "path": "Automator/Textto EPUB File.action/Contents" + } + ] + }, + { + "value": 8, + "name": "UpdateiPod.action", + "path": "Automator/UpdateiPod.action", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Automator/UpdateiPod.action/Contents" + } + ] + }, + { + "value": 264, + "name": "ValidateFont Files.action", + "path": "Automator/ValidateFont Files.action", + "children": [ + { + "value": 264, + "name": "Contents", + "path": "Automator/ValidateFont Files.action/Contents" + } + ] + }, + { + "value": 272, + "name": "ViewResults.action", + "path": "Automator/ViewResults.action", + "children": [ + { + "value": 272, + "name": "Contents", + "path": "Automator/ViewResults.action/Contents" + } + ] + }, + { + "value": 64, + "name": "Waitfor User Action.action", + "path": "Automator/Waitfor User Action.action", + "children": [ + { + "value": 64, + "name": "Contents", + "path": "Automator/Waitfor User Action.action/Contents" + } + ] + }, + { + "value": 456, + "name": "WatchMe Do.action", + "path": "Automator/WatchMe Do.action", + "children": [ + { + "value": 456, + "name": "Contents", + "path": "Automator/WatchMe Do.action/Contents" + } + ] + }, + { + "value": 72, + "name": "WatermarkPDF Documents.action", + "path": "Automator/WatermarkPDF Documents.action", + "children": [ + { + "value": 72, + "name": "Contents", + "path": "Automator/WatermarkPDF Documents.action/Contents" + } + ] + }, + { + "value": 80, + "name": "WebsitePopup.action", + "path": "Automator/WebsitePopup.action", + "children": [ + { + "value": 80, + "name": "Contents", + "path": "Automator/WebsitePopup.action/Contents" + } + ] + } + ] + }, + { + "value": 2868, + "name": "BridgeSupport", + "path": "BridgeSupport", + "children": [ + { + "value": 0, + "name": "include", + "path": "BridgeSupport/include" + }, + { + "value": 2840, + "name": "ruby-2.0", + "path": "BridgeSupport/ruby-2.0" + } + ] + }, + { + "value": 21988, + "name": "Caches", + "path": "Caches", + "children": [ + { + "value": 2296, + "name": "com.apple.CVMS", + "path": "Caches/com.apple.CVMS" + }, + { + "value": 19048, + "name": "com.apple.kext.caches", + "path": "Caches/com.apple.kext.caches", + "children": [ + { + "value": 12, + "name": "Directories", + "path": "Caches/com.apple.kext.caches/Directories" + }, + { + "value": 19036, + "name": "Startup", + "path": "Caches/com.apple.kext.caches/Startup" + } + ] + } + ] + }, + { + "value": 2252, + "name": "ColorPickers", + "path": "ColorPickers", + "children": [ + { + "value": 288, + "name": "NSColorPickerCrayon.colorPicker", + "path": "ColorPickers/NSColorPickerCrayon.colorPicker", + "children": [ + { + "value": 0, + "name": "_CodeSignature", + "path": "ColorPickers/NSColorPickerCrayon.colorPicker/_CodeSignature" + }, + { + "value": 288, + "name": "Resources", + "path": "ColorPickers/NSColorPickerCrayon.colorPicker/Resources" + } + ] + }, + { + "value": 524, + "name": "NSColorPickerPageableNameList.colorPicker", + "path": "ColorPickers/NSColorPickerPageableNameList.colorPicker", + "children": [ + { + "value": 0, + "name": "_CodeSignature", + "path": "ColorPickers/NSColorPickerPageableNameList.colorPicker/_CodeSignature" + }, + { + "value": 524, + "name": "Resources", + "path": "ColorPickers/NSColorPickerPageableNameList.colorPicker/Resources" + } + ] + }, + { + "value": 848, + "name": "NSColorPickerSliders.colorPicker", + "path": "ColorPickers/NSColorPickerSliders.colorPicker", + "children": [ + { + "value": 0, + "name": "_CodeSignature", + "path": "ColorPickers/NSColorPickerSliders.colorPicker/_CodeSignature" + }, + { + "value": 848, + "name": "Resources", + "path": "ColorPickers/NSColorPickerSliders.colorPicker/Resources" + } + ] + }, + { + "value": 532, + "name": "NSColorPickerUser.colorPicker", + "path": "ColorPickers/NSColorPickerUser.colorPicker", + "children": [ + { + "value": 0, + "name": "_CodeSignature", + "path": "ColorPickers/NSColorPickerUser.colorPicker/_CodeSignature" + }, + { + "value": 532, + "name": "Resources", + "path": "ColorPickers/NSColorPickerUser.colorPicker/Resources" + } + ] + }, + { + "value": 60, + "name": "NSColorPickerWheel.colorPicker", + "path": "ColorPickers/NSColorPickerWheel.colorPicker", + "children": [ + { + "value": 0, + "name": "_CodeSignature", + "path": "ColorPickers/NSColorPickerWheel.colorPicker/_CodeSignature" + }, + { + "value": 60, + "name": "Resources", + "path": "ColorPickers/NSColorPickerWheel.colorPicker/Resources" + } + ] + } + ] + }, + { + "value": 0, + "name": "Colors", + "path": "Colors", + "children": [ + { + "value": 0, + "name": "Apple.clr", + "path": "Colors/Apple.clr", + "children": [ + { + "value": 0, + "name": "ar.lproj", + "path": "Colors/Apple.clr/ar.lproj" + }, + { + "value": 0, + "name": "ca.lproj", + "path": "Colors/Apple.clr/ca.lproj" + }, + { + "value": 0, + "name": "cs.lproj", + "path": "Colors/Apple.clr/cs.lproj" + }, + { + "value": 0, + "name": "da.lproj", + "path": "Colors/Apple.clr/da.lproj" + }, + { + "value": 0, + "name": "Dutch.lproj", + "path": "Colors/Apple.clr/Dutch.lproj" + }, + { + "value": 0, + "name": "el.lproj", + "path": "Colors/Apple.clr/el.lproj" + }, + { + "value": 0, + "name": "English.lproj", + "path": "Colors/Apple.clr/English.lproj" + }, + { + "value": 0, + "name": "fi.lproj", + "path": "Colors/Apple.clr/fi.lproj" + }, + { + "value": 0, + "name": "French.lproj", + "path": "Colors/Apple.clr/French.lproj" + }, + { + "value": 0, + "name": "German.lproj", + "path": "Colors/Apple.clr/German.lproj" + }, + { + "value": 0, + "name": "he.lproj", + "path": "Colors/Apple.clr/he.lproj" + }, + { + "value": 0, + "name": "hr.lproj", + "path": "Colors/Apple.clr/hr.lproj" + }, + { + "value": 0, + "name": "hu.lproj", + "path": "Colors/Apple.clr/hu.lproj" + }, + { + "value": 0, + "name": "id.lproj", + "path": "Colors/Apple.clr/id.lproj" + }, + { + "value": 0, + "name": "Italian.lproj", + "path": "Colors/Apple.clr/Italian.lproj" + }, + { + "value": 0, + "name": "Japanese.lproj", + "path": "Colors/Apple.clr/Japanese.lproj" + }, + { + "value": 0, + "name": "ko.lproj", + "path": "Colors/Apple.clr/ko.lproj" + }, + { + "value": 0, + "name": "ms.lproj", + "path": "Colors/Apple.clr/ms.lproj" + }, + { + "value": 0, + "name": "no.lproj", + "path": "Colors/Apple.clr/no.lproj" + }, + { + "value": 0, + "name": "pl.lproj", + "path": "Colors/Apple.clr/pl.lproj" + }, + { + "value": 0, + "name": "pt.lproj", + "path": "Colors/Apple.clr/pt.lproj" + }, + { + "value": 0, + "name": "pt_PT.lproj", + "path": "Colors/Apple.clr/pt_PT.lproj" + }, + { + "value": 0, + "name": "ro.lproj", + "path": "Colors/Apple.clr/ro.lproj" + }, + { + "value": 0, + "name": "ru.lproj", + "path": "Colors/Apple.clr/ru.lproj" + }, + { + "value": 0, + "name": "sk.lproj", + "path": "Colors/Apple.clr/sk.lproj" + }, + { + "value": 0, + "name": "Spanish.lproj", + "path": "Colors/Apple.clr/Spanish.lproj" + }, + { + "value": 0, + "name": "sv.lproj", + "path": "Colors/Apple.clr/sv.lproj" + }, + { + "value": 0, + "name": "th.lproj", + "path": "Colors/Apple.clr/th.lproj" + }, + { + "value": 0, + "name": "tr.lproj", + "path": "Colors/Apple.clr/tr.lproj" + }, + { + "value": 0, + "name": "uk.lproj", + "path": "Colors/Apple.clr/uk.lproj" + }, + { + "value": 0, + "name": "vi.lproj", + "path": "Colors/Apple.clr/vi.lproj" + }, + { + "value": 0, + "name": "zh_CN.lproj", + "path": "Colors/Apple.clr/zh_CN.lproj" + }, + { + "value": 0, + "name": "zh_TW.lproj", + "path": "Colors/Apple.clr/zh_TW.lproj" + } + ] + }, + { + "value": 0, + "name": "Crayons.clr", + "path": "Colors/Crayons.clr", + "children": [ + { + "value": 0, + "name": "ar.lproj", + "path": "Colors/Crayons.clr/ar.lproj" + }, + { + "value": 0, + "name": "ca.lproj", + "path": "Colors/Crayons.clr/ca.lproj" + }, + { + "value": 0, + "name": "cs.lproj", + "path": "Colors/Crayons.clr/cs.lproj" + }, + { + "value": 0, + "name": "da.lproj", + "path": "Colors/Crayons.clr/da.lproj" + }, + { + "value": 0, + "name": "Dutch.lproj", + "path": "Colors/Crayons.clr/Dutch.lproj" + }, + { + "value": 0, + "name": "el.lproj", + "path": "Colors/Crayons.clr/el.lproj" + }, + { + "value": 0, + "name": "English.lproj", + "path": "Colors/Crayons.clr/English.lproj" + }, + { + "value": 0, + "name": "fi.lproj", + "path": "Colors/Crayons.clr/fi.lproj" + }, + { + "value": 0, + "name": "French.lproj", + "path": "Colors/Crayons.clr/French.lproj" + }, + { + "value": 0, + "name": "German.lproj", + "path": "Colors/Crayons.clr/German.lproj" + }, + { + "value": 0, + "name": "he.lproj", + "path": "Colors/Crayons.clr/he.lproj" + }, + { + "value": 0, + "name": "hr.lproj", + "path": "Colors/Crayons.clr/hr.lproj" + }, + { + "value": 0, + "name": "hu.lproj", + "path": "Colors/Crayons.clr/hu.lproj" + }, + { + "value": 0, + "name": "id.lproj", + "path": "Colors/Crayons.clr/id.lproj" + }, + { + "value": 0, + "name": "Italian.lproj", + "path": "Colors/Crayons.clr/Italian.lproj" + }, + { + "value": 0, + "name": "Japanese.lproj", + "path": "Colors/Crayons.clr/Japanese.lproj" + }, + { + "value": 0, + "name": "ko.lproj", + "path": "Colors/Crayons.clr/ko.lproj" + }, + { + "value": 0, + "name": "ms.lproj", + "path": "Colors/Crayons.clr/ms.lproj" + }, + { + "value": 0, + "name": "no.lproj", + "path": "Colors/Crayons.clr/no.lproj" + }, + { + "value": 0, + "name": "pl.lproj", + "path": "Colors/Crayons.clr/pl.lproj" + }, + { + "value": 0, + "name": "pt.lproj", + "path": "Colors/Crayons.clr/pt.lproj" + }, + { + "value": 0, + "name": "pt_PT.lproj", + "path": "Colors/Crayons.clr/pt_PT.lproj" + }, + { + "value": 0, + "name": "ro.lproj", + "path": "Colors/Crayons.clr/ro.lproj" + }, + { + "value": 0, + "name": "ru.lproj", + "path": "Colors/Crayons.clr/ru.lproj" + }, + { + "value": 0, + "name": "sk.lproj", + "path": "Colors/Crayons.clr/sk.lproj" + }, + { + "value": 0, + "name": "Spanish.lproj", + "path": "Colors/Crayons.clr/Spanish.lproj" + }, + { + "value": 0, + "name": "sv.lproj", + "path": "Colors/Crayons.clr/sv.lproj" + }, + { + "value": 0, + "name": "th.lproj", + "path": "Colors/Crayons.clr/th.lproj" + }, + { + "value": 0, + "name": "tr.lproj", + "path": "Colors/Crayons.clr/tr.lproj" + }, + { + "value": 0, + "name": "uk.lproj", + "path": "Colors/Crayons.clr/uk.lproj" + }, + { + "value": 0, + "name": "vi.lproj", + "path": "Colors/Crayons.clr/vi.lproj" + }, + { + "value": 0, + "name": "zh_CN.lproj", + "path": "Colors/Crayons.clr/zh_CN.lproj" + }, + { + "value": 0, + "name": "zh_TW.lproj", + "path": "Colors/Crayons.clr/zh_TW.lproj" + } + ] + }, + { + "value": 0, + "name": "System.clr", + "path": "Colors/System.clr", + "children": [ + { + "value": 0, + "name": "ar.lproj", + "path": "Colors/System.clr/ar.lproj" + }, + { + "value": 0, + "name": "ca.lproj", + "path": "Colors/System.clr/ca.lproj" + }, + { + "value": 0, + "name": "cs.lproj", + "path": "Colors/System.clr/cs.lproj" + }, + { + "value": 0, + "name": "da.lproj", + "path": "Colors/System.clr/da.lproj" + }, + { + "value": 0, + "name": "Dutch.lproj", + "path": "Colors/System.clr/Dutch.lproj" + }, + { + "value": 0, + "name": "el.lproj", + "path": "Colors/System.clr/el.lproj" + }, + { + "value": 0, + "name": "English.lproj", + "path": "Colors/System.clr/English.lproj" + }, + { + "value": 0, + "name": "fi.lproj", + "path": "Colors/System.clr/fi.lproj" + }, + { + "value": 0, + "name": "French.lproj", + "path": "Colors/System.clr/French.lproj" + }, + { + "value": 0, + "name": "German.lproj", + "path": "Colors/System.clr/German.lproj" + }, + { + "value": 0, + "name": "he.lproj", + "path": "Colors/System.clr/he.lproj" + }, + { + "value": 0, + "name": "hr.lproj", + "path": "Colors/System.clr/hr.lproj" + }, + { + "value": 0, + "name": "hu.lproj", + "path": "Colors/System.clr/hu.lproj" + }, + { + "value": 0, + "name": "id.lproj", + "path": "Colors/System.clr/id.lproj" + }, + { + "value": 0, + "name": "Italian.lproj", + "path": "Colors/System.clr/Italian.lproj" + }, + { + "value": 0, + "name": "Japanese.lproj", + "path": "Colors/System.clr/Japanese.lproj" + }, + { + "value": 0, + "name": "ko.lproj", + "path": "Colors/System.clr/ko.lproj" + }, + { + "value": 0, + "name": "ms.lproj", + "path": "Colors/System.clr/ms.lproj" + }, + { + "value": 0, + "name": "no.lproj", + "path": "Colors/System.clr/no.lproj" + }, + { + "value": 0, + "name": "pl.lproj", + "path": "Colors/System.clr/pl.lproj" + }, + { + "value": 0, + "name": "pt.lproj", + "path": "Colors/System.clr/pt.lproj" + }, + { + "value": 0, + "name": "pt_PT.lproj", + "path": "Colors/System.clr/pt_PT.lproj" + }, + { + "value": 0, + "name": "ro.lproj", + "path": "Colors/System.clr/ro.lproj" + }, + { + "value": 0, + "name": "ru.lproj", + "path": "Colors/System.clr/ru.lproj" + }, + { + "value": 0, + "name": "sk.lproj", + "path": "Colors/System.clr/sk.lproj" + }, + { + "value": 0, + "name": "Spanish.lproj", + "path": "Colors/System.clr/Spanish.lproj" + }, + { + "value": 0, + "name": "sv.lproj", + "path": "Colors/System.clr/sv.lproj" + }, + { + "value": 0, + "name": "th.lproj", + "path": "Colors/System.clr/th.lproj" + }, + { + "value": 0, + "name": "tr.lproj", + "path": "Colors/System.clr/tr.lproj" + }, + { + "value": 0, + "name": "uk.lproj", + "path": "Colors/System.clr/uk.lproj" + }, + { + "value": 0, + "name": "vi.lproj", + "path": "Colors/System.clr/vi.lproj" + }, + { + "value": 0, + "name": "zh_CN.lproj", + "path": "Colors/System.clr/zh_CN.lproj" + }, + { + "value": 0, + "name": "zh_TW.lproj", + "path": "Colors/System.clr/zh_TW.lproj" + } + ] + } + ] + }, + { + "value": 2908, + "name": "ColorSync", + "path": "ColorSync", + "children": [ + { + "value": 2868, + "name": "Calibrators", + "path": "ColorSync/Calibrators", + "children": [ + { + "value": 2868, + "name": "DisplayCalibrator.app", + "path": "ColorSync/Calibrators/DisplayCalibrator.app" + } + ] + }, + { + "value": 40, + "name": "Profiles", + "path": "ColorSync/Profiles" + } + ] + }, + { + "value": 21772, + "name": "Components", + "path": "Components", + "children": [ + { + "value": 416, + "name": "AppleScript.component", + "path": "Components/AppleScript.component", + "children": [ + { + "value": 416, + "name": "Contents", + "path": "Components/AppleScript.component/Contents" + } + ] + }, + { + "value": 2592, + "name": "AudioCodecs.component", + "path": "Components/AudioCodecs.component", + "children": [ + { + "value": 2592, + "name": "Contents", + "path": "Components/AudioCodecs.component/Contents" + } + ] + }, + { + "value": 92, + "name": "AUSpeechSynthesis.component", + "path": "Components/AUSpeechSynthesis.component", + "children": [ + { + "value": 92, + "name": "Contents", + "path": "Components/AUSpeechSynthesis.component/Contents" + } + ] + }, + { + "value": 18492, + "name": "CoreAudio.component", + "path": "Components/CoreAudio.component", + "children": [ + { + "value": 18492, + "name": "Contents", + "path": "Components/CoreAudio.component/Contents" + } + ] + }, + { + "value": 28, + "name": "IOFWDVComponents.component", + "path": "Components/IOFWDVComponents.component", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "Components/IOFWDVComponents.component/Contents" + } + ] + }, + { + "value": 16, + "name": "IOQTComponents.component", + "path": "Components/IOQTComponents.component", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "Components/IOQTComponents.component/Contents" + } + ] + }, + { + "value": 12, + "name": "PDFImporter.component", + "path": "Components/PDFImporter.component", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Components/PDFImporter.component/Contents" + } + ] + }, + { + "value": 120, + "name": "SoundManagerComponents.component", + "path": "Components/SoundManagerComponents.component", + "children": [ + { + "value": 120, + "name": "Contents", + "path": "Components/SoundManagerComponents.component/Contents" + } + ] + } + ] + }, + { + "value": 45728, + "name": "Compositions", + "path": "Compositions", + "children": [ + { + "value": 0, + "name": ".Localization.bundle", + "path": "Compositions/.Localization.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Compositions/.Localization.bundle/Contents" + } + ] + } + ] + }, + { + "value": 409060, + "name": "CoreServices", + "path": "CoreServices", + "children": [ + { + "value": 1152, + "name": "AddPrinter.app", + "path": "CoreServices/AddPrinter.app", + "children": [ + { + "value": 1152, + "name": "Contents", + "path": "CoreServices/AddPrinter.app/Contents" + } + ] + }, + { + "value": 72, + "name": "AddressBookUrlForwarder.app", + "path": "CoreServices/AddressBookUrlForwarder.app", + "children": [ + { + "value": 72, + "name": "Contents", + "path": "CoreServices/AddressBookUrlForwarder.app/Contents" + } + ] + }, + { + "value": 20, + "name": "AirPlayUIAgent.app", + "path": "CoreServices/AirPlayUIAgent.app", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "CoreServices/AirPlayUIAgent.app/Contents" + } + ] + }, + { + "value": 56, + "name": "AirPortBase Station Agent.app", + "path": "CoreServices/AirPortBase Station Agent.app", + "children": [ + { + "value": 56, + "name": "Contents", + "path": "CoreServices/AirPortBase Station Agent.app/Contents" + } + ] + }, + { + "value": 92, + "name": "AOS.bundle", + "path": "CoreServices/AOS.bundle", + "children": [ + { + "value": 92, + "name": "Contents", + "path": "CoreServices/AOS.bundle/Contents" + } + ] + }, + { + "value": 1564, + "name": "AppDownloadLauncher.app", + "path": "CoreServices/AppDownloadLauncher.app", + "children": [ + { + "value": 1564, + "name": "Contents", + "path": "CoreServices/AppDownloadLauncher.app/Contents" + } + ] + }, + { + "value": 376, + "name": "Apple80211Agent.app", + "path": "CoreServices/Apple80211Agent.app", + "children": [ + { + "value": 376, + "name": "Contents", + "path": "CoreServices/Apple80211Agent.app/Contents" + } + ] + }, + { + "value": 480, + "name": "AppleFileServer.app", + "path": "CoreServices/AppleFileServer.app", + "children": [ + { + "value": 480, + "name": "Contents", + "path": "CoreServices/AppleFileServer.app/Contents" + } + ] + }, + { + "value": 12, + "name": "AppleGraphicsWarning.app", + "path": "CoreServices/AppleGraphicsWarning.app", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "CoreServices/AppleGraphicsWarning.app/Contents" + } + ] + }, + { + "value": 1752, + "name": "AppleScriptUtility.app", + "path": "CoreServices/AppleScriptUtility.app", + "children": [ + { + "value": 1752, + "name": "Contents", + "path": "CoreServices/AppleScriptUtility.app/Contents" + } + ] + }, + { + "value": 0, + "name": "ApplicationFirewall.bundle", + "path": "CoreServices/ApplicationFirewall.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "CoreServices/ApplicationFirewall.bundle/Contents" + } + ] + }, + { + "value": 14808, + "name": "Applications", + "path": "CoreServices/Applications", + "children": [ + { + "value": 1792, + "name": "NetworkUtility.app", + "path": "CoreServices/Applications/NetworkUtility.app" + }, + { + "value": 7328, + "name": "RAIDUtility.app", + "path": "CoreServices/Applications/RAIDUtility.app" + }, + { + "value": 5688, + "name": "WirelessDiagnostics.app", + "path": "CoreServices/Applications/WirelessDiagnostics.app" + } + ] + }, + { + "value": 6620, + "name": "ArchiveUtility.app", + "path": "CoreServices/ArchiveUtility.app", + "children": [ + { + "value": 6620, + "name": "Contents", + "path": "CoreServices/ArchiveUtility.app/Contents" + } + ] + }, + { + "value": 24, + "name": "AutomatorLauncher.app", + "path": "CoreServices/AutomatorLauncher.app", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "CoreServices/AutomatorLauncher.app/Contents" + } + ] + }, + { + "value": 584, + "name": "AutomatorRunner.app", + "path": "CoreServices/AutomatorRunner.app", + "children": [ + { + "value": 584, + "name": "Contents", + "path": "CoreServices/AutomatorRunner.app/Contents" + } + ] + }, + { + "value": 412, + "name": "AVRCPAgent.app", + "path": "CoreServices/AVRCPAgent.app", + "children": [ + { + "value": 412, + "name": "Contents", + "path": "CoreServices/AVRCPAgent.app/Contents" + } + ] + }, + { + "value": 1400, + "name": "backupd.bundle", + "path": "CoreServices/backupd.bundle", + "children": [ + { + "value": 1400, + "name": "Contents", + "path": "CoreServices/backupd.bundle/Contents" + } + ] + }, + { + "value": 2548, + "name": "BluetoothSetup Assistant.app", + "path": "CoreServices/BluetoothSetup Assistant.app", + "children": [ + { + "value": 2548, + "name": "Contents", + "path": "CoreServices/BluetoothSetup Assistant.app/Contents" + } + ] + }, + { + "value": 2588, + "name": "BluetoothUIServer.app", + "path": "CoreServices/BluetoothUIServer.app", + "children": [ + { + "value": 2588, + "name": "Contents", + "path": "CoreServices/BluetoothUIServer.app/Contents" + } + ] + }, + { + "value": 1288, + "name": "CalendarFileHandler.app", + "path": "CoreServices/CalendarFileHandler.app", + "children": [ + { + "value": 1288, + "name": "Contents", + "path": "CoreServices/CalendarFileHandler.app/Contents" + } + ] + }, + { + "value": 44, + "name": "CaptiveNetwork Assistant.app", + "path": "CoreServices/CaptiveNetwork Assistant.app", + "children": [ + { + "value": 44, + "name": "Contents", + "path": "CoreServices/CaptiveNetwork Assistant.app/Contents" + } + ] + }, + { + "value": 12, + "name": "CarbonSpellChecker.bundle", + "path": "CoreServices/CarbonSpellChecker.bundle", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "CoreServices/CarbonSpellChecker.bundle/Contents" + } + ] + }, + { + "value": 27144, + "name": "CertificateAssistant.app", + "path": "CoreServices/CertificateAssistant.app", + "children": [ + { + "value": 27144, + "name": "Contents", + "path": "CoreServices/CertificateAssistant.app/Contents" + } + ] + }, + { + "value": 28, + "name": "CommonCocoaPanels.bundle", + "path": "CoreServices/CommonCocoaPanels.bundle", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "CoreServices/CommonCocoaPanels.bundle/Contents" + } + ] + }, + { + "value": 676, + "name": "CoreLocationAgent.app", + "path": "CoreServices/CoreLocationAgent.app", + "children": [ + { + "value": 676, + "name": "Contents", + "path": "CoreServices/CoreLocationAgent.app/Contents" + } + ] + }, + { + "value": 164, + "name": "CoreServicesUIAgent.app", + "path": "CoreServices/CoreServicesUIAgent.app", + "children": [ + { + "value": 164, + "name": "Contents", + "path": "CoreServices/CoreServicesUIAgent.app/Contents" + } + ] + }, + { + "value": 171300, + "name": "CoreTypes.bundle", + "path": "CoreServices/CoreTypes.bundle", + "children": [ + { + "value": 171300, + "name": "Contents", + "path": "CoreServices/CoreTypes.bundle/Contents" + } + ] + }, + { + "value": 308, + "name": "DatabaseEvents.app", + "path": "CoreServices/DatabaseEvents.app", + "children": [ + { + "value": 308, + "name": "Contents", + "path": "CoreServices/DatabaseEvents.app/Contents" + } + ] + }, + { + "value": 6104, + "name": "DirectoryUtility.app", + "path": "CoreServices/DirectoryUtility.app", + "children": [ + { + "value": 6104, + "name": "Contents", + "path": "CoreServices/DirectoryUtility.app/Contents" + } + ] + }, + { + "value": 1840, + "name": "DiskImageMounter.app", + "path": "CoreServices/DiskImageMounter.app", + "children": [ + { + "value": 1840, + "name": "Contents", + "path": "CoreServices/DiskImageMounter.app/Contents" + } + ] + }, + { + "value": 8476, + "name": "Dock.app", + "path": "CoreServices/Dock.app", + "children": [ + { + "value": 8476, + "name": "Contents", + "path": "CoreServices/Dock.app/Contents" + } + ] + }, + { + "value": 696, + "name": "Encodings", + "path": "CoreServices/Encodings" + }, + { + "value": 1024, + "name": "ExpansionSlot Utility.app", + "path": "CoreServices/ExpansionSlot Utility.app", + "children": [ + { + "value": 1024, + "name": "Contents", + "path": "CoreServices/ExpansionSlot Utility.app/Contents" + } + ] + }, + { + "value": 1732, + "name": "FileSync.app", + "path": "CoreServices/FileSync.app", + "children": [ + { + "value": 1732, + "name": "Contents", + "path": "CoreServices/FileSync.app/Contents" + } + ] + }, + { + "value": 572, + "name": "FileSyncAgent.app", + "path": "CoreServices/FileSyncAgent.app", + "children": [ + { + "value": 572, + "name": "Contents", + "path": "CoreServices/FileSyncAgent.app/Contents" + } + ] + }, + { + "value": 35168, + "name": "Finder.app", + "path": "CoreServices/Finder.app", + "children": [ + { + "value": 35168, + "name": "Contents", + "path": "CoreServices/Finder.app/Contents" + } + ] + }, + { + "value": 0, + "name": "FirmwareUpdates", + "path": "CoreServices/FirmwareUpdates" + }, + { + "value": 336, + "name": "FolderActions Dispatcher.app", + "path": "CoreServices/FolderActions Dispatcher.app", + "children": [ + { + "value": 336, + "name": "Contents", + "path": "CoreServices/FolderActions Dispatcher.app/Contents" + } + ] + }, + { + "value": 1820, + "name": "FolderActions Setup.app", + "path": "CoreServices/FolderActions Setup.app", + "children": [ + { + "value": 1820, + "name": "Contents", + "path": "CoreServices/FolderActions Setup.app/Contents" + } + ] + }, + { + "value": 3268, + "name": "HelpViewer.app", + "path": "CoreServices/HelpViewer.app", + "children": [ + { + "value": 3268, + "name": "Contents", + "path": "CoreServices/HelpViewer.app/Contents" + } + ] + }, + { + "value": 352, + "name": "ImageEvents.app", + "path": "CoreServices/ImageEvents.app", + "children": [ + { + "value": 352, + "name": "Contents", + "path": "CoreServices/ImageEvents.app/Contents" + } + ] + }, + { + "value": 2012, + "name": "InstallCommand Line Developer Tools.app", + "path": "CoreServices/InstallCommand Line Developer Tools.app", + "children": [ + { + "value": 2012, + "name": "Contents", + "path": "CoreServices/InstallCommand Line Developer Tools.app/Contents" + } + ] + }, + { + "value": 108, + "name": "Installin Progress.app", + "path": "CoreServices/Installin Progress.app", + "children": [ + { + "value": 108, + "name": "Contents", + "path": "CoreServices/Installin Progress.app/Contents" + } + ] + }, + { + "value": 7444, + "name": "Installer.app", + "path": "CoreServices/Installer.app", + "children": [ + { + "value": 7444, + "name": "Contents", + "path": "CoreServices/Installer.app/Contents" + } + ] + }, + { + "value": 8, + "name": "InstallerStatusNotifications.bundle", + "path": "CoreServices/InstallerStatusNotifications.bundle", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "CoreServices/InstallerStatusNotifications.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "InternetSharing.bundle", + "path": "CoreServices/InternetSharing.bundle", + "children": [ + { + "value": 0, + "name": "Resources", + "path": "CoreServices/InternetSharing.bundle/Resources" + } + ] + }, + { + "value": 244, + "name": "JarLauncher.app", + "path": "CoreServices/JarLauncher.app", + "children": [ + { + "value": 244, + "name": "Contents", + "path": "CoreServices/JarLauncher.app/Contents" + } + ] + }, + { + "value": 152, + "name": "JavaWeb Start.app", + "path": "CoreServices/JavaWeb Start.app", + "children": [ + { + "value": 152, + "name": "Contents", + "path": "CoreServices/JavaWeb Start.app/Contents" + } + ] + }, + { + "value": 12, + "name": "KernelEventAgent.bundle", + "path": "CoreServices/KernelEventAgent.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "CoreServices/KernelEventAgent.bundle/Contents" + }, + { + "value": 12, + "name": "FileSystemUIAgent.app", + "path": "CoreServices/KernelEventAgent.bundle/FileSystemUIAgent.app" + } + ] + }, + { + "value": 1016, + "name": "KeyboardSetupAssistant.app", + "path": "CoreServices/KeyboardSetupAssistant.app", + "children": [ + { + "value": 1016, + "name": "Contents", + "path": "CoreServices/KeyboardSetupAssistant.app/Contents" + } + ] + }, + { + "value": 840, + "name": "KeychainCircle Notification.app", + "path": "CoreServices/KeychainCircle Notification.app", + "children": [ + { + "value": 840, + "name": "Contents", + "path": "CoreServices/KeychainCircle Notification.app/Contents" + } + ] + }, + { + "value": 1448, + "name": "LanguageChooser.app", + "path": "CoreServices/LanguageChooser.app", + "children": [ + { + "value": 1448, + "name": "Contents", + "path": "CoreServices/LanguageChooser.app/Contents" + } + ] + }, + { + "value": 868, + "name": "LocationMenu.app", + "path": "CoreServices/LocationMenu.app", + "children": [ + { + "value": 868, + "name": "Contents", + "path": "CoreServices/LocationMenu.app/Contents" + } + ] + }, + { + "value": 8260, + "name": "loginwindow.app", + "path": "CoreServices/loginwindow.app", + "children": [ + { + "value": 8260, + "name": "Contents", + "path": "CoreServices/loginwindow.app/Contents" + } + ] + }, + { + "value": 3632, + "name": "ManagedClient.app", + "path": "CoreServices/ManagedClient.app", + "children": [ + { + "value": 3632, + "name": "Contents", + "path": "CoreServices/ManagedClient.app/Contents" + } + ] + }, + { + "value": 0, + "name": "mDNSResponder.bundle", + "path": "CoreServices/mDNSResponder.bundle", + "children": [ + { + "value": 0, + "name": "Resources", + "path": "CoreServices/mDNSResponder.bundle/Resources" + } + ] + }, + { + "value": 420, + "name": "MemorySlot Utility.app", + "path": "CoreServices/MemorySlot Utility.app", + "children": [ + { + "value": 420, + "name": "Contents", + "path": "CoreServices/MemorySlot Utility.app/Contents" + } + ] + }, + { + "value": 4272, + "name": "MenuExtras", + "path": "CoreServices/MenuExtras", + "children": [ + { + "value": 416, + "name": "AirPort.menu", + "path": "CoreServices/MenuExtras/AirPort.menu" + }, + { + "value": 788, + "name": "Battery.menu", + "path": "CoreServices/MenuExtras/Battery.menu" + }, + { + "value": 112, + "name": "Bluetooth.menu", + "path": "CoreServices/MenuExtras/Bluetooth.menu" + }, + { + "value": 12, + "name": "Clock.menu", + "path": "CoreServices/MenuExtras/Clock.menu" + }, + { + "value": 84, + "name": "Displays.menu", + "path": "CoreServices/MenuExtras/Displays.menu" + }, + { + "value": 32, + "name": "Eject.menu", + "path": "CoreServices/MenuExtras/Eject.menu" + }, + { + "value": 24, + "name": "ExpressCard.menu", + "path": "CoreServices/MenuExtras/ExpressCard.menu" + }, + { + "value": 76, + "name": "Fax.menu", + "path": "CoreServices/MenuExtras/Fax.menu" + }, + { + "value": 112, + "name": "HomeSync.menu", + "path": "CoreServices/MenuExtras/HomeSync.menu" + }, + { + "value": 84, + "name": "iChat.menu", + "path": "CoreServices/MenuExtras/iChat.menu" + }, + { + "value": 28, + "name": "Ink.menu", + "path": "CoreServices/MenuExtras/Ink.menu" + }, + { + "value": 104, + "name": "IrDA.menu", + "path": "CoreServices/MenuExtras/IrDA.menu" + }, + { + "value": 68, + "name": "PPP.menu", + "path": "CoreServices/MenuExtras/PPP.menu" + }, + { + "value": 24, + "name": "PPPoE.menu", + "path": "CoreServices/MenuExtras/PPPoE.menu" + }, + { + "value": 60, + "name": "RemoteDesktop.menu", + "path": "CoreServices/MenuExtras/RemoteDesktop.menu" + }, + { + "value": 48, + "name": "Script Menu.menu", + "path": "CoreServices/MenuExtras/Script Menu.menu" + }, + { + "value": 832, + "name": "TextInput.menu", + "path": "CoreServices/MenuExtras/TextInput.menu" + }, + { + "value": 144, + "name": "TimeMachine.menu", + "path": "CoreServices/MenuExtras/TimeMachine.menu" + }, + { + "value": 40, + "name": "UniversalAccess.menu", + "path": "CoreServices/MenuExtras/UniversalAccess.menu" + }, + { + "value": 108, + "name": "User.menu", + "path": "CoreServices/MenuExtras/User.menu" + }, + { + "value": 316, + "name": "Volume.menu", + "path": "CoreServices/MenuExtras/Volume.menu" + }, + { + "value": 48, + "name": "VPN.menu", + "path": "CoreServices/MenuExtras/VPN.menu" + }, + { + "value": 712, + "name": "WWAN.menu", + "path": "CoreServices/MenuExtras/WWAN.menu" + } + ] + }, + { + "value": 16, + "name": "MLTEFile.bundle", + "path": "CoreServices/MLTEFile.bundle", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "CoreServices/MLTEFile.bundle/Contents" + } + ] + }, + { + "value": 616, + "name": "MRTAgent.app", + "path": "CoreServices/MRTAgent.app", + "children": [ + { + "value": 616, + "name": "Contents", + "path": "CoreServices/MRTAgent.app/Contents" + } + ] + }, + { + "value": 1540, + "name": "NetAuthAgent.app", + "path": "CoreServices/NetAuthAgent.app", + "children": [ + { + "value": 1540, + "name": "Contents", + "path": "CoreServices/NetAuthAgent.app/Contents" + } + ] + }, + { + "value": 3388, + "name": "NetworkDiagnostics.app", + "path": "CoreServices/NetworkDiagnostics.app", + "children": [ + { + "value": 3388, + "name": "Contents", + "path": "CoreServices/NetworkDiagnostics.app/Contents" + } + ] + }, + { + "value": 9384, + "name": "NetworkSetup Assistant.app", + "path": "CoreServices/NetworkSetup Assistant.app", + "children": [ + { + "value": 9384, + "name": "Contents", + "path": "CoreServices/NetworkSetup Assistant.app/Contents" + } + ] + }, + { + "value": 716, + "name": "NotificationCenter.app", + "path": "CoreServices/NotificationCenter.app", + "children": [ + { + "value": 716, + "name": "Contents", + "path": "CoreServices/NotificationCenter.app/Contents" + } + ] + }, + { + "value": 948, + "name": "OBEXAgent.app", + "path": "CoreServices/OBEXAgent.app", + "children": [ + { + "value": 948, + "name": "Contents", + "path": "CoreServices/OBEXAgent.app/Contents" + } + ] + }, + { + "value": 1596, + "name": "ODSAgent.app", + "path": "CoreServices/ODSAgent.app", + "children": [ + { + "value": 1596, + "name": "Contents", + "path": "CoreServices/ODSAgent.app/Contents" + } + ] + }, + { + "value": 492, + "name": "PassViewer.app", + "path": "CoreServices/PassViewer.app", + "children": [ + { + "value": 492, + "name": "Contents", + "path": "CoreServices/PassViewer.app/Contents" + } + ] + }, + { + "value": 0, + "name": "PerformanceMetricLocalizations.bundle", + "path": "CoreServices/PerformanceMetricLocalizations.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "CoreServices/PerformanceMetricLocalizations.bundle/Contents" + } + ] + }, + { + "value": 88, + "name": "powerd.bundle", + "path": "CoreServices/powerd.bundle", + "children": [ + { + "value": 0, + "name": "_CodeSignature", + "path": "CoreServices/powerd.bundle/_CodeSignature" + }, + { + "value": 0, + "name": "ar.lproj", + "path": "CoreServices/powerd.bundle/ar.lproj" + }, + { + "value": 0, + "name": "ca.lproj", + "path": "CoreServices/powerd.bundle/ca.lproj" + }, + { + "value": 0, + "name": "cs.lproj", + "path": "CoreServices/powerd.bundle/cs.lproj" + }, + { + "value": 0, + "name": "da.lproj", + "path": "CoreServices/powerd.bundle/da.lproj" + }, + { + "value": 0, + "name": "Dutch.lproj", + "path": "CoreServices/powerd.bundle/Dutch.lproj" + }, + { + "value": 0, + "name": "el.lproj", + "path": "CoreServices/powerd.bundle/el.lproj" + }, + { + "value": 0, + "name": "English.lproj", + "path": "CoreServices/powerd.bundle/English.lproj" + }, + { + "value": 0, + "name": "fi.lproj", + "path": "CoreServices/powerd.bundle/fi.lproj" + }, + { + "value": 0, + "name": "French.lproj", + "path": "CoreServices/powerd.bundle/French.lproj" + }, + { + "value": 0, + "name": "German.lproj", + "path": "CoreServices/powerd.bundle/German.lproj" + }, + { + "value": 0, + "name": "he.lproj", + "path": "CoreServices/powerd.bundle/he.lproj" + }, + { + "value": 0, + "name": "hr.lproj", + "path": "CoreServices/powerd.bundle/hr.lproj" + }, + { + "value": 0, + "name": "hu.lproj", + "path": "CoreServices/powerd.bundle/hu.lproj" + }, + { + "value": 0, + "name": "id.lproj", + "path": "CoreServices/powerd.bundle/id.lproj" + }, + { + "value": 0, + "name": "Italian.lproj", + "path": "CoreServices/powerd.bundle/Italian.lproj" + }, + { + "value": 0, + "name": "Japanese.lproj", + "path": "CoreServices/powerd.bundle/Japanese.lproj" + }, + { + "value": 0, + "name": "ko.lproj", + "path": "CoreServices/powerd.bundle/ko.lproj" + }, + { + "value": 0, + "name": "ms.lproj", + "path": "CoreServices/powerd.bundle/ms.lproj" + }, + { + "value": 0, + "name": "no.lproj", + "path": "CoreServices/powerd.bundle/no.lproj" + }, + { + "value": 0, + "name": "pl.lproj", + "path": "CoreServices/powerd.bundle/pl.lproj" + }, + { + "value": 0, + "name": "pt.lproj", + "path": "CoreServices/powerd.bundle/pt.lproj" + }, + { + "value": 0, + "name": "pt_PT.lproj", + "path": "CoreServices/powerd.bundle/pt_PT.lproj" + }, + { + "value": 0, + "name": "ro.lproj", + "path": "CoreServices/powerd.bundle/ro.lproj" + }, + { + "value": 0, + "name": "ru.lproj", + "path": "CoreServices/powerd.bundle/ru.lproj" + }, + { + "value": 0, + "name": "sk.lproj", + "path": "CoreServices/powerd.bundle/sk.lproj" + }, + { + "value": 0, + "name": "Spanish.lproj", + "path": "CoreServices/powerd.bundle/Spanish.lproj" + }, + { + "value": 0, + "name": "sv.lproj", + "path": "CoreServices/powerd.bundle/sv.lproj" + }, + { + "value": 0, + "name": "th.lproj", + "path": "CoreServices/powerd.bundle/th.lproj" + }, + { + "value": 0, + "name": "tr.lproj", + "path": "CoreServices/powerd.bundle/tr.lproj" + }, + { + "value": 0, + "name": "uk.lproj", + "path": "CoreServices/powerd.bundle/uk.lproj" + }, + { + "value": 0, + "name": "vi.lproj", + "path": "CoreServices/powerd.bundle/vi.lproj" + }, + { + "value": 0, + "name": "zh_CN.lproj", + "path": "CoreServices/powerd.bundle/zh_CN.lproj" + }, + { + "value": 0, + "name": "zh_TW.lproj", + "path": "CoreServices/powerd.bundle/zh_TW.lproj" + } + ] + }, + { + "value": 776, + "name": "ProblemReporter.app", + "path": "CoreServices/ProblemReporter.app", + "children": [ + { + "value": 776, + "name": "Contents", + "path": "CoreServices/ProblemReporter.app/Contents" + } + ] + }, + { + "value": 4748, + "name": "RawCamera.bundle", + "path": "CoreServices/RawCamera.bundle", + "children": [ + { + "value": 4748, + "name": "Contents", + "path": "CoreServices/RawCamera.bundle/Contents" + } + ] + }, + { + "value": 2112, + "name": "RawCameraSupport.bundle", + "path": "CoreServices/RawCameraSupport.bundle", + "children": [ + { + "value": 2112, + "name": "Contents", + "path": "CoreServices/RawCameraSupport.bundle/Contents" + } + ] + }, + { + "value": 24, + "name": "rcd.app", + "path": "CoreServices/rcd.app", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "CoreServices/rcd.app/Contents" + } + ] + }, + { + "value": 156, + "name": "RegisterPluginIMApp.app", + "path": "CoreServices/RegisterPluginIMApp.app", + "children": [ + { + "value": 156, + "name": "Contents", + "path": "CoreServices/RegisterPluginIMApp.app/Contents" + } + ] + }, + { + "value": 3504, + "name": "RemoteManagement", + "path": "CoreServices/RemoteManagement", + "children": [ + { + "value": 872, + "name": "AppleVNCServer.bundle", + "path": "CoreServices/RemoteManagement/AppleVNCServer.bundle" + }, + { + "value": 2260, + "name": "ARDAgent.app", + "path": "CoreServices/RemoteManagement/ARDAgent.app" + }, + { + "value": 144, + "name": "ScreensharingAgent.bundle", + "path": "CoreServices/RemoteManagement/ScreensharingAgent.bundle" + }, + { + "value": 228, + "name": "screensharingd.bundle", + "path": "CoreServices/RemoteManagement/screensharingd.bundle" + } + ] + }, + { + "value": 672, + "name": "ReportPanic.app", + "path": "CoreServices/ReportPanic.app", + "children": [ + { + "value": 672, + "name": "Contents", + "path": "CoreServices/ReportPanic.app/Contents" + } + ] + }, + { + "value": 0, + "name": "Resources", + "path": "CoreServices/Resources", + "children": [ + { + "value": 0, + "name": "ar.lproj", + "path": "CoreServices/Resources/ar.lproj" + }, + { + "value": 0, + "name": "ca.lproj", + "path": "CoreServices/Resources/ca.lproj" + }, + { + "value": 0, + "name": "cs.lproj", + "path": "CoreServices/Resources/cs.lproj" + }, + { + "value": 0, + "name": "da.lproj", + "path": "CoreServices/Resources/da.lproj" + }, + { + "value": 0, + "name": "Dutch.lproj", + "path": "CoreServices/Resources/Dutch.lproj" + }, + { + "value": 0, + "name": "el.lproj", + "path": "CoreServices/Resources/el.lproj" + }, + { + "value": 0, + "name": "English.lproj", + "path": "CoreServices/Resources/English.lproj" + }, + { + "value": 0, + "name": "fi.lproj", + "path": "CoreServices/Resources/fi.lproj" + }, + { + "value": 0, + "name": "French.lproj", + "path": "CoreServices/Resources/French.lproj" + }, + { + "value": 0, + "name": "German.lproj", + "path": "CoreServices/Resources/German.lproj" + }, + { + "value": 0, + "name": "he.lproj", + "path": "CoreServices/Resources/he.lproj" + }, + { + "value": 0, + "name": "hr.lproj", + "path": "CoreServices/Resources/hr.lproj" + }, + { + "value": 0, + "name": "hu.lproj", + "path": "CoreServices/Resources/hu.lproj" + }, + { + "value": 0, + "name": "id.lproj", + "path": "CoreServices/Resources/id.lproj" + }, + { + "value": 0, + "name": "Italian.lproj", + "path": "CoreServices/Resources/Italian.lproj" + }, + { + "value": 0, + "name": "Japanese.lproj", + "path": "CoreServices/Resources/Japanese.lproj" + }, + { + "value": 0, + "name": "ko.lproj", + "path": "CoreServices/Resources/ko.lproj" + }, + { + "value": 0, + "name": "ms.lproj", + "path": "CoreServices/Resources/ms.lproj" + }, + { + "value": 0, + "name": "no.lproj", + "path": "CoreServices/Resources/no.lproj" + }, + { + "value": 0, + "name": "pl.lproj", + "path": "CoreServices/Resources/pl.lproj" + }, + { + "value": 0, + "name": "Profiles", + "path": "CoreServices/Resources/Profiles" + }, + { + "value": 0, + "name": "pt.lproj", + "path": "CoreServices/Resources/pt.lproj" + }, + { + "value": 0, + "name": "pt_PT.lproj", + "path": "CoreServices/Resources/pt_PT.lproj" + }, + { + "value": 0, + "name": "ro.lproj", + "path": "CoreServices/Resources/ro.lproj" + }, + { + "value": 0, + "name": "ru.lproj", + "path": "CoreServices/Resources/ru.lproj" + }, + { + "value": 0, + "name": "sk.lproj", + "path": "CoreServices/Resources/sk.lproj" + }, + { + "value": 0, + "name": "Spanish.lproj", + "path": "CoreServices/Resources/Spanish.lproj" + }, + { + "value": 0, + "name": "sv.lproj", + "path": "CoreServices/Resources/sv.lproj" + }, + { + "value": 0, + "name": "th.lproj", + "path": "CoreServices/Resources/th.lproj" + }, + { + "value": 0, + "name": "tr.lproj", + "path": "CoreServices/Resources/tr.lproj" + }, + { + "value": 0, + "name": "uk.lproj", + "path": "CoreServices/Resources/uk.lproj" + }, + { + "value": 0, + "name": "vi.lproj", + "path": "CoreServices/Resources/vi.lproj" + }, + { + "value": 0, + "name": "zh_CN.lproj", + "path": "CoreServices/Resources/zh_CN.lproj" + }, + { + "value": 0, + "name": "zh_TW.lproj", + "path": "CoreServices/Resources/zh_TW.lproj" + } + ] + }, + { + "value": 20, + "name": "RFBEventHelper.bundle", + "path": "CoreServices/RFBEventHelper.bundle", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "CoreServices/RFBEventHelper.bundle/Contents" + } + ] + }, + { + "value": 3304, + "name": "ScreenSharing.app", + "path": "CoreServices/ScreenSharing.app", + "children": [ + { + "value": 3304, + "name": "Contents", + "path": "CoreServices/ScreenSharing.app/Contents" + } + ] + }, + { + "value": 244, + "name": "Search.bundle", + "path": "CoreServices/Search.bundle", + "children": [ + { + "value": 244, + "name": "Contents", + "path": "CoreServices/Search.bundle/Contents" + } + ] + }, + { + "value": 4128, + "name": "SecurityAgentPlugins", + "path": "CoreServices/SecurityAgentPlugins", + "children": [ + { + "value": 304, + "name": "DiskUnlock.bundle", + "path": "CoreServices/SecurityAgentPlugins/DiskUnlock.bundle" + }, + { + "value": 1192, + "name": "FamilyControls.bundle", + "path": "CoreServices/SecurityAgentPlugins/FamilyControls.bundle" + }, + { + "value": 340, + "name": "HomeDirMechanism.bundle", + "path": "CoreServices/SecurityAgentPlugins/HomeDirMechanism.bundle" + }, + { + "value": 1156, + "name": "KerberosAgent.bundle", + "path": "CoreServices/SecurityAgentPlugins/KerberosAgent.bundle" + }, + { + "value": 276, + "name": "loginKC.bundle", + "path": "CoreServices/SecurityAgentPlugins/loginKC.bundle" + }, + { + "value": 104, + "name": "loginwindow.bundle", + "path": "CoreServices/SecurityAgentPlugins/loginwindow.bundle" + }, + { + "value": 384, + "name": "MCXMechanism.bundle", + "path": "CoreServices/SecurityAgentPlugins/MCXMechanism.bundle" + }, + { + "value": 12, + "name": "PKINITMechanism.bundle", + "path": "CoreServices/SecurityAgentPlugins/PKINITMechanism.bundle" + }, + { + "value": 360, + "name": "RestartAuthorization.bundle", + "path": "CoreServices/SecurityAgentPlugins/RestartAuthorization.bundle" + } + ] + }, + { + "value": 328, + "name": "SecurityFixer.app", + "path": "CoreServices/SecurityFixer.app", + "children": [ + { + "value": 328, + "name": "Contents", + "path": "CoreServices/SecurityFixer.app/Contents" + } + ] + }, + { + "value": 28200, + "name": "SetupAssistant.app", + "path": "CoreServices/SetupAssistant.app", + "children": [ + { + "value": 28200, + "name": "Contents", + "path": "CoreServices/SetupAssistant.app/Contents" + } + ] + }, + { + "value": 164, + "name": "SetupAssistantPlugins", + "path": "CoreServices/SetupAssistantPlugins", + "children": [ + { + "value": 8, + "name": "AppStore.icdplugin", + "path": "CoreServices/SetupAssistantPlugins/AppStore.icdplugin" + }, + { + "value": 8, + "name": "Calendar.flplugin", + "path": "CoreServices/SetupAssistantPlugins/Calendar.flplugin" + }, + { + "value": 8, + "name": "FaceTime.icdplugin", + "path": "CoreServices/SetupAssistantPlugins/FaceTime.icdplugin" + }, + { + "value": 8, + "name": "Fonts.flplugin", + "path": "CoreServices/SetupAssistantPlugins/Fonts.flplugin" + }, + { + "value": 16, + "name": "GameCenter.icdplugin", + "path": "CoreServices/SetupAssistantPlugins/GameCenter.icdplugin" + }, + { + "value": 8, + "name": "Helpd.flplugin", + "path": "CoreServices/SetupAssistantPlugins/Helpd.flplugin" + }, + { + "value": 8, + "name": "iBooks.icdplugin", + "path": "CoreServices/SetupAssistantPlugins/iBooks.icdplugin" + }, + { + "value": 16, + "name": "IdentityServices.icdplugin", + "path": "CoreServices/SetupAssistantPlugins/IdentityServices.icdplugin" + }, + { + "value": 8, + "name": "iMessage.icdplugin", + "path": "CoreServices/SetupAssistantPlugins/iMessage.icdplugin" + }, + { + "value": 8, + "name": "LaunchServices.flplugin", + "path": "CoreServices/SetupAssistantPlugins/LaunchServices.flplugin" + }, + { + "value": 12, + "name": "Mail.flplugin", + "path": "CoreServices/SetupAssistantPlugins/Mail.flplugin" + }, + { + "value": 8, + "name": "QuickLook.flplugin", + "path": "CoreServices/SetupAssistantPlugins/QuickLook.flplugin" + }, + { + "value": 8, + "name": "Safari.flplugin", + "path": "CoreServices/SetupAssistantPlugins/Safari.flplugin" + }, + { + "value": 8, + "name": "ServicesMenu.flplugin", + "path": "CoreServices/SetupAssistantPlugins/ServicesMenu.flplugin" + }, + { + "value": 8, + "name": "SoftwareUpdateActions.flplugin", + "path": "CoreServices/SetupAssistantPlugins/SoftwareUpdateActions.flplugin" + }, + { + "value": 8, + "name": "Spotlight.flplugin", + "path": "CoreServices/SetupAssistantPlugins/Spotlight.flplugin" + }, + { + "value": 16, + "name": "UAU.flplugin", + "path": "CoreServices/SetupAssistantPlugins/UAU.flplugin" + } + ] + }, + { + "value": 48, + "name": "SocialPushAgent.app", + "path": "CoreServices/SocialPushAgent.app", + "children": [ + { + "value": 48, + "name": "Contents", + "path": "CoreServices/SocialPushAgent.app/Contents" + } + ] + }, + { + "value": 2196, + "name": "SoftwareUpdate.app", + "path": "CoreServices/SoftwareUpdate.app", + "children": [ + { + "value": 2196, + "name": "Contents", + "path": "CoreServices/SoftwareUpdate.app/Contents" + } + ] + }, + { + "value": 856, + "name": "Spotlight.app", + "path": "CoreServices/Spotlight.app", + "children": [ + { + "value": 856, + "name": "Contents", + "path": "CoreServices/Spotlight.app/Contents" + } + ] + }, + { + "value": 384, + "name": "SystemEvents.app", + "path": "CoreServices/SystemEvents.app", + "children": [ + { + "value": 384, + "name": "Contents", + "path": "CoreServices/SystemEvents.app/Contents" + } + ] + }, + { + "value": 2152, + "name": "SystemImage Utility.app", + "path": "CoreServices/SystemImage Utility.app", + "children": [ + { + "value": 2152, + "name": "Contents", + "path": "CoreServices/SystemImage Utility.app/Contents" + } + ] + }, + { + "value": 0, + "name": "SystemFolderLocalizations", + "path": "CoreServices/SystemFolderLocalizations", + "children": [ + { + "value": 0, + "name": "ar.lproj", + "path": "CoreServices/SystemFolderLocalizations/ar.lproj" + }, + { + "value": 0, + "name": "ca.lproj", + "path": "CoreServices/SystemFolderLocalizations/ca.lproj" + }, + { + "value": 0, + "name": "cs.lproj", + "path": "CoreServices/SystemFolderLocalizations/cs.lproj" + }, + { + "value": 0, + "name": "da.lproj", + "path": "CoreServices/SystemFolderLocalizations/da.lproj" + }, + { + "value": 0, + "name": "de.lproj", + "path": "CoreServices/SystemFolderLocalizations/de.lproj" + }, + { + "value": 0, + "name": "el.lproj", + "path": "CoreServices/SystemFolderLocalizations/el.lproj" + }, + { + "value": 0, + "name": "en.lproj", + "path": "CoreServices/SystemFolderLocalizations/en.lproj" + }, + { + "value": 0, + "name": "es.lproj", + "path": "CoreServices/SystemFolderLocalizations/es.lproj" + }, + { + "value": 0, + "name": "fi.lproj", + "path": "CoreServices/SystemFolderLocalizations/fi.lproj" + }, + { + "value": 0, + "name": "fr.lproj", + "path": "CoreServices/SystemFolderLocalizations/fr.lproj" + }, + { + "value": 0, + "name": "he.lproj", + "path": "CoreServices/SystemFolderLocalizations/he.lproj" + }, + { + "value": 0, + "name": "hr.lproj", + "path": "CoreServices/SystemFolderLocalizations/hr.lproj" + }, + { + "value": 0, + "name": "hu.lproj", + "path": "CoreServices/SystemFolderLocalizations/hu.lproj" + }, + { + "value": 0, + "name": "id.lproj", + "path": "CoreServices/SystemFolderLocalizations/id.lproj" + }, + { + "value": 0, + "name": "it.lproj", + "path": "CoreServices/SystemFolderLocalizations/it.lproj" + }, + { + "value": 0, + "name": "ja.lproj", + "path": "CoreServices/SystemFolderLocalizations/ja.lproj" + }, + { + "value": 0, + "name": "ko.lproj", + "path": "CoreServices/SystemFolderLocalizations/ko.lproj" + }, + { + "value": 0, + "name": "ms.lproj", + "path": "CoreServices/SystemFolderLocalizations/ms.lproj" + }, + { + "value": 0, + "name": "nl.lproj", + "path": "CoreServices/SystemFolderLocalizations/nl.lproj" + }, + { + "value": 0, + "name": "no.lproj", + "path": "CoreServices/SystemFolderLocalizations/no.lproj" + }, + { + "value": 0, + "name": "pl.lproj", + "path": "CoreServices/SystemFolderLocalizations/pl.lproj" + }, + { + "value": 0, + "name": "pt.lproj", + "path": "CoreServices/SystemFolderLocalizations/pt.lproj" + }, + { + "value": 0, + "name": "pt_PT.lproj", + "path": "CoreServices/SystemFolderLocalizations/pt_PT.lproj" + }, + { + "value": 0, + "name": "ro.lproj", + "path": "CoreServices/SystemFolderLocalizations/ro.lproj" + }, + { + "value": 0, + "name": "ru.lproj", + "path": "CoreServices/SystemFolderLocalizations/ru.lproj" + }, + { + "value": 0, + "name": "sk.lproj", + "path": "CoreServices/SystemFolderLocalizations/sk.lproj" + }, + { + "value": 0, + "name": "sv.lproj", + "path": "CoreServices/SystemFolderLocalizations/sv.lproj" + }, + { + "value": 0, + "name": "th.lproj", + "path": "CoreServices/SystemFolderLocalizations/th.lproj" + }, + { + "value": 0, + "name": "tr.lproj", + "path": "CoreServices/SystemFolderLocalizations/tr.lproj" + }, + { + "value": 0, + "name": "uk.lproj", + "path": "CoreServices/SystemFolderLocalizations/uk.lproj" + }, + { + "value": 0, + "name": "vi.lproj", + "path": "CoreServices/SystemFolderLocalizations/vi.lproj" + }, + { + "value": 0, + "name": "zh_CN.lproj", + "path": "CoreServices/SystemFolderLocalizations/zh_CN.lproj" + }, + { + "value": 0, + "name": "zh_TW.lproj", + "path": "CoreServices/SystemFolderLocalizations/zh_TW.lproj" + } + ] + }, + { + "value": 852, + "name": "SystemUIServer.app", + "path": "CoreServices/SystemUIServer.app", + "children": [ + { + "value": 852, + "name": "Contents", + "path": "CoreServices/SystemUIServer.app/Contents" + } + ] + }, + { + "value": 132, + "name": "SystemVersion.bundle", + "path": "CoreServices/SystemVersion.bundle", + "children": [ + { + "value": 4, + "name": "ar.lproj", + "path": "CoreServices/SystemVersion.bundle/ar.lproj" + }, + { + "value": 4, + "name": "ca.lproj", + "path": "CoreServices/SystemVersion.bundle/ca.lproj" + }, + { + "value": 4, + "name": "cs.lproj", + "path": "CoreServices/SystemVersion.bundle/cs.lproj" + }, + { + "value": 4, + "name": "da.lproj", + "path": "CoreServices/SystemVersion.bundle/da.lproj" + }, + { + "value": 4, + "name": "Dutch.lproj", + "path": "CoreServices/SystemVersion.bundle/Dutch.lproj" + }, + { + "value": 4, + "name": "el.lproj", + "path": "CoreServices/SystemVersion.bundle/el.lproj" + }, + { + "value": 4, + "name": "English.lproj", + "path": "CoreServices/SystemVersion.bundle/English.lproj" + }, + { + "value": 4, + "name": "fi.lproj", + "path": "CoreServices/SystemVersion.bundle/fi.lproj" + }, + { + "value": 4, + "name": "French.lproj", + "path": "CoreServices/SystemVersion.bundle/French.lproj" + }, + { + "value": 4, + "name": "German.lproj", + "path": "CoreServices/SystemVersion.bundle/German.lproj" + }, + { + "value": 4, + "name": "he.lproj", + "path": "CoreServices/SystemVersion.bundle/he.lproj" + }, + { + "value": 4, + "name": "hr.lproj", + "path": "CoreServices/SystemVersion.bundle/hr.lproj" + }, + { + "value": 4, + "name": "hu.lproj", + "path": "CoreServices/SystemVersion.bundle/hu.lproj" + }, + { + "value": 4, + "name": "id.lproj", + "path": "CoreServices/SystemVersion.bundle/id.lproj" + }, + { + "value": 4, + "name": "Italian.lproj", + "path": "CoreServices/SystemVersion.bundle/Italian.lproj" + }, + { + "value": 4, + "name": "Japanese.lproj", + "path": "CoreServices/SystemVersion.bundle/Japanese.lproj" + }, + { + "value": 4, + "name": "ko.lproj", + "path": "CoreServices/SystemVersion.bundle/ko.lproj" + }, + { + "value": 4, + "name": "ms.lproj", + "path": "CoreServices/SystemVersion.bundle/ms.lproj" + }, + { + "value": 4, + "name": "no.lproj", + "path": "CoreServices/SystemVersion.bundle/no.lproj" + }, + { + "value": 4, + "name": "pl.lproj", + "path": "CoreServices/SystemVersion.bundle/pl.lproj" + }, + { + "value": 4, + "name": "pt.lproj", + "path": "CoreServices/SystemVersion.bundle/pt.lproj" + }, + { + "value": 4, + "name": "pt_PT.lproj", + "path": "CoreServices/SystemVersion.bundle/pt_PT.lproj" + }, + { + "value": 4, + "name": "ro.lproj", + "path": "CoreServices/SystemVersion.bundle/ro.lproj" + }, + { + "value": 4, + "name": "ru.lproj", + "path": "CoreServices/SystemVersion.bundle/ru.lproj" + }, + { + "value": 4, + "name": "sk.lproj", + "path": "CoreServices/SystemVersion.bundle/sk.lproj" + }, + { + "value": 4, + "name": "Spanish.lproj", + "path": "CoreServices/SystemVersion.bundle/Spanish.lproj" + }, + { + "value": 4, + "name": "sv.lproj", + "path": "CoreServices/SystemVersion.bundle/sv.lproj" + }, + { + "value": 4, + "name": "th.lproj", + "path": "CoreServices/SystemVersion.bundle/th.lproj" + }, + { + "value": 4, + "name": "tr.lproj", + "path": "CoreServices/SystemVersion.bundle/tr.lproj" + }, + { + "value": 4, + "name": "uk.lproj", + "path": "CoreServices/SystemVersion.bundle/uk.lproj" + }, + { + "value": 4, + "name": "vi.lproj", + "path": "CoreServices/SystemVersion.bundle/vi.lproj" + }, + { + "value": 4, + "name": "zh_CN.lproj", + "path": "CoreServices/SystemVersion.bundle/zh_CN.lproj" + }, + { + "value": 4, + "name": "zh_TW.lproj", + "path": "CoreServices/SystemVersion.bundle/zh_TW.lproj" + } + ] + }, + { + "value": 3148, + "name": "TicketViewer.app", + "path": "CoreServices/TicketViewer.app", + "children": [ + { + "value": 3148, + "name": "Contents", + "path": "CoreServices/TicketViewer.app/Contents" + } + ] + }, + { + "value": 532, + "name": "TypographyPanel.bundle", + "path": "CoreServices/TypographyPanel.bundle", + "children": [ + { + "value": 532, + "name": "Contents", + "path": "CoreServices/TypographyPanel.bundle/Contents" + } + ] + }, + { + "value": 676, + "name": "UniversalAccessControl.app", + "path": "CoreServices/UniversalAccessControl.app", + "children": [ + { + "value": 676, + "name": "Contents", + "path": "CoreServices/UniversalAccessControl.app/Contents" + } + ] + }, + { + "value": 52, + "name": "UnmountAssistantAgent.app", + "path": "CoreServices/UnmountAssistantAgent.app", + "children": [ + { + "value": 52, + "name": "Contents", + "path": "CoreServices/UnmountAssistantAgent.app/Contents" + } + ] + }, + { + "value": 60, + "name": "UserNotificationCenter.app", + "path": "CoreServices/UserNotificationCenter.app", + "children": [ + { + "value": 60, + "name": "Contents", + "path": "CoreServices/UserNotificationCenter.app/Contents" + } + ] + }, + { + "value": 456, + "name": "VoiceOver.app", + "path": "CoreServices/VoiceOver.app", + "children": [ + { + "value": 456, + "name": "Contents", + "path": "CoreServices/VoiceOver.app/Contents" + } + ] + }, + { + "value": 44, + "name": "XsanManagerDaemon.bundle", + "path": "CoreServices/XsanManagerDaemon.bundle", + "children": [ + { + "value": 44, + "name": "Contents", + "path": "CoreServices/XsanManagerDaemon.bundle/Contents" + } + ] + }, + { + "value": 844, + "name": "ZoomWindow.app", + "path": "CoreServices/ZoomWindow.app", + "children": [ + { + "value": 844, + "name": "Contents", + "path": "CoreServices/ZoomWindow.app/Contents" + } + ] + } + ] + }, + { + "value": 72, + "name": "DirectoryServices", + "path": "DirectoryServices", + "children": [ + { + "value": 0, + "name": "DefaultLocalDB", + "path": "DirectoryServices/DefaultLocalDB" + }, + { + "value": 72, + "name": "dscl", + "path": "DirectoryServices/dscl", + "children": [ + { + "value": 44, + "name": "mcxcl.dsclext", + "path": "DirectoryServices/dscl/mcxcl.dsclext" + }, + { + "value": 28, + "name": "mcxProfiles.dsclext", + "path": "DirectoryServices/dscl/mcxProfiles.dsclext" + } + ] + }, + { + "value": 0, + "name": "Templates", + "path": "DirectoryServices/Templates", + "children": [ + { + "value": 0, + "name": "LDAPv3", + "path": "DirectoryServices/Templates/LDAPv3" + } + ] + } + ] + }, + { + "value": 0, + "name": "Displays", + "path": "Displays", + "children": [ + { + "value": 0, + "name": "_CodeSignature", + "path": "Displays/_CodeSignature" + }, + { + "value": 0, + "name": "Overrides", + "path": "Displays/Overrides", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Displays/Overrides/Contents" + }, + { + "value": 0, + "name": "DisplayVendorID-11a9", + "path": "Displays/Overrides/DisplayVendorID-11a9" + }, + { + "value": 0, + "name": "DisplayVendorID-2283", + "path": "Displays/Overrides/DisplayVendorID-2283" + }, + { + "value": 0, + "name": "DisplayVendorID-34a9", + "path": "Displays/Overrides/DisplayVendorID-34a9" + }, + { + "value": 0, + "name": "DisplayVendorID-38a3", + "path": "Displays/Overrides/DisplayVendorID-38a3" + }, + { + "value": 0, + "name": "DisplayVendorID-4c2d", + "path": "Displays/Overrides/DisplayVendorID-4c2d" + }, + { + "value": 0, + "name": "DisplayVendorID-4dd9", + "path": "Displays/Overrides/DisplayVendorID-4dd9" + }, + { + "value": 0, + "name": "DisplayVendorID-5a63", + "path": "Displays/Overrides/DisplayVendorID-5a63" + }, + { + "value": 0, + "name": "DisplayVendorID-5b4", + "path": "Displays/Overrides/DisplayVendorID-5b4" + }, + { + "value": 0, + "name": "DisplayVendorID-610", + "path": "Displays/Overrides/DisplayVendorID-610" + }, + { + "value": 0, + "name": "DisplayVendorID-756e6b6e", + "path": "Displays/Overrides/DisplayVendorID-756e6b6e" + }, + { + "value": 0, + "name": "DisplayVendorID-daf", + "path": "Displays/Overrides/DisplayVendorID-daf" + } + ] + } + ] + }, + { + "value": 16, + "name": "DTDs", + "path": "DTDs" + }, + { + "value": 400116, + "name": "Extensions", + "path": "Extensions", + "children": [ + { + "value": 0, + "name": "10.5", + "path": "Extensions/10.5" + }, + { + "value": 0, + "name": "10.6", + "path": "Extensions/10.6" + }, + { + "value": 116, + "name": "Accusys6xxxx.kext", + "path": "Extensions/Accusys6xxxx.kext", + "children": [ + { + "value": 116, + "name": "Contents", + "path": "Extensions/Accusys6xxxx.kext/Contents" + } + ] + }, + { + "value": 1236, + "name": "acfs.kext", + "path": "Extensions/acfs.kext", + "children": [ + { + "value": 1236, + "name": "Contents", + "path": "Extensions/acfs.kext/Contents" + } + ] + }, + { + "value": 32, + "name": "acfsctl.kext", + "path": "Extensions/acfsctl.kext", + "children": [ + { + "value": 32, + "name": "Contents", + "path": "Extensions/acfsctl.kext/Contents" + } + ] + }, + { + "value": 196, + "name": "ALF.kext", + "path": "Extensions/ALF.kext", + "children": [ + { + "value": 196, + "name": "Contents", + "path": "Extensions/ALF.kext/Contents" + } + ] + }, + { + "value": 1836, + "name": "AMD2400Controller.kext", + "path": "Extensions/AMD2400Controller.kext", + "children": [ + { + "value": 1836, + "name": "Contents", + "path": "Extensions/AMD2400Controller.kext/Contents" + } + ] + }, + { + "value": 1840, + "name": "AMD2600Controller.kext", + "path": "Extensions/AMD2600Controller.kext", + "children": [ + { + "value": 1840, + "name": "Contents", + "path": "Extensions/AMD2600Controller.kext/Contents" + } + ] + }, + { + "value": 1848, + "name": "AMD3800Controller.kext", + "path": "Extensions/AMD3800Controller.kext", + "children": [ + { + "value": 1848, + "name": "Contents", + "path": "Extensions/AMD3800Controller.kext/Contents" + } + ] + }, + { + "value": 1828, + "name": "AMD4600Controller.kext", + "path": "Extensions/AMD4600Controller.kext", + "children": [ + { + "value": 1828, + "name": "Contents", + "path": "Extensions/AMD4600Controller.kext/Contents" + } + ] + }, + { + "value": 1820, + "name": "AMD4800Controller.kext", + "path": "Extensions/AMD4800Controller.kext", + "children": [ + { + "value": 1820, + "name": "Contents", + "path": "Extensions/AMD4800Controller.kext/Contents" + } + ] + }, + { + "value": 2268, + "name": "AMD5000Controller.kext", + "path": "Extensions/AMD5000Controller.kext", + "children": [ + { + "value": 2268, + "name": "Contents", + "path": "Extensions/AMD5000Controller.kext/Contents" + } + ] + }, + { + "value": 2292, + "name": "AMD6000Controller.kext", + "path": "Extensions/AMD6000Controller.kext", + "children": [ + { + "value": 2292, + "name": "Contents", + "path": "Extensions/AMD6000Controller.kext/Contents" + } + ] + }, + { + "value": 2316, + "name": "AMD7000Controller.kext", + "path": "Extensions/AMD7000Controller.kext", + "children": [ + { + "value": 2316, + "name": "Contents", + "path": "Extensions/AMD7000Controller.kext/Contents" + } + ] + }, + { + "value": 164, + "name": "AMDFramebuffer.kext", + "path": "Extensions/AMDFramebuffer.kext", + "children": [ + { + "value": 164, + "name": "Contents", + "path": "Extensions/AMDFramebuffer.kext/Contents" + } + ] + }, + { + "value": 1572, + "name": "AMDRadeonVADriver.bundle", + "path": "Extensions/AMDRadeonVADriver.bundle", + "children": [ + { + "value": 1572, + "name": "Contents", + "path": "Extensions/AMDRadeonVADriver.bundle/Contents" + } + ] + }, + { + "value": 4756, + "name": "AMDRadeonX3000.kext", + "path": "Extensions/AMDRadeonX3000.kext", + "children": [ + { + "value": 4756, + "name": "Contents", + "path": "Extensions/AMDRadeonX3000.kext/Contents" + } + ] + }, + { + "value": 11224, + "name": "AMDRadeonX3000GLDriver.bundle", + "path": "Extensions/AMDRadeonX3000GLDriver.bundle", + "children": [ + { + "value": 11224, + "name": "Contents", + "path": "Extensions/AMDRadeonX3000GLDriver.bundle/Contents" + } + ] + }, + { + "value": 4532, + "name": "AMDRadeonX4000.kext", + "path": "Extensions/AMDRadeonX4000.kext", + "children": [ + { + "value": 4532, + "name": "Contents", + "path": "Extensions/AMDRadeonX4000.kext/Contents" + } + ] + }, + { + "value": 17144, + "name": "AMDRadeonX4000GLDriver.bundle", + "path": "Extensions/AMDRadeonX4000GLDriver.bundle", + "children": [ + { + "value": 17144, + "name": "Contents", + "path": "Extensions/AMDRadeonX4000GLDriver.bundle/Contents" + } + ] + }, + { + "value": 544, + "name": "AMDSupport.kext", + "path": "Extensions/AMDSupport.kext", + "children": [ + { + "value": 544, + "name": "Contents", + "path": "Extensions/AMDSupport.kext/Contents" + } + ] + }, + { + "value": 148, + "name": "Apple16X50Serial.kext", + "path": "Extensions/Apple16X50Serial.kext", + "children": [ + { + "value": 148, + "name": "Contents", + "path": "Extensions/Apple16X50Serial.kext/Contents" + } + ] + }, + { + "value": 60, + "name": "Apple_iSight.kext", + "path": "Extensions/Apple_iSight.kext", + "children": [ + { + "value": 60, + "name": "Contents", + "path": "Extensions/Apple_iSight.kext/Contents" + } + ] + }, + { + "value": 596, + "name": "AppleACPIPlatform.kext", + "path": "Extensions/AppleACPIPlatform.kext", + "children": [ + { + "value": 596, + "name": "Contents", + "path": "Extensions/AppleACPIPlatform.kext/Contents" + } + ] + }, + { + "value": 208, + "name": "AppleAHCIPort.kext", + "path": "Extensions/AppleAHCIPort.kext", + "children": [ + { + "value": 208, + "name": "Contents", + "path": "Extensions/AppleAHCIPort.kext/Contents" + } + ] + }, + { + "value": 56, + "name": "AppleAPIC.kext", + "path": "Extensions/AppleAPIC.kext", + "children": [ + { + "value": 56, + "name": "Contents", + "path": "Extensions/AppleAPIC.kext/Contents" + } + ] + }, + { + "value": 84, + "name": "AppleBacklight.kext", + "path": "Extensions/AppleBacklight.kext", + "children": [ + { + "value": 84, + "name": "Contents", + "path": "Extensions/AppleBacklight.kext/Contents" + } + ] + }, + { + "value": 56, + "name": "AppleBacklightExpert.kext", + "path": "Extensions/AppleBacklightExpert.kext", + "children": [ + { + "value": 4, + "name": "_CodeSignature", + "path": "Extensions/AppleBacklightExpert.kext/_CodeSignature" + } + ] + }, + { + "value": 180, + "name": "AppleBluetoothMultitouch.kext", + "path": "Extensions/AppleBluetoothMultitouch.kext", + "children": [ + { + "value": 180, + "name": "Contents", + "path": "Extensions/AppleBluetoothMultitouch.kext/Contents" + } + ] + }, + { + "value": 80, + "name": "AppleBMC.kext", + "path": "Extensions/AppleBMC.kext", + "children": [ + { + "value": 80, + "name": "Contents", + "path": "Extensions/AppleBMC.kext/Contents" + } + ] + }, + { + "value": 152, + "name": "AppleCameraInterface.kext", + "path": "Extensions/AppleCameraInterface.kext", + "children": [ + { + "value": 152, + "name": "Contents", + "path": "Extensions/AppleCameraInterface.kext/Contents" + } + ] + }, + { + "value": 152, + "name": "AppleEFIRuntime.kext", + "path": "Extensions/AppleEFIRuntime.kext", + "children": [ + { + "value": 152, + "name": "Contents", + "path": "Extensions/AppleEFIRuntime.kext/Contents" + } + ] + }, + { + "value": 88, + "name": "AppleFDEKeyStore.kext", + "path": "Extensions/AppleFDEKeyStore.kext", + "children": [ + { + "value": 88, + "name": "Contents", + "path": "Extensions/AppleFDEKeyStore.kext/Contents" + } + ] + }, + { + "value": 48, + "name": "AppleFileSystemDriver.kext", + "path": "Extensions/AppleFileSystemDriver.kext", + "children": [ + { + "value": 48, + "name": "Contents", + "path": "Extensions/AppleFileSystemDriver.kext/Contents" + } + ] + }, + { + "value": 56, + "name": "AppleFSCompressionTypeDataless.kext", + "path": "Extensions/AppleFSCompressionTypeDataless.kext", + "children": [ + { + "value": 56, + "name": "Contents", + "path": "Extensions/AppleFSCompressionTypeDataless.kext/Contents" + } + ] + }, + { + "value": 60, + "name": "AppleFSCompressionTypeZlib.kext", + "path": "Extensions/AppleFSCompressionTypeZlib.kext", + "children": [ + { + "value": 60, + "name": "Contents", + "path": "Extensions/AppleFSCompressionTypeZlib.kext/Contents" + } + ] + }, + { + "value": 628, + "name": "AppleFWAudio.kext", + "path": "Extensions/AppleFWAudio.kext", + "children": [ + { + "value": 628, + "name": "Contents", + "path": "Extensions/AppleFWAudio.kext/Contents" + } + ] + }, + { + "value": 396, + "name": "AppleGraphicsControl.kext", + "path": "Extensions/AppleGraphicsControl.kext", + "children": [ + { + "value": 396, + "name": "Contents", + "path": "Extensions/AppleGraphicsControl.kext/Contents" + } + ] + }, + { + "value": 276, + "name": "AppleGraphicsPowerManagement.kext", + "path": "Extensions/AppleGraphicsPowerManagement.kext", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Extensions/AppleGraphicsPowerManagement.kext/Contents" + } + ] + }, + { + "value": 3112, + "name": "AppleHDA.kext", + "path": "Extensions/AppleHDA.kext", + "children": [ + { + "value": 3112, + "name": "Contents", + "path": "Extensions/AppleHDA.kext/Contents" + } + ] + }, + { + "value": 488, + "name": "AppleHIDKeyboard.kext", + "path": "Extensions/AppleHIDKeyboard.kext", + "children": [ + { + "value": 488, + "name": "Contents", + "path": "Extensions/AppleHIDKeyboard.kext/Contents" + } + ] + }, + { + "value": 184, + "name": "AppleHIDMouse.kext", + "path": "Extensions/AppleHIDMouse.kext", + "children": [ + { + "value": 184, + "name": "Contents", + "path": "Extensions/AppleHIDMouse.kext/Contents" + } + ] + }, + { + "value": 52, + "name": "AppleHPET.kext", + "path": "Extensions/AppleHPET.kext", + "children": [ + { + "value": 52, + "name": "Contents", + "path": "Extensions/AppleHPET.kext/Contents" + } + ] + }, + { + "value": 64, + "name": "AppleHSSPIHIDDriver.kext", + "path": "Extensions/AppleHSSPIHIDDriver.kext", + "children": [ + { + "value": 64, + "name": "Contents", + "path": "Extensions/AppleHSSPIHIDDriver.kext/Contents" + } + ] + }, + { + "value": 144, + "name": "AppleHSSPISupport.kext", + "path": "Extensions/AppleHSSPISupport.kext", + "children": [ + { + "value": 144, + "name": "Contents", + "path": "Extensions/AppleHSSPISupport.kext/Contents" + } + ] + }, + { + "value": 64, + "name": "AppleHWAccess.kext", + "path": "Extensions/AppleHWAccess.kext", + "children": [ + { + "value": 64, + "name": "Contents", + "path": "Extensions/AppleHWAccess.kext/Contents" + } + ] + }, + { + "value": 72, + "name": "AppleHWSensor.kext", + "path": "Extensions/AppleHWSensor.kext", + "children": [ + { + "value": 72, + "name": "Contents", + "path": "Extensions/AppleHWSensor.kext/Contents" + } + ] + }, + { + "value": 244, + "name": "AppleIntelCPUPowerManagement.kext", + "path": "Extensions/AppleIntelCPUPowerManagement.kext", + "children": [ + { + "value": 244, + "name": "Contents", + "path": "Extensions/AppleIntelCPUPowerManagement.kext/Contents" + } + ] + }, + { + "value": 52, + "name": "AppleIntelCPUPowerManagementClient.kext", + "path": "Extensions/AppleIntelCPUPowerManagementClient.kext", + "children": [ + { + "value": 52, + "name": "Contents", + "path": "Extensions/AppleIntelCPUPowerManagementClient.kext/Contents" + } + ] + }, + { + "value": 480, + "name": "AppleIntelFramebufferAzul.kext", + "path": "Extensions/AppleIntelFramebufferAzul.kext", + "children": [ + { + "value": 480, + "name": "Contents", + "path": "Extensions/AppleIntelFramebufferAzul.kext/Contents" + } + ] + }, + { + "value": 492, + "name": "AppleIntelFramebufferCapri.kext", + "path": "Extensions/AppleIntelFramebufferCapri.kext", + "children": [ + { + "value": 492, + "name": "Contents", + "path": "Extensions/AppleIntelFramebufferCapri.kext/Contents" + } + ] + }, + { + "value": 604, + "name": "AppleIntelHD3000Graphics.kext", + "path": "Extensions/AppleIntelHD3000Graphics.kext", + "children": [ + { + "value": 604, + "name": "Contents", + "path": "Extensions/AppleIntelHD3000Graphics.kext/Contents" + } + ] + }, + { + "value": 64, + "name": "AppleIntelHD3000GraphicsGA.plugin", + "path": "Extensions/AppleIntelHD3000GraphicsGA.plugin", + "children": [ + { + "value": 64, + "name": "Contents", + "path": "Extensions/AppleIntelHD3000GraphicsGA.plugin/Contents" + } + ] + }, + { + "value": 9164, + "name": "AppleIntelHD3000GraphicsGLDriver.bundle", + "path": "Extensions/AppleIntelHD3000GraphicsGLDriver.bundle", + "children": [ + { + "value": 9164, + "name": "Contents", + "path": "Extensions/AppleIntelHD3000GraphicsGLDriver.bundle/Contents" + } + ] + }, + { + "value": 2520, + "name": "AppleIntelHD3000GraphicsVADriver.bundle", + "path": "Extensions/AppleIntelHD3000GraphicsVADriver.bundle", + "children": [ + { + "value": 2520, + "name": "Contents", + "path": "Extensions/AppleIntelHD3000GraphicsVADriver.bundle/Contents" + } + ] + }, + { + "value": 536, + "name": "AppleIntelHD4000Graphics.kext", + "path": "Extensions/AppleIntelHD4000Graphics.kext", + "children": [ + { + "value": 536, + "name": "Contents", + "path": "Extensions/AppleIntelHD4000Graphics.kext/Contents" + } + ] + }, + { + "value": 22996, + "name": "AppleIntelHD4000GraphicsGLDriver.bundle", + "path": "Extensions/AppleIntelHD4000GraphicsGLDriver.bundle", + "children": [ + { + "value": 22996, + "name": "Contents", + "path": "Extensions/AppleIntelHD4000GraphicsGLDriver.bundle/Contents" + } + ] + }, + { + "value": 3608, + "name": "AppleIntelHD4000GraphicsVADriver.bundle", + "path": "Extensions/AppleIntelHD4000GraphicsVADriver.bundle", + "children": [ + { + "value": 3608, + "name": "Contents", + "path": "Extensions/AppleIntelHD4000GraphicsVADriver.bundle/Contents" + } + ] + }, + { + "value": 564, + "name": "AppleIntelHD5000Graphics.kext", + "path": "Extensions/AppleIntelHD5000Graphics.kext", + "children": [ + { + "value": 564, + "name": "Contents", + "path": "Extensions/AppleIntelHD5000Graphics.kext/Contents" + } + ] + }, + { + "value": 20692, + "name": "AppleIntelHD5000GraphicsGLDriver.bundle", + "path": "Extensions/AppleIntelHD5000GraphicsGLDriver.bundle", + "children": [ + { + "value": 20692, + "name": "Contents", + "path": "Extensions/AppleIntelHD5000GraphicsGLDriver.bundle/Contents" + } + ] + }, + { + "value": 6120, + "name": "AppleIntelHD5000GraphicsVADriver.bundle", + "path": "Extensions/AppleIntelHD5000GraphicsVADriver.bundle", + "children": [ + { + "value": 6120, + "name": "Contents", + "path": "Extensions/AppleIntelHD5000GraphicsVADriver.bundle/Contents" + } + ] + }, + { + "value": 976, + "name": "AppleIntelHDGraphics.kext", + "path": "Extensions/AppleIntelHDGraphics.kext", + "children": [ + { + "value": 976, + "name": "Contents", + "path": "Extensions/AppleIntelHDGraphics.kext/Contents" + } + ] + }, + { + "value": 148, + "name": "AppleIntelHDGraphicsFB.kext", + "path": "Extensions/AppleIntelHDGraphicsFB.kext", + "children": [ + { + "value": 148, + "name": "Contents", + "path": "Extensions/AppleIntelHDGraphicsFB.kext/Contents" + } + ] + }, + { + "value": 64, + "name": "AppleIntelHDGraphicsGA.plugin", + "path": "Extensions/AppleIntelHDGraphicsGA.plugin", + "children": [ + { + "value": 64, + "name": "Contents", + "path": "Extensions/AppleIntelHDGraphicsGA.plugin/Contents" + } + ] + }, + { + "value": 9108, + "name": "AppleIntelHDGraphicsGLDriver.bundle", + "path": "Extensions/AppleIntelHDGraphicsGLDriver.bundle", + "children": [ + { + "value": 9108, + "name": "Contents", + "path": "Extensions/AppleIntelHDGraphicsGLDriver.bundle/Contents" + } + ] + }, + { + "value": 104, + "name": "AppleIntelHDGraphicsVADriver.bundle", + "path": "Extensions/AppleIntelHDGraphicsVADriver.bundle", + "children": [ + { + "value": 104, + "name": "Contents", + "path": "Extensions/AppleIntelHDGraphicsVADriver.bundle/Contents" + } + ] + }, + { + "value": 96, + "name": "AppleIntelHSWVA.bundle", + "path": "Extensions/AppleIntelHSWVA.bundle", + "children": [ + { + "value": 96, + "name": "Contents", + "path": "Extensions/AppleIntelHSWVA.bundle/Contents" + } + ] + }, + { + "value": 96, + "name": "AppleIntelIVBVA.bundle", + "path": "Extensions/AppleIntelIVBVA.bundle", + "children": [ + { + "value": 96, + "name": "Contents", + "path": "Extensions/AppleIntelIVBVA.bundle/Contents" + } + ] + }, + { + "value": 72, + "name": "AppleIntelLpssDmac.kext", + "path": "Extensions/AppleIntelLpssDmac.kext", + "children": [ + { + "value": 72, + "name": "Contents", + "path": "Extensions/AppleIntelLpssDmac.kext/Contents" + } + ] + }, + { + "value": 76, + "name": "AppleIntelLpssGspi.kext", + "path": "Extensions/AppleIntelLpssGspi.kext", + "children": [ + { + "value": 76, + "name": "Contents", + "path": "Extensions/AppleIntelLpssGspi.kext/Contents" + } + ] + }, + { + "value": 132, + "name": "AppleIntelLpssSpiController.kext", + "path": "Extensions/AppleIntelLpssSpiController.kext", + "children": [ + { + "value": 132, + "name": "Contents", + "path": "Extensions/AppleIntelLpssSpiController.kext/Contents" + } + ] + }, + { + "value": 308, + "name": "AppleIntelSNBGraphicsFB.kext", + "path": "Extensions/AppleIntelSNBGraphicsFB.kext", + "children": [ + { + "value": 308, + "name": "Contents", + "path": "Extensions/AppleIntelSNBGraphicsFB.kext/Contents" + } + ] + }, + { + "value": 144, + "name": "AppleIntelSNBVA.bundle", + "path": "Extensions/AppleIntelSNBVA.bundle", + "children": [ + { + "value": 144, + "name": "Contents", + "path": "Extensions/AppleIntelSNBVA.bundle/Contents" + } + ] + }, + { + "value": 72, + "name": "AppleIRController.kext", + "path": "Extensions/AppleIRController.kext", + "children": [ + { + "value": 72, + "name": "Contents", + "path": "Extensions/AppleIRController.kext/Contents" + } + ] + }, + { + "value": 208, + "name": "AppleKextExcludeList.kext", + "path": "Extensions/AppleKextExcludeList.kext", + "children": [ + { + "value": 208, + "name": "Contents", + "path": "Extensions/AppleKextExcludeList.kext/Contents" + } + ] + }, + { + "value": 120, + "name": "AppleKeyStore.kext", + "path": "Extensions/AppleKeyStore.kext", + "children": [ + { + "value": 120, + "name": "Contents", + "path": "Extensions/AppleKeyStore.kext/Contents" + } + ] + }, + { + "value": 48, + "name": "AppleKeyswitch.kext", + "path": "Extensions/AppleKeyswitch.kext", + "children": [ + { + "value": 48, + "name": "Contents", + "path": "Extensions/AppleKeyswitch.kext/Contents" + } + ] + }, + { + "value": 56, + "name": "AppleLPC.kext", + "path": "Extensions/AppleLPC.kext", + "children": [ + { + "value": 56, + "name": "Contents", + "path": "Extensions/AppleLPC.kext/Contents" + } + ] + }, + { + "value": 188, + "name": "AppleLSIFusionMPT.kext", + "path": "Extensions/AppleLSIFusionMPT.kext", + "children": [ + { + "value": 188, + "name": "Contents", + "path": "Extensions/AppleLSIFusionMPT.kext/Contents" + } + ] + }, + { + "value": 36, + "name": "AppleMatch.kext", + "path": "Extensions/AppleMatch.kext", + "children": [ + { + "value": 36, + "name": "Contents", + "path": "Extensions/AppleMatch.kext/Contents" + } + ] + }, + { + "value": 140, + "name": "AppleMCCSControl.kext", + "path": "Extensions/AppleMCCSControl.kext", + "children": [ + { + "value": 140, + "name": "Contents", + "path": "Extensions/AppleMCCSControl.kext/Contents" + } + ] + }, + { + "value": 64, + "name": "AppleMCEDriver.kext", + "path": "Extensions/AppleMCEDriver.kext", + "children": [ + { + "value": 64, + "name": "Contents", + "path": "Extensions/AppleMCEDriver.kext/Contents" + } + ] + }, + { + "value": 76, + "name": "AppleMCP89RootPortPM.kext", + "path": "Extensions/AppleMCP89RootPortPM.kext", + "children": [ + { + "value": 76, + "name": "Contents", + "path": "Extensions/AppleMCP89RootPortPM.kext/Contents" + } + ] + }, + { + "value": 156, + "name": "AppleMIDIFWDriver.plugin", + "path": "Extensions/AppleMIDIFWDriver.plugin", + "children": [ + { + "value": 156, + "name": "Contents", + "path": "Extensions/AppleMIDIFWDriver.plugin/Contents" + } + ] + }, + { + "value": 236, + "name": "AppleMIDIIACDriver.plugin", + "path": "Extensions/AppleMIDIIACDriver.plugin", + "children": [ + { + "value": 236, + "name": "Contents", + "path": "Extensions/AppleMIDIIACDriver.plugin/Contents" + } + ] + }, + { + "value": 416, + "name": "AppleMIDIRTPDriver.plugin", + "path": "Extensions/AppleMIDIRTPDriver.plugin", + "children": [ + { + "value": 416, + "name": "Contents", + "path": "Extensions/AppleMIDIRTPDriver.plugin/Contents" + } + ] + }, + { + "value": 248, + "name": "AppleMIDIUSBDriver.plugin", + "path": "Extensions/AppleMIDIUSBDriver.plugin", + "children": [ + { + "value": 248, + "name": "Contents", + "path": "Extensions/AppleMIDIUSBDriver.plugin/Contents" + } + ] + }, + { + "value": 68, + "name": "AppleMikeyHIDDriver.kext", + "path": "Extensions/AppleMikeyHIDDriver.kext", + "children": [ + { + "value": 68, + "name": "Contents", + "path": "Extensions/AppleMikeyHIDDriver.kext/Contents" + } + ] + }, + { + "value": 28, + "name": "AppleMobileDevice.kext", + "path": "Extensions/AppleMobileDevice.kext", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "Extensions/AppleMobileDevice.kext/Contents" + } + ] + }, + { + "value": 860, + "name": "AppleMultitouchDriver.kext", + "path": "Extensions/AppleMultitouchDriver.kext", + "children": [ + { + "value": 860, + "name": "Contents", + "path": "Extensions/AppleMultitouchDriver.kext/Contents" + } + ] + }, + { + "value": 136, + "name": "ApplePlatformEnabler.kext", + "path": "Extensions/ApplePlatformEnabler.kext", + "children": [ + { + "value": 136, + "name": "Contents", + "path": "Extensions/ApplePlatformEnabler.kext/Contents" + } + ] + }, + { + "value": 240, + "name": "AppleRAID.kext", + "path": "Extensions/AppleRAID.kext", + "children": [ + { + "value": 240, + "name": "Contents", + "path": "Extensions/AppleRAID.kext/Contents" + } + ] + }, + { + "value": 372, + "name": "AppleRAIDCard.kext", + "path": "Extensions/AppleRAIDCard.kext", + "children": [ + { + "value": 372, + "name": "Contents", + "path": "Extensions/AppleRAIDCard.kext/Contents" + } + ] + }, + { + "value": 80, + "name": "AppleRTC.kext", + "path": "Extensions/AppleRTC.kext", + "children": [ + { + "value": 80, + "name": "Contents", + "path": "Extensions/AppleRTC.kext/Contents" + } + ] + }, + { + "value": 148, + "name": "AppleSDXC.kext", + "path": "Extensions/AppleSDXC.kext", + "children": [ + { + "value": 148, + "name": "Contents", + "path": "Extensions/AppleSDXC.kext/Contents" + } + ] + }, + { + "value": 76, + "name": "AppleSEP.kext", + "path": "Extensions/AppleSEP.kext", + "children": [ + { + "value": 76, + "name": "Contents", + "path": "Extensions/AppleSEP.kext/Contents" + } + ] + }, + { + "value": 88, + "name": "AppleSmartBatteryManager.kext", + "path": "Extensions/AppleSmartBatteryManager.kext", + "children": [ + { + "value": 88, + "name": "Contents", + "path": "Extensions/AppleSmartBatteryManager.kext/Contents" + } + ] + }, + { + "value": 60, + "name": "AppleSMBIOS.kext", + "path": "Extensions/AppleSMBIOS.kext", + "children": [ + { + "value": 60, + "name": "Contents", + "path": "Extensions/AppleSMBIOS.kext/Contents" + } + ] + }, + { + "value": 116, + "name": "AppleSMBusController.kext", + "path": "Extensions/AppleSMBusController.kext", + "children": [ + { + "value": 116, + "name": "Contents", + "path": "Extensions/AppleSMBusController.kext/Contents" + } + ] + }, + { + "value": 56, + "name": "AppleSMBusPCI.kext", + "path": "Extensions/AppleSMBusPCI.kext", + "children": [ + { + "value": 56, + "name": "Contents", + "path": "Extensions/AppleSMBusPCI.kext/Contents" + } + ] + }, + { + "value": 120, + "name": "AppleSMC.kext", + "path": "Extensions/AppleSMC.kext", + "children": [ + { + "value": 120, + "name": "Contents", + "path": "Extensions/AppleSMC.kext/Contents" + } + ] + }, + { + "value": 172, + "name": "AppleSMCLMU.kext", + "path": "Extensions/AppleSMCLMU.kext", + "children": [ + { + "value": 172, + "name": "Contents", + "path": "Extensions/AppleSMCLMU.kext/Contents" + } + ] + }, + { + "value": 88, + "name": "AppleSRP.kext", + "path": "Extensions/AppleSRP.kext", + "children": [ + { + "value": 88, + "name": "Contents", + "path": "Extensions/AppleSRP.kext/Contents" + } + ] + }, + { + "value": 1936, + "name": "AppleStorageDrivers.kext", + "path": "Extensions/AppleStorageDrivers.kext", + "children": [ + { + "value": 1936, + "name": "Contents", + "path": "Extensions/AppleStorageDrivers.kext/Contents" + } + ] + }, + { + "value": 264, + "name": "AppleThunderboltDPAdapters.kext", + "path": "Extensions/AppleThunderboltDPAdapters.kext", + "children": [ + { + "value": 264, + "name": "Contents", + "path": "Extensions/AppleThunderboltDPAdapters.kext/Contents" + } + ] + }, + { + "value": 204, + "name": "AppleThunderboltEDMService.kext", + "path": "Extensions/AppleThunderboltEDMService.kext", + "children": [ + { + "value": 204, + "name": "Contents", + "path": "Extensions/AppleThunderboltEDMService.kext/Contents" + } + ] + }, + { + "value": 216, + "name": "AppleThunderboltIP.kext", + "path": "Extensions/AppleThunderboltIP.kext", + "children": [ + { + "value": 216, + "name": "Contents", + "path": "Extensions/AppleThunderboltIP.kext/Contents" + } + ] + }, + { + "value": 168, + "name": "AppleThunderboltNHI.kext", + "path": "Extensions/AppleThunderboltNHI.kext", + "children": [ + { + "value": 168, + "name": "Contents", + "path": "Extensions/AppleThunderboltNHI.kext/Contents" + } + ] + }, + { + "value": 172, + "name": "AppleThunderboltPCIAdapters.kext", + "path": "Extensions/AppleThunderboltPCIAdapters.kext", + "children": [ + { + "value": 172, + "name": "Contents", + "path": "Extensions/AppleThunderboltPCIAdapters.kext/Contents" + } + ] + }, + { + "value": 164, + "name": "AppleThunderboltUTDM.kext", + "path": "Extensions/AppleThunderboltUTDM.kext", + "children": [ + { + "value": 164, + "name": "Contents", + "path": "Extensions/AppleThunderboltUTDM.kext/Contents" + } + ] + }, + { + "value": 188, + "name": "AppleTopCase.kext", + "path": "Extensions/AppleTopCase.kext", + "children": [ + { + "value": 188, + "name": "Contents", + "path": "Extensions/AppleTopCase.kext/Contents" + } + ] + }, + { + "value": 92, + "name": "AppleTyMCEDriver.kext", + "path": "Extensions/AppleTyMCEDriver.kext", + "children": [ + { + "value": 92, + "name": "Contents", + "path": "Extensions/AppleTyMCEDriver.kext/Contents" + } + ] + }, + { + "value": 72, + "name": "AppleUpstreamUserClient.kext", + "path": "Extensions/AppleUpstreamUserClient.kext", + "children": [ + { + "value": 72, + "name": "Contents", + "path": "Extensions/AppleUpstreamUserClient.kext/Contents" + } + ] + }, + { + "value": 408, + "name": "AppleUSBAudio.kext", + "path": "Extensions/AppleUSBAudio.kext", + "children": [ + { + "value": 408, + "name": "Contents", + "path": "Extensions/AppleUSBAudio.kext/Contents" + } + ] + }, + { + "value": 76, + "name": "AppleUSBDisplays.kext", + "path": "Extensions/AppleUSBDisplays.kext", + "children": [ + { + "value": 76, + "name": "Contents", + "path": "Extensions/AppleUSBDisplays.kext/Contents" + } + ] + }, + { + "value": 144, + "name": "AppleUSBEthernetHost.kext", + "path": "Extensions/AppleUSBEthernetHost.kext", + "children": [ + { + "value": 144, + "name": "Contents", + "path": "Extensions/AppleUSBEthernetHost.kext/Contents" + } + ] + }, + { + "value": 160, + "name": "AppleUSBMultitouch.kext", + "path": "Extensions/AppleUSBMultitouch.kext", + "children": [ + { + "value": 160, + "name": "Contents", + "path": "Extensions/AppleUSBMultitouch.kext/Contents" + } + ] + }, + { + "value": 728, + "name": "AppleUSBTopCase.kext", + "path": "Extensions/AppleUSBTopCase.kext", + "children": [ + { + "value": 728, + "name": "Contents", + "path": "Extensions/AppleUSBTopCase.kext/Contents" + } + ] + }, + { + "value": 3576, + "name": "AppleVADriver.bundle", + "path": "Extensions/AppleVADriver.bundle", + "children": [ + { + "value": 3576, + "name": "Contents", + "path": "Extensions/AppleVADriver.bundle/Contents" + } + ] + }, + { + "value": 60, + "name": "AppleWWANAutoEject.kext", + "path": "Extensions/AppleWWANAutoEject.kext", + "children": [ + { + "value": 60, + "name": "Contents", + "path": "Extensions/AppleWWANAutoEject.kext/Contents" + } + ] + }, + { + "value": 56, + "name": "AppleXsanFilter.kext", + "path": "Extensions/AppleXsanFilter.kext", + "children": [ + { + "value": 56, + "name": "Contents", + "path": "Extensions/AppleXsanFilter.kext/Contents" + } + ] + }, + { + "value": 2976, + "name": "ATIRadeonX2000.kext", + "path": "Extensions/ATIRadeonX2000.kext", + "children": [ + { + "value": 2976, + "name": "Contents", + "path": "Extensions/ATIRadeonX2000.kext/Contents" + } + ] + }, + { + "value": 88, + "name": "ATIRadeonX2000GA.plugin", + "path": "Extensions/ATIRadeonX2000GA.plugin", + "children": [ + { + "value": 88, + "name": "Contents", + "path": "Extensions/ATIRadeonX2000GA.plugin/Contents" + } + ] + }, + { + "value": 5808, + "name": "ATIRadeonX2000GLDriver.bundle", + "path": "Extensions/ATIRadeonX2000GLDriver.bundle", + "children": [ + { + "value": 5808, + "name": "Contents", + "path": "Extensions/ATIRadeonX2000GLDriver.bundle/Contents" + } + ] + }, + { + "value": 396, + "name": "ATIRadeonX2000VADriver.bundle", + "path": "Extensions/ATIRadeonX2000VADriver.bundle", + "children": [ + { + "value": 396, + "name": "Contents", + "path": "Extensions/ATIRadeonX2000VADriver.bundle/Contents" + } + ] + }, + { + "value": 496, + "name": "ATTOCelerityFC.kext", + "path": "Extensions/ATTOCelerityFC.kext", + "children": [ + { + "value": 496, + "name": "Contents", + "path": "Extensions/ATTOCelerityFC.kext/Contents" + } + ] + }, + { + "value": 268, + "name": "ATTOExpressPCI4.kext", + "path": "Extensions/ATTOExpressPCI4.kext", + "children": [ + { + "value": 268, + "name": "Contents", + "path": "Extensions/ATTOExpressPCI4.kext/Contents" + } + ] + }, + { + "value": 252, + "name": "ATTOExpressSASHBA.kext", + "path": "Extensions/ATTOExpressSASHBA.kext", + "children": [ + { + "value": 252, + "name": "Contents", + "path": "Extensions/ATTOExpressSASHBA.kext/Contents" + } + ] + }, + { + "value": 388, + "name": "ATTOExpressSASHBA3.kext", + "path": "Extensions/ATTOExpressSASHBA3.kext", + "children": [ + { + "value": 388, + "name": "Contents", + "path": "Extensions/ATTOExpressSASHBA3.kext/Contents" + } + ] + }, + { + "value": 212, + "name": "ATTOExpressSASRAID.kext", + "path": "Extensions/ATTOExpressSASRAID.kext", + "children": [ + { + "value": 212, + "name": "Contents", + "path": "Extensions/ATTOExpressSASRAID.kext/Contents" + } + ] + }, + { + "value": 72, + "name": "AudioAUUC.kext", + "path": "Extensions/AudioAUUC.kext", + "children": [ + { + "value": 4, + "name": "_CodeSignature", + "path": "Extensions/AudioAUUC.kext/_CodeSignature" + } + ] + }, + { + "value": 144, + "name": "autofs.kext", + "path": "Extensions/autofs.kext", + "children": [ + { + "value": 144, + "name": "Contents", + "path": "Extensions/autofs.kext/Contents" + } + ] + }, + { + "value": 80, + "name": "BootCache.kext", + "path": "Extensions/BootCache.kext", + "children": [ + { + "value": 80, + "name": "Contents", + "path": "Extensions/BootCache.kext/Contents" + } + ] + }, + { + "value": 64, + "name": "cd9660.kext", + "path": "Extensions/cd9660.kext", + "children": [ + { + "value": 64, + "name": "Contents", + "path": "Extensions/cd9660.kext/Contents" + } + ] + }, + { + "value": 48, + "name": "cddafs.kext", + "path": "Extensions/cddafs.kext", + "children": [ + { + "value": 48, + "name": "Contents", + "path": "Extensions/cddafs.kext/Contents" + } + ] + }, + { + "value": 432, + "name": "CellPhoneHelper.kext", + "path": "Extensions/CellPhoneHelper.kext", + "children": [ + { + "value": 432, + "name": "Contents", + "path": "Extensions/CellPhoneHelper.kext/Contents" + } + ] + }, + { + "value": 0, + "name": "ch34xsigned.kext", + "path": "Extensions/ch34xsigned.kext" + }, + { + "value": 308, + "name": "corecrypto.kext", + "path": "Extensions/corecrypto.kext", + "children": [ + { + "value": 308, + "name": "Contents", + "path": "Extensions/corecrypto.kext/Contents" + } + ] + }, + { + "value": 1324, + "name": "CoreStorage.kext", + "path": "Extensions/CoreStorage.kext", + "children": [ + { + "value": 1324, + "name": "Contents", + "path": "Extensions/CoreStorage.kext/Contents" + } + ] + }, + { + "value": 72, + "name": "DontSteal Mac OS X.kext", + "path": "Extensions/DontSteal Mac OS X.kext", + "children": [ + { + "value": 68, + "name": "Contents", + "path": "Extensions/DontSteal Mac OS X.kext/Contents" + } + ] + }, + { + "value": 36, + "name": "DSACL.ppp", + "path": "Extensions/DSACL.ppp", + "children": [ + { + "value": 36, + "name": "Contents", + "path": "Extensions/DSACL.ppp/Contents" + } + ] + }, + { + "value": 40, + "name": "DSAuth.ppp", + "path": "Extensions/DSAuth.ppp", + "children": [ + { + "value": 40, + "name": "Contents", + "path": "Extensions/DSAuth.ppp/Contents" + } + ] + }, + { + "value": 56, + "name": "DVFamily.bundle", + "path": "Extensions/DVFamily.bundle", + "children": [ + { + "value": 56, + "name": "Contents", + "path": "Extensions/DVFamily.bundle/Contents" + } + ] + }, + { + "value": 312, + "name": "EAP-KRB.ppp", + "path": "Extensions/EAP-KRB.ppp", + "children": [ + { + "value": 312, + "name": "Contents", + "path": "Extensions/EAP-KRB.ppp/Contents" + } + ] + }, + { + "value": 792, + "name": "EAP-RSA.ppp", + "path": "Extensions/EAP-RSA.ppp", + "children": [ + { + "value": 792, + "name": "Contents", + "path": "Extensions/EAP-RSA.ppp/Contents" + } + ] + }, + { + "value": 308, + "name": "EAP-TLS.ppp", + "path": "Extensions/EAP-TLS.ppp", + "children": [ + { + "value": 308, + "name": "Contents", + "path": "Extensions/EAP-TLS.ppp/Contents" + } + ] + }, + { + "value": 88, + "name": "exfat.kext", + "path": "Extensions/exfat.kext", + "children": [ + { + "value": 88, + "name": "Contents", + "path": "Extensions/exfat.kext/Contents" + } + ] + }, + { + "value": 776, + "name": "GeForce.kext", + "path": "Extensions/GeForce.kext", + "children": [ + { + "value": 776, + "name": "Contents", + "path": "Extensions/GeForce.kext/Contents" + } + ] + }, + { + "value": 160, + "name": "GeForceGA.plugin", + "path": "Extensions/GeForceGA.plugin", + "children": [ + { + "value": 160, + "name": "Contents", + "path": "Extensions/GeForceGA.plugin/Contents" + } + ] + }, + { + "value": 67212, + "name": "GeForceGLDriver.bundle", + "path": "Extensions/GeForceGLDriver.bundle", + "children": [ + { + "value": 67212, + "name": "Contents", + "path": "Extensions/GeForceGLDriver.bundle/Contents" + } + ] + }, + { + "value": 1100, + "name": "GeForceTesla.kext", + "path": "Extensions/GeForceTesla.kext", + "children": [ + { + "value": 1100, + "name": "Contents", + "path": "Extensions/GeForceTesla.kext/Contents" + } + ] + }, + { + "value": 67012, + "name": "GeForceTeslaGLDriver.bundle", + "path": "Extensions/GeForceTeslaGLDriver.bundle", + "children": [ + { + "value": 67012, + "name": "Contents", + "path": "Extensions/GeForceTeslaGLDriver.bundle/Contents" + } + ] + }, + { + "value": 1584, + "name": "GeForceTeslaVADriver.bundle", + "path": "Extensions/GeForceTeslaVADriver.bundle", + "children": [ + { + "value": 1584, + "name": "Contents", + "path": "Extensions/GeForceTeslaVADriver.bundle/Contents" + } + ] + }, + { + "value": 1476, + "name": "GeForceVADriver.bundle", + "path": "Extensions/GeForceVADriver.bundle", + "children": [ + { + "value": 1476, + "name": "Contents", + "path": "Extensions/GeForceVADriver.bundle/Contents" + } + ] + }, + { + "value": 212, + "name": "intelhaxm.kext", + "path": "Extensions/intelhaxm.kext", + "children": [ + { + "value": 212, + "name": "Contents", + "path": "Extensions/intelhaxm.kext/Contents" + } + ] + }, + { + "value": 10488, + "name": "IO80211Family.kext", + "path": "Extensions/IO80211Family.kext", + "children": [ + { + "value": 10488, + "name": "Contents", + "path": "Extensions/IO80211Family.kext/Contents" + } + ] + }, + { + "value": 56, + "name": "IOAccelerator2D.plugin", + "path": "Extensions/IOAccelerator2D.plugin", + "children": [ + { + "value": 56, + "name": "Contents", + "path": "Extensions/IOAccelerator2D.plugin/Contents" + } + ] + }, + { + "value": 448, + "name": "IOAcceleratorFamily.kext", + "path": "Extensions/IOAcceleratorFamily.kext", + "children": [ + { + "value": 448, + "name": "Contents", + "path": "Extensions/IOAcceleratorFamily.kext/Contents" + } + ] + }, + { + "value": 508, + "name": "IOAcceleratorFamily2.kext", + "path": "Extensions/IOAcceleratorFamily2.kext", + "children": [ + { + "value": 508, + "name": "Contents", + "path": "Extensions/IOAcceleratorFamily2.kext/Contents" + } + ] + }, + { + "value": 76, + "name": "IOACPIFamily.kext", + "path": "Extensions/IOACPIFamily.kext", + "children": [ + { + "value": 76, + "name": "Contents", + "path": "Extensions/IOACPIFamily.kext/Contents" + } + ] + }, + { + "value": 448, + "name": "IOAHCIFamily.kext", + "path": "Extensions/IOAHCIFamily.kext", + "children": [ + { + "value": 448, + "name": "Contents", + "path": "Extensions/IOAHCIFamily.kext/Contents" + } + ] + }, + { + "value": 872, + "name": "IOATAFamily.kext", + "path": "Extensions/IOATAFamily.kext", + "children": [ + { + "value": 872, + "name": "Contents", + "path": "Extensions/IOATAFamily.kext/Contents" + } + ] + }, + { + "value": 276, + "name": "IOAudioFamily.kext", + "path": "Extensions/IOAudioFamily.kext", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "Extensions/IOAudioFamily.kext/Contents" + } + ] + }, + { + "value": 692, + "name": "IOAVBFamily.kext", + "path": "Extensions/IOAVBFamily.kext", + "children": [ + { + "value": 692, + "name": "Contents", + "path": "Extensions/IOAVBFamily.kext/Contents" + } + ] + }, + { + "value": 4808, + "name": "IOBDStorageFamily.kext", + "path": "Extensions/IOBDStorageFamily.kext", + "children": [ + { + "value": 4808, + "name": "Contents", + "path": "Extensions/IOBDStorageFamily.kext/Contents" + } + ] + }, + { + "value": 4460, + "name": "IOBluetoothFamily.kext", + "path": "Extensions/IOBluetoothFamily.kext", + "children": [ + { + "value": 4460, + "name": "Contents", + "path": "Extensions/IOBluetoothFamily.kext/Contents" + } + ] + }, + { + "value": 260, + "name": "IOBluetoothHIDDriver.kext", + "path": "Extensions/IOBluetoothHIDDriver.kext", + "children": [ + { + "value": 260, + "name": "Contents", + "path": "Extensions/IOBluetoothHIDDriver.kext/Contents" + } + ] + }, + { + "value": 4816, + "name": "IOCDStorageFamily.kext", + "path": "Extensions/IOCDStorageFamily.kext", + "children": [ + { + "value": 4816, + "name": "Contents", + "path": "Extensions/IOCDStorageFamily.kext/Contents" + } + ] + }, + { + "value": 9656, + "name": "IODVDStorageFamily.kext", + "path": "Extensions/IODVDStorageFamily.kext", + "children": [ + { + "value": 9656, + "name": "Contents", + "path": "Extensions/IODVDStorageFamily.kext/Contents" + } + ] + }, + { + "value": 288, + "name": "IOFireWireAVC.kext", + "path": "Extensions/IOFireWireAVC.kext", + "children": [ + { + "value": 288, + "name": "Contents", + "path": "Extensions/IOFireWireAVC.kext/Contents" + } + ] + }, + { + "value": 1424, + "name": "IOFireWireFamily.kext", + "path": "Extensions/IOFireWireFamily.kext", + "children": [ + { + "value": 1424, + "name": "Contents", + "path": "Extensions/IOFireWireFamily.kext/Contents" + } + ] + }, + { + "value": 236, + "name": "IOFireWireIP.kext", + "path": "Extensions/IOFireWireIP.kext", + "children": [ + { + "value": 236, + "name": "Contents", + "path": "Extensions/IOFireWireIP.kext/Contents" + } + ] + }, + { + "value": 288, + "name": "IOFireWireSBP2.kext", + "path": "Extensions/IOFireWireSBP2.kext", + "children": [ + { + "value": 288, + "name": "Contents", + "path": "Extensions/IOFireWireSBP2.kext/Contents" + } + ] + }, + { + "value": 68, + "name": "IOFireWireSerialBusProtocolTransport.kext", + "path": "Extensions/IOFireWireSerialBusProtocolTransport.kext", + "children": [ + { + "value": 68, + "name": "Contents", + "path": "Extensions/IOFireWireSerialBusProtocolTransport.kext/Contents" + } + ] + }, + { + "value": 320, + "name": "IOGraphicsFamily.kext", + "path": "Extensions/IOGraphicsFamily.kext", + "children": [ + { + "value": 4, + "name": "_CodeSignature", + "path": "Extensions/IOGraphicsFamily.kext/_CodeSignature" + } + ] + }, + { + "value": 804, + "name": "IOHDIXController.kext", + "path": "Extensions/IOHDIXController.kext", + "children": [ + { + "value": 804, + "name": "Contents", + "path": "Extensions/IOHDIXController.kext/Contents" + } + ] + }, + { + "value": 940, + "name": "IOHIDFamily.kext", + "path": "Extensions/IOHIDFamily.kext", + "children": [ + { + "value": 940, + "name": "Contents", + "path": "Extensions/IOHIDFamily.kext/Contents" + } + ] + }, + { + "value": 108, + "name": "IONDRVSupport.kext", + "path": "Extensions/IONDRVSupport.kext", + "children": [ + { + "value": 4, + "name": "_CodeSignature", + "path": "Extensions/IONDRVSupport.kext/_CodeSignature" + } + ] + }, + { + "value": 2396, + "name": "IONetworkingFamily.kext", + "path": "Extensions/IONetworkingFamily.kext", + "children": [ + { + "value": 2396, + "name": "Contents", + "path": "Extensions/IONetworkingFamily.kext/Contents" + } + ] + }, + { + "value": 228, + "name": "IOPCIFamily.kext", + "path": "Extensions/IOPCIFamily.kext", + "children": [ + { + "value": 4, + "name": "_CodeSignature", + "path": "Extensions/IOPCIFamily.kext/_CodeSignature" + } + ] + }, + { + "value": 1400, + "name": "IOPlatformPluginFamily.kext", + "path": "Extensions/IOPlatformPluginFamily.kext", + "children": [ + { + "value": 1400, + "name": "Contents", + "path": "Extensions/IOPlatformPluginFamily.kext/Contents" + } + ] + }, + { + "value": 108, + "name": "IOReportFamily.kext", + "path": "Extensions/IOReportFamily.kext", + "children": [ + { + "value": 108, + "name": "Contents", + "path": "Extensions/IOReportFamily.kext/Contents" + } + ] + }, + { + "value": 13020, + "name": "IOSCSIArchitectureModelFamily.kext", + "path": "Extensions/IOSCSIArchitectureModelFamily.kext", + "children": [ + { + "value": 13020, + "name": "Contents", + "path": "Extensions/IOSCSIArchitectureModelFamily.kext/Contents" + } + ] + }, + { + "value": 120, + "name": "IOSCSIParallelFamily.kext", + "path": "Extensions/IOSCSIParallelFamily.kext", + "children": [ + { + "value": 120, + "name": "Contents", + "path": "Extensions/IOSCSIParallelFamily.kext/Contents" + } + ] + }, + { + "value": 1292, + "name": "IOSerialFamily.kext", + "path": "Extensions/IOSerialFamily.kext", + "children": [ + { + "value": 1292, + "name": "Contents", + "path": "Extensions/IOSerialFamily.kext/Contents" + } + ] + }, + { + "value": 52, + "name": "IOSMBusFamily.kext", + "path": "Extensions/IOSMBusFamily.kext", + "children": [ + { + "value": 52, + "name": "Contents", + "path": "Extensions/IOSMBusFamily.kext/Contents" + } + ] + }, + { + "value": 2064, + "name": "IOStorageFamily.kext", + "path": "Extensions/IOStorageFamily.kext", + "children": [ + { + "value": 2064, + "name": "Contents", + "path": "Extensions/IOStorageFamily.kext/Contents" + } + ] + }, + { + "value": 164, + "name": "IOStreamFamily.kext", + "path": "Extensions/IOStreamFamily.kext", + "children": [ + { + "value": 164, + "name": "Contents", + "path": "Extensions/IOStreamFamily.kext/Contents" + } + ] + }, + { + "value": 124, + "name": "IOSurface.kext", + "path": "Extensions/IOSurface.kext", + "children": [ + { + "value": 124, + "name": "Contents", + "path": "Extensions/IOSurface.kext/Contents" + } + ] + }, + { + "value": 1040, + "name": "IOThunderboltFamily.kext", + "path": "Extensions/IOThunderboltFamily.kext", + "children": [ + { + "value": 1040, + "name": "Contents", + "path": "Extensions/IOThunderboltFamily.kext/Contents" + } + ] + }, + { + "value": 248, + "name": "IOTimeSyncFamily.kext", + "path": "Extensions/IOTimeSyncFamily.kext", + "children": [ + { + "value": 248, + "name": "Contents", + "path": "Extensions/IOTimeSyncFamily.kext/Contents" + } + ] + }, + { + "value": 96, + "name": "IOUSBAttachedSCSI.kext", + "path": "Extensions/IOUSBAttachedSCSI.kext", + "children": [ + { + "value": 96, + "name": "Contents", + "path": "Extensions/IOUSBAttachedSCSI.kext/Contents" + } + ] + }, + { + "value": 4628, + "name": "IOUSBFamily.kext", + "path": "Extensions/IOUSBFamily.kext", + "children": [ + { + "value": 4628, + "name": "Contents", + "path": "Extensions/IOUSBFamily.kext/Contents" + } + ] + }, + { + "value": 140, + "name": "IOUSBMassStorageClass.kext", + "path": "Extensions/IOUSBMassStorageClass.kext", + "children": [ + { + "value": 140, + "name": "Contents", + "path": "Extensions/IOUSBMassStorageClass.kext/Contents" + } + ] + }, + { + "value": 100, + "name": "IOUserEthernet.kext", + "path": "Extensions/IOUserEthernet.kext", + "children": [ + { + "value": 100, + "name": "Contents", + "path": "Extensions/IOUserEthernet.kext/Contents" + } + ] + }, + { + "value": 172, + "name": "IOVideoFamily.kext", + "path": "Extensions/IOVideoFamily.kext", + "children": [ + { + "value": 172, + "name": "Contents", + "path": "Extensions/IOVideoFamily.kext/Contents" + } + ] + }, + { + "value": 168, + "name": "iPodDriver.kext", + "path": "Extensions/iPodDriver.kext", + "children": [ + { + "value": 168, + "name": "Contents", + "path": "Extensions/iPodDriver.kext/Contents" + } + ] + }, + { + "value": 108, + "name": "JMicronATA.kext", + "path": "Extensions/JMicronATA.kext", + "children": [ + { + "value": 108, + "name": "Contents", + "path": "Extensions/JMicronATA.kext/Contents" + } + ] + }, + { + "value": 208, + "name": "L2TP.ppp", + "path": "Extensions/L2TP.ppp", + "children": [ + { + "value": 208, + "name": "Contents", + "path": "Extensions/L2TP.ppp/Contents" + } + ] + }, + { + "value": 64, + "name": "mcxalr.kext", + "path": "Extensions/mcxalr.kext", + "children": [ + { + "value": 64, + "name": "Contents", + "path": "Extensions/mcxalr.kext/Contents" + } + ] + }, + { + "value": 92, + "name": "msdosfs.kext", + "path": "Extensions/msdosfs.kext", + "children": [ + { + "value": 92, + "name": "Contents", + "path": "Extensions/msdosfs.kext/Contents" + } + ] + }, + { + "value": 408, + "name": "ntfs.kext", + "path": "Extensions/ntfs.kext", + "children": [ + { + "value": 408, + "name": "Contents", + "path": "Extensions/ntfs.kext/Contents" + } + ] + }, + { + "value": 2128, + "name": "NVDAGF100Hal.kext", + "path": "Extensions/NVDAGF100Hal.kext", + "children": [ + { + "value": 2128, + "name": "Contents", + "path": "Extensions/NVDAGF100Hal.kext/Contents" + } + ] + }, + { + "value": 1952, + "name": "NVDAGK100Hal.kext", + "path": "Extensions/NVDAGK100Hal.kext", + "children": [ + { + "value": 1952, + "name": "Contents", + "path": "Extensions/NVDAGK100Hal.kext/Contents" + } + ] + }, + { + "value": 3104, + "name": "NVDANV50HalTesla.kext", + "path": "Extensions/NVDANV50HalTesla.kext", + "children": [ + { + "value": 3104, + "name": "Contents", + "path": "Extensions/NVDANV50HalTesla.kext/Contents" + } + ] + }, + { + "value": 2524, + "name": "NVDAResman.kext", + "path": "Extensions/NVDAResman.kext", + "children": [ + { + "value": 2524, + "name": "Contents", + "path": "Extensions/NVDAResman.kext/Contents" + } + ] + }, + { + "value": 2540, + "name": "NVDAResmanTesla.kext", + "path": "Extensions/NVDAResmanTesla.kext", + "children": [ + { + "value": 2540, + "name": "Contents", + "path": "Extensions/NVDAResmanTesla.kext/Contents" + } + ] + }, + { + "value": 56, + "name": "NVDAStartup.kext", + "path": "Extensions/NVDAStartup.kext", + "children": [ + { + "value": 56, + "name": "Contents", + "path": "Extensions/NVDAStartup.kext/Contents" + } + ] + }, + { + "value": 104, + "name": "NVSMU.kext", + "path": "Extensions/NVSMU.kext", + "children": [ + { + "value": 104, + "name": "Contents", + "path": "Extensions/NVSMU.kext/Contents" + } + ] + }, + { + "value": 92, + "name": "OSvKernDSPLib.kext", + "path": "Extensions/OSvKernDSPLib.kext", + "children": [ + { + "value": 92, + "name": "Contents", + "path": "Extensions/OSvKernDSPLib.kext/Contents" + } + ] + }, + { + "value": 72, + "name": "PPP.kext", + "path": "Extensions/PPP.kext", + "children": [ + { + "value": 72, + "name": "Contents", + "path": "Extensions/PPP.kext/Contents" + } + ] + }, + { + "value": 120, + "name": "PPPoE.ppp", + "path": "Extensions/PPPoE.ppp", + "children": [ + { + "value": 120, + "name": "Contents", + "path": "Extensions/PPPoE.ppp/Contents" + } + ] + }, + { + "value": 1572, + "name": "PPPSerial.ppp", + "path": "Extensions/PPPSerial.ppp", + "children": [ + { + "value": 1572, + "name": "Contents", + "path": "Extensions/PPPSerial.ppp/Contents" + } + ] + }, + { + "value": 120, + "name": "PPTP.ppp", + "path": "Extensions/PPTP.ppp", + "children": [ + { + "value": 120, + "name": "Contents", + "path": "Extensions/PPTP.ppp/Contents" + } + ] + }, + { + "value": 64, + "name": "pthread.kext", + "path": "Extensions/pthread.kext", + "children": [ + { + "value": 64, + "name": "Contents", + "path": "Extensions/pthread.kext/Contents" + } + ] + }, + { + "value": 56, + "name": "Quarantine.kext", + "path": "Extensions/Quarantine.kext", + "children": [ + { + "value": 56, + "name": "Contents", + "path": "Extensions/Quarantine.kext/Contents" + } + ] + }, + { + "value": 56, + "name": "Radius.ppp", + "path": "Extensions/Radius.ppp", + "children": [ + { + "value": 56, + "name": "Contents", + "path": "Extensions/Radius.ppp/Contents" + } + ] + }, + { + "value": 52, + "name": "RemoteVirtualInterface.kext", + "path": "Extensions/RemoteVirtualInterface.kext", + "children": [ + { + "value": 52, + "name": "Contents", + "path": "Extensions/RemoteVirtualInterface.kext/Contents" + } + ] + }, + { + "value": 108, + "name": "Sandbox.kext", + "path": "Extensions/Sandbox.kext", + "children": [ + { + "value": 108, + "name": "Contents", + "path": "Extensions/Sandbox.kext/Contents" + } + ] + }, + { + "value": 68, + "name": "SMARTLib.plugin", + "path": "Extensions/SMARTLib.plugin", + "children": [ + { + "value": 68, + "name": "Contents", + "path": "Extensions/SMARTLib.plugin/Contents" + } + ] + }, + { + "value": 376, + "name": "smbfs.kext", + "path": "Extensions/smbfs.kext", + "children": [ + { + "value": 376, + "name": "Contents", + "path": "Extensions/smbfs.kext/Contents" + } + ] + }, + { + "value": 80, + "name": "SMCMotionSensor.kext", + "path": "Extensions/SMCMotionSensor.kext", + "children": [ + { + "value": 80, + "name": "Contents", + "path": "Extensions/SMCMotionSensor.kext/Contents" + } + ] + }, + { + "value": 504, + "name": "System.kext", + "path": "Extensions/System.kext", + "children": [ + { + "value": 20, + "name": "_CodeSignature", + "path": "Extensions/System.kext/_CodeSignature" + }, + { + "value": 476, + "name": "PlugIns", + "path": "Extensions/System.kext/PlugIns" + } + ] + }, + { + "value": 56, + "name": "TMSafetyNet.kext", + "path": "Extensions/TMSafetyNet.kext", + "children": [ + { + "value": 40, + "name": "Contents", + "path": "Extensions/TMSafetyNet.kext/Contents" + }, + { + "value": 16, + "name": "Helpers", + "path": "Extensions/TMSafetyNet.kext/Helpers" + } + ] + }, + { + "value": 40, + "name": "triggers.kext", + "path": "Extensions/triggers.kext", + "children": [ + { + "value": 40, + "name": "Contents", + "path": "Extensions/triggers.kext/Contents" + } + ] + }, + { + "value": 296, + "name": "udf.kext", + "path": "Extensions/udf.kext", + "children": [ + { + "value": 296, + "name": "Contents", + "path": "Extensions/udf.kext/Contents" + } + ] + }, + { + "value": 212, + "name": "vecLib.kext", + "path": "Extensions/vecLib.kext", + "children": [ + { + "value": 212, + "name": "Contents", + "path": "Extensions/vecLib.kext/Contents" + } + ] + }, + { + "value": 176, + "name": "webcontentfilter.kext", + "path": "Extensions/webcontentfilter.kext", + "children": [ + { + "value": 176, + "name": "Contents", + "path": "Extensions/webcontentfilter.kext/Contents" + } + ] + }, + { + "value": 232, + "name": "webdav_fs.kext", + "path": "Extensions/webdav_fs.kext", + "children": [ + { + "value": 232, + "name": "Contents", + "path": "Extensions/webdav_fs.kext/Contents" + } + ] + } + ] + }, + { + "value": 11992, + "name": "Filesystems", + "path": "Filesystems", + "children": [ + { + "value": 5740, + "name": "acfs.fs", + "path": "Filesystems/acfs.fs", + "children": [ + { + "value": 5644, + "name": "Contents", + "path": "Filesystems/acfs.fs/Contents" + } + ] + }, + { + "value": 636, + "name": "AppleShare", + "path": "Filesystems/AppleShare", + "children": [ + { + "value": 524, + "name": "afpfs.kext", + "path": "Filesystems/AppleShare/afpfs.kext" + }, + { + "value": 88, + "name": "asp_tcp.kext", + "path": "Filesystems/AppleShare/asp_tcp.kext" + }, + { + "value": 16, + "name": "check_afp.app", + "path": "Filesystems/AppleShare/check_afp.app" + } + ] + }, + { + "value": 16, + "name": "cd9660.fs", + "path": "Filesystems/cd9660.fs", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "Filesystems/cd9660.fs/Contents" + } + ] + }, + { + "value": 32, + "name": "cddafs.fs", + "path": "Filesystems/cddafs.fs", + "children": [ + { + "value": 32, + "name": "Contents", + "path": "Filesystems/cddafs.fs/Contents" + } + ] + }, + { + "value": 76, + "name": "exfat.fs", + "path": "Filesystems/exfat.fs", + "children": [ + { + "value": 72, + "name": "Contents", + "path": "Filesystems/exfat.fs/Contents" + } + ] + }, + { + "value": 36, + "name": "ftp.fs", + "path": "Filesystems/ftp.fs", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Filesystems/ftp.fs/Contents" + } + ] + }, + { + "value": 3180, + "name": "hfs.fs", + "path": "Filesystems/hfs.fs", + "children": [ + { + "value": 452, + "name": "Contents", + "path": "Filesystems/hfs.fs/Contents" + }, + { + "value": 2724, + "name": "Encodings", + "path": "Filesystems/hfs.fs/Encodings" + } + ] + }, + { + "value": 64, + "name": "msdos.fs", + "path": "Filesystems/msdos.fs", + "children": [ + { + "value": 60, + "name": "Contents", + "path": "Filesystems/msdos.fs/Contents" + } + ] + }, + { + "value": 172, + "name": "NetFSPlugins", + "path": "Filesystems/NetFSPlugins", + "children": [ + { + "value": 44, + "name": "afp.bundle", + "path": "Filesystems/NetFSPlugins/afp.bundle" + }, + { + "value": 20, + "name": "ftp.bundle", + "path": "Filesystems/NetFSPlugins/ftp.bundle" + }, + { + "value": 36, + "name": "http.bundle", + "path": "Filesystems/NetFSPlugins/http.bundle" + }, + { + "value": 16, + "name": "nfs.bundle", + "path": "Filesystems/NetFSPlugins/nfs.bundle" + }, + { + "value": 56, + "name": "smb.bundle", + "path": "Filesystems/NetFSPlugins/smb.bundle" + } + ] + }, + { + "value": 0, + "name": "nfs.fs", + "path": "Filesystems/nfs.fs", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Filesystems/nfs.fs/Contents" + } + ] + }, + { + "value": 24, + "name": "ntfs.fs", + "path": "Filesystems/ntfs.fs", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Filesystems/ntfs.fs/Contents" + } + ] + }, + { + "value": 1800, + "name": "prlufs.fs", + "path": "Filesystems/prlufs.fs", + "children": [ + { + "value": 1800, + "name": "Support", + "path": "Filesystems/prlufs.fs/Support" + } + ] + }, + { + "value": 0, + "name": "smbfs.fs", + "path": "Filesystems/smbfs.fs", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Filesystems/smbfs.fs/Contents" + } + ] + }, + { + "value": 204, + "name": "udf.fs", + "path": "Filesystems/udf.fs", + "children": [ + { + "value": 200, + "name": "Contents", + "path": "Filesystems/udf.fs/Contents" + } + ] + }, + { + "value": 8, + "name": "webdav.fs", + "path": "Filesystems/webdav.fs", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Filesystems/webdav.fs/Contents" + }, + { + "value": 8, + "name": "Support", + "path": "Filesystems/webdav.fs/Support" + } + ] + } + ] + }, + { + "value": 112, + "name": "Filters", + "path": "Filters" + }, + { + "value": 201212, + "name": "Fonts", + "path": "Fonts" + }, + { + "value": 647772, + "name": "Frameworks", + "path": "Frameworks", + "children": [ + { + "value": 9800, + "name": "Accelerate.framework", + "path": "Frameworks/Accelerate.framework", + "children": [ + { + "value": 9788, + "name": "Versions", + "path": "Frameworks/Accelerate.framework/Versions" + } + ] + }, + { + "value": 100, + "name": "Accounts.framework", + "path": "Frameworks/Accounts.framework", + "children": [ + { + "value": 92, + "name": "Versions", + "path": "Frameworks/Accounts.framework/Versions" + } + ] + }, + { + "value": 10144, + "name": "AddressBook.framework", + "path": "Frameworks/AddressBook.framework", + "children": [ + { + "value": 10136, + "name": "Versions", + "path": "Frameworks/AddressBook.framework/Versions" + } + ] + }, + { + "value": 64, + "name": "AGL.framework", + "path": "Frameworks/AGL.framework", + "children": [ + { + "value": 56, + "name": "Versions", + "path": "Frameworks/AGL.framework/Versions" + } + ] + }, + { + "value": 30320, + "name": "AppKit.framework", + "path": "Frameworks/AppKit.framework", + "children": [ + { + "value": 30308, + "name": "Versions", + "path": "Frameworks/AppKit.framework/Versions" + } + ] + }, + { + "value": 12, + "name": "AppKitScripting.framework", + "path": "Frameworks/AppKitScripting.framework", + "children": [ + { + "value": 4, + "name": "Versions", + "path": "Frameworks/AppKitScripting.framework/Versions" + } + ] + }, + { + "value": 632, + "name": "AppleScriptKit.framework", + "path": "Frameworks/AppleScriptKit.framework", + "children": [ + { + "value": 624, + "name": "Versions", + "path": "Frameworks/AppleScriptKit.framework/Versions" + } + ] + }, + { + "value": 104, + "name": "AppleScriptObjC.framework", + "path": "Frameworks/AppleScriptObjC.framework", + "children": [ + { + "value": 96, + "name": "Versions", + "path": "Frameworks/AppleScriptObjC.framework/Versions" + } + ] + }, + { + "value": 324, + "name": "AppleShareClientCore.framework", + "path": "Frameworks/AppleShareClientCore.framework", + "children": [ + { + "value": 316, + "name": "Versions", + "path": "Frameworks/AppleShareClientCore.framework/Versions" + } + ] + }, + { + "value": 77200, + "name": "ApplicationServices.framework", + "path": "Frameworks/ApplicationServices.framework", + "children": [ + { + "value": 77188, + "name": "Versions", + "path": "Frameworks/ApplicationServices.framework/Versions" + } + ] + }, + { + "value": 1792, + "name": "AudioToolbox.framework", + "path": "Frameworks/AudioToolbox.framework", + "children": [ + { + "value": 1716, + "name": "Versions", + "path": "Frameworks/AudioToolbox.framework/Versions" + }, + { + "value": 68, + "name": "XPCServices", + "path": "Frameworks/AudioToolbox.framework/XPCServices" + } + ] + }, + { + "value": 40, + "name": "AudioUnit.framework", + "path": "Frameworks/AudioUnit.framework", + "children": [ + { + "value": 32, + "name": "Versions", + "path": "Frameworks/AudioUnit.framework/Versions" + } + ] + }, + { + "value": 736, + "name": "AudioVideoBridging.framework", + "path": "Frameworks/AudioVideoBridging.framework", + "children": [ + { + "value": 728, + "name": "Versions", + "path": "Frameworks/AudioVideoBridging.framework/Versions" + } + ] + }, + { + "value": 11496, + "name": "Automator.framework", + "path": "Frameworks/Automator.framework", + "children": [ + { + "value": 4, + "name": "Frameworks", + "path": "Frameworks/Automator.framework/Frameworks" + }, + { + "value": 11484, + "name": "Versions", + "path": "Frameworks/Automator.framework/Versions" + } + ] + }, + { + "value": 1648, + "name": "AVFoundation.framework", + "path": "Frameworks/AVFoundation.framework", + "children": [ + { + "value": 1640, + "name": "Versions", + "path": "Frameworks/AVFoundation.framework/Versions" + } + ] + }, + { + "value": 408, + "name": "AVKit.framework", + "path": "Frameworks/AVKit.framework", + "children": [ + { + "value": 400, + "name": "Versions", + "path": "Frameworks/AVKit.framework/Versions" + } + ] + }, + { + "value": 1132, + "name": "CalendarStore.framework", + "path": "Frameworks/CalendarStore.framework", + "children": [ + { + "value": 1124, + "name": "Versions", + "path": "Frameworks/CalendarStore.framework/Versions" + } + ] + }, + { + "value": 25920, + "name": "Carbon.framework", + "path": "Frameworks/Carbon.framework", + "children": [ + { + "value": 25908, + "name": "Versions", + "path": "Frameworks/Carbon.framework/Versions" + } + ] + }, + { + "value": 2000, + "name": "CFNetwork.framework", + "path": "Frameworks/CFNetwork.framework", + "children": [ + { + "value": 1992, + "name": "Versions", + "path": "Frameworks/CFNetwork.framework/Versions" + } + ] + }, + { + "value": 20, + "name": "Cocoa.framework", + "path": "Frameworks/Cocoa.framework", + "children": [ + { + "value": 12, + "name": "Versions", + "path": "Frameworks/Cocoa.framework/Versions" + } + ] + }, + { + "value": 900, + "name": "Collaboration.framework", + "path": "Frameworks/Collaboration.framework", + "children": [ + { + "value": 892, + "name": "Versions", + "path": "Frameworks/Collaboration.framework/Versions" + } + ] + }, + { + "value": 432, + "name": "CoreAudio.framework", + "path": "Frameworks/CoreAudio.framework", + "children": [ + { + "value": 420, + "name": "Versions", + "path": "Frameworks/CoreAudio.framework/Versions" + } + ] + }, + { + "value": 716, + "name": "CoreAudioKit.framework", + "path": "Frameworks/CoreAudioKit.framework", + "children": [ + { + "value": 708, + "name": "Versions", + "path": "Frameworks/CoreAudioKit.framework/Versions" + } + ] + }, + { + "value": 2632, + "name": "CoreData.framework", + "path": "Frameworks/CoreData.framework", + "children": [ + { + "value": 2624, + "name": "Versions", + "path": "Frameworks/CoreData.framework/Versions" + } + ] + }, + { + "value": 2608, + "name": "CoreFoundation.framework", + "path": "Frameworks/CoreFoundation.framework", + "children": [ + { + "value": 2600, + "name": "Versions", + "path": "Frameworks/CoreFoundation.framework/Versions" + } + ] + }, + { + "value": 9152, + "name": "CoreGraphics.framework", + "path": "Frameworks/CoreGraphics.framework", + "children": [ + { + "value": 9144, + "name": "Versions", + "path": "Frameworks/CoreGraphics.framework/Versions" + } + ] + }, + { + "value": 14552, + "name": "CoreLocation.framework", + "path": "Frameworks/CoreLocation.framework", + "children": [ + { + "value": 14540, + "name": "Versions", + "path": "Frameworks/CoreLocation.framework/Versions" + } + ] + }, + { + "value": 452, + "name": "CoreMedia.framework", + "path": "Frameworks/CoreMedia.framework", + "children": [ + { + "value": 440, + "name": "Versions", + "path": "Frameworks/CoreMedia.framework/Versions" + } + ] + }, + { + "value": 2876, + "name": "CoreMediaIO.framework", + "path": "Frameworks/CoreMediaIO.framework", + "children": [ + { + "value": 2864, + "name": "Versions", + "path": "Frameworks/CoreMediaIO.framework/Versions" + } + ] + }, + { + "value": 320, + "name": "CoreMIDI.framework", + "path": "Frameworks/CoreMIDI.framework", + "children": [ + { + "value": 308, + "name": "Versions", + "path": "Frameworks/CoreMIDI.framework/Versions" + } + ] + }, + { + "value": 20, + "name": "CoreMIDIServer.framework", + "path": "Frameworks/CoreMIDIServer.framework", + "children": [ + { + "value": 12, + "name": "Versions", + "path": "Frameworks/CoreMIDIServer.framework/Versions" + } + ] + }, + { + "value": 12024, + "name": "CoreServices.framework", + "path": "Frameworks/CoreServices.framework", + "children": [ + { + "value": 12012, + "name": "Versions", + "path": "Frameworks/CoreServices.framework/Versions" + } + ] + }, + { + "value": 1472, + "name": "CoreText.framework", + "path": "Frameworks/CoreText.framework", + "children": [ + { + "value": 1464, + "name": "Versions", + "path": "Frameworks/CoreText.framework/Versions" + } + ] + }, + { + "value": 204, + "name": "CoreVideo.framework", + "path": "Frameworks/CoreVideo.framework", + "children": [ + { + "value": 196, + "name": "Versions", + "path": "Frameworks/CoreVideo.framework/Versions" + } + ] + }, + { + "value": 520, + "name": "CoreWiFi.framework", + "path": "Frameworks/CoreWiFi.framework", + "children": [ + { + "value": 512, + "name": "Versions", + "path": "Frameworks/CoreWiFi.framework/Versions" + } + ] + }, + { + "value": 536, + "name": "CoreWLAN.framework", + "path": "Frameworks/CoreWLAN.framework", + "children": [ + { + "value": 528, + "name": "Versions", + "path": "Frameworks/CoreWLAN.framework/Versions" + } + ] + }, + { + "value": 88, + "name": "DirectoryService.framework", + "path": "Frameworks/DirectoryService.framework", + "children": [ + { + "value": 80, + "name": "Versions", + "path": "Frameworks/DirectoryService.framework/Versions" + } + ] + }, + { + "value": 1352, + "name": "DiscRecording.framework", + "path": "Frameworks/DiscRecording.framework", + "children": [ + { + "value": 1344, + "name": "Versions", + "path": "Frameworks/DiscRecording.framework/Versions" + } + ] + }, + { + "value": 1384, + "name": "DiscRecordingUI.framework", + "path": "Frameworks/DiscRecordingUI.framework", + "children": [ + { + "value": 1376, + "name": "Versions", + "path": "Frameworks/DiscRecordingUI.framework/Versions" + } + ] + }, + { + "value": 76, + "name": "DiskArbitration.framework", + "path": "Frameworks/DiskArbitration.framework", + "children": [ + { + "value": 68, + "name": "Versions", + "path": "Frameworks/DiskArbitration.framework/Versions" + } + ] + }, + { + "value": 32, + "name": "DrawSprocket.framework", + "path": "Frameworks/DrawSprocket.framework", + "children": [ + { + "value": 24, + "name": "Versions", + "path": "Frameworks/DrawSprocket.framework/Versions" + } + ] + }, + { + "value": 20, + "name": "DVComponentGlue.framework", + "path": "Frameworks/DVComponentGlue.framework", + "children": [ + { + "value": 12, + "name": "Versions", + "path": "Frameworks/DVComponentGlue.framework/Versions" + } + ] + }, + { + "value": 1420, + "name": "DVDPlayback.framework", + "path": "Frameworks/DVDPlayback.framework", + "children": [ + { + "value": 1412, + "name": "Versions", + "path": "Frameworks/DVDPlayback.framework/Versions" + } + ] + }, + { + "value": 232, + "name": "EventKit.framework", + "path": "Frameworks/EventKit.framework", + "children": [ + { + "value": 224, + "name": "Versions", + "path": "Frameworks/EventKit.framework/Versions" + } + ] + }, + { + "value": 32, + "name": "ExceptionHandling.framework", + "path": "Frameworks/ExceptionHandling.framework", + "children": [ + { + "value": 24, + "name": "Versions", + "path": "Frameworks/ExceptionHandling.framework/Versions" + } + ] + }, + { + "value": 32, + "name": "ForceFeedback.framework", + "path": "Frameworks/ForceFeedback.framework", + "children": [ + { + "value": 24, + "name": "Versions", + "path": "Frameworks/ForceFeedback.framework/Versions" + } + ] + }, + { + "value": 4228, + "name": "Foundation.framework", + "path": "Frameworks/Foundation.framework", + "children": [ + { + "value": 4216, + "name": "Versions", + "path": "Frameworks/Foundation.framework/Versions" + } + ] + }, + { + "value": 52, + "name": "FWAUserLib.framework", + "path": "Frameworks/FWAUserLib.framework", + "children": [ + { + "value": 44, + "name": "Versions", + "path": "Frameworks/FWAUserLib.framework/Versions" + } + ] + }, + { + "value": 60, + "name": "GameController.framework", + "path": "Frameworks/GameController.framework", + "children": [ + { + "value": 52, + "name": "Versions", + "path": "Frameworks/GameController.framework/Versions" + } + ] + }, + { + "value": 44244, + "name": "GameKit.framework", + "path": "Frameworks/GameKit.framework", + "children": [ + { + "value": 44236, + "name": "Versions", + "path": "Frameworks/GameKit.framework/Versions" + } + ] + }, + { + "value": 132, + "name": "GLKit.framework", + "path": "Frameworks/GLKit.framework", + "children": [ + { + "value": 124, + "name": "Versions", + "path": "Frameworks/GLKit.framework/Versions" + } + ] + }, + { + "value": 1740, + "name": "GLUT.framework", + "path": "Frameworks/GLUT.framework", + "children": [ + { + "value": 1732, + "name": "Versions", + "path": "Frameworks/GLUT.framework/Versions" + } + ] + }, + { + "value": 280, + "name": "GSS.framework", + "path": "Frameworks/GSS.framework", + "children": [ + { + "value": 272, + "name": "Versions", + "path": "Frameworks/GSS.framework/Versions" + } + ] + }, + { + "value": 236, + "name": "ICADevices.framework", + "path": "Frameworks/ICADevices.framework", + "children": [ + { + "value": 228, + "name": "Versions", + "path": "Frameworks/ICADevices.framework/Versions" + } + ] + }, + { + "value": 392, + "name": "ImageCaptureCore.framework", + "path": "Frameworks/ImageCaptureCore.framework", + "children": [ + { + "value": 384, + "name": "Versions", + "path": "Frameworks/ImageCaptureCore.framework/Versions" + } + ] + }, + { + "value": 4008, + "name": "ImageIO.framework", + "path": "Frameworks/ImageIO.framework", + "children": [ + { + "value": 4000, + "name": "Versions", + "path": "Frameworks/ImageIO.framework/Versions" + } + ] + }, + { + "value": 104, + "name": "IMServicePlugIn.framework", + "path": "Frameworks/IMServicePlugIn.framework", + "children": [ + { + "value": 28, + "name": "IMServicePlugInAgent.app", + "path": "Frameworks/IMServicePlugIn.framework/IMServicePlugInAgent.app" + }, + { + "value": 64, + "name": "Versions", + "path": "Frameworks/IMServicePlugIn.framework/Versions" + } + ] + }, + { + "value": 368, + "name": "InputMethodKit.framework", + "path": "Frameworks/InputMethodKit.framework", + "children": [ + { + "value": 356, + "name": "Versions", + "path": "Frameworks/InputMethodKit.framework/Versions" + } + ] + }, + { + "value": 360, + "name": "InstallerPlugins.framework", + "path": "Frameworks/InstallerPlugins.framework", + "children": [ + { + "value": 352, + "name": "Versions", + "path": "Frameworks/InstallerPlugins.framework/Versions" + } + ] + }, + { + "value": 76, + "name": "InstantMessage.framework", + "path": "Frameworks/InstantMessage.framework", + "children": [ + { + "value": 68, + "name": "Versions", + "path": "Frameworks/InstantMessage.framework/Versions" + } + ] + }, + { + "value": 904, + "name": "IOBluetooth.framework", + "path": "Frameworks/IOBluetooth.framework", + "children": [ + { + "value": 892, + "name": "Versions", + "path": "Frameworks/IOBluetooth.framework/Versions" + } + ] + }, + { + "value": 4592, + "name": "IOBluetoothUI.framework", + "path": "Frameworks/IOBluetoothUI.framework", + "children": [ + { + "value": 4584, + "name": "Versions", + "path": "Frameworks/IOBluetoothUI.framework/Versions" + } + ] + }, + { + "value": 688, + "name": "IOKit.framework", + "path": "Frameworks/IOKit.framework", + "children": [ + { + "value": 680, + "name": "Versions", + "path": "Frameworks/IOKit.framework/Versions" + } + ] + }, + { + "value": 48, + "name": "IOSurface.framework", + "path": "Frameworks/IOSurface.framework", + "children": [ + { + "value": 40, + "name": "Versions", + "path": "Frameworks/IOSurface.framework/Versions" + } + ] + }, + { + "value": 28, + "name": "JavaFrameEmbedding.framework", + "path": "Frameworks/JavaFrameEmbedding.framework", + "children": [ + { + "value": 20, + "name": "Versions", + "path": "Frameworks/JavaFrameEmbedding.framework/Versions" + } + ] + }, + { + "value": 3336, + "name": "JavaScriptCore.framework", + "path": "Frameworks/JavaScriptCore.framework", + "children": [ + { + "value": 3328, + "name": "Versions", + "path": "Frameworks/JavaScriptCore.framework/Versions" + } + ] + }, + { + "value": 2756, + "name": "JavaVM.framework", + "path": "Frameworks/JavaVM.framework", + "children": [ + { + "value": 2728, + "name": "Versions", + "path": "Frameworks/JavaVM.framework/Versions" + } + ] + }, + { + "value": 168, + "name": "Kerberos.framework", + "path": "Frameworks/Kerberos.framework", + "children": [ + { + "value": 160, + "name": "Versions", + "path": "Frameworks/Kerberos.framework/Versions" + } + ] + }, + { + "value": 36, + "name": "Kernel.framework", + "path": "Frameworks/Kernel.framework", + "children": [ + { + "value": 32, + "name": "Versions", + "path": "Frameworks/Kernel.framework/Versions" + } + ] + }, + { + "value": 200, + "name": "LatentSemanticMapping.framework", + "path": "Frameworks/LatentSemanticMapping.framework", + "children": [ + { + "value": 192, + "name": "Versions", + "path": "Frameworks/LatentSemanticMapping.framework/Versions" + } + ] + }, + { + "value": 284, + "name": "LDAP.framework", + "path": "Frameworks/LDAP.framework", + "children": [ + { + "value": 276, + "name": "Versions", + "path": "Frameworks/LDAP.framework/Versions" + } + ] + }, + { + "value": 1872, + "name": "MapKit.framework", + "path": "Frameworks/MapKit.framework", + "children": [ + { + "value": 1864, + "name": "Versions", + "path": "Frameworks/MapKit.framework/Versions" + } + ] + }, + { + "value": 56, + "name": "MediaAccessibility.framework", + "path": "Frameworks/MediaAccessibility.framework", + "children": [ + { + "value": 48, + "name": "Versions", + "path": "Frameworks/MediaAccessibility.framework/Versions" + } + ] + }, + { + "value": 100, + "name": "MediaLibrary.framework", + "path": "Frameworks/MediaLibrary.framework", + "children": [ + { + "value": 88, + "name": "Versions", + "path": "Frameworks/MediaLibrary.framework/Versions" + } + ] + }, + { + "value": 3708, + "name": "MediaToolbox.framework", + "path": "Frameworks/MediaToolbox.framework", + "children": [ + { + "value": 3700, + "name": "Versions", + "path": "Frameworks/MediaToolbox.framework/Versions" + } + ] + }, + { + "value": 16, + "name": "Message.framework", + "path": "Frameworks/Message.framework", + "children": [ + { + "value": 12, + "name": "Versions", + "path": "Frameworks/Message.framework/Versions" + } + ] + }, + { + "value": 64, + "name": "NetFS.framework", + "path": "Frameworks/NetFS.framework", + "children": [ + { + "value": 56, + "name": "Versions", + "path": "Frameworks/NetFS.framework/Versions" + } + ] + }, + { + "value": 192, + "name": "OpenAL.framework", + "path": "Frameworks/OpenAL.framework", + "children": [ + { + "value": 184, + "name": "Versions", + "path": "Frameworks/OpenAL.framework/Versions" + } + ] + }, + { + "value": 78380, + "name": "OpenCL.framework", + "path": "Frameworks/OpenCL.framework", + "children": [ + { + "value": 78368, + "name": "Versions", + "path": "Frameworks/OpenCL.framework/Versions" + } + ] + }, + { + "value": 288, + "name": "OpenDirectory.framework", + "path": "Frameworks/OpenDirectory.framework", + "children": [ + { + "value": 252, + "name": "Versions", + "path": "Frameworks/OpenDirectory.framework/Versions" + } + ] + }, + { + "value": 25628, + "name": "OpenGL.framework", + "path": "Frameworks/OpenGL.framework", + "children": [ + { + "value": 25616, + "name": "Versions", + "path": "Frameworks/OpenGL.framework/Versions" + } + ] + }, + { + "value": 1136, + "name": "OSAKit.framework", + "path": "Frameworks/OSAKit.framework", + "children": [ + { + "value": 1128, + "name": "Versions", + "path": "Frameworks/OSAKit.framework/Versions" + } + ] + }, + { + "value": 88, + "name": "PCSC.framework", + "path": "Frameworks/PCSC.framework", + "children": [ + { + "value": 80, + "name": "Versions", + "path": "Frameworks/PCSC.framework/Versions" + } + ] + }, + { + "value": 192, + "name": "PreferencePanes.framework", + "path": "Frameworks/PreferencePanes.framework", + "children": [ + { + "value": 180, + "name": "Versions", + "path": "Frameworks/PreferencePanes.framework/Versions" + } + ] + }, + { + "value": 1012, + "name": "PubSub.framework", + "path": "Frameworks/PubSub.framework", + "children": [ + { + "value": 1004, + "name": "Versions", + "path": "Frameworks/PubSub.framework/Versions" + } + ] + }, + { + "value": 129696, + "name": "Python.framework", + "path": "Frameworks/Python.framework", + "children": [ + { + "value": 129684, + "name": "Versions", + "path": "Frameworks/Python.framework/Versions" + } + ] + }, + { + "value": 2516, + "name": "QTKit.framework", + "path": "Frameworks/QTKit.framework", + "children": [ + { + "value": 2504, + "name": "Versions", + "path": "Frameworks/QTKit.framework/Versions" + } + ] + }, + { + "value": 23712, + "name": "Quartz.framework", + "path": "Frameworks/Quartz.framework", + "children": [ + { + "value": 23700, + "name": "Versions", + "path": "Frameworks/Quartz.framework/Versions" + } + ] + }, + { + "value": 6644, + "name": "QuartzCore.framework", + "path": "Frameworks/QuartzCore.framework", + "children": [ + { + "value": 6632, + "name": "Versions", + "path": "Frameworks/QuartzCore.framework/Versions" + } + ] + }, + { + "value": 3960, + "name": "QuickLook.framework", + "path": "Frameworks/QuickLook.framework", + "children": [ + { + "value": 3948, + "name": "Versions", + "path": "Frameworks/QuickLook.framework/Versions" + } + ] + }, + { + "value": 3460, + "name": "QuickTime.framework", + "path": "Frameworks/QuickTime.framework", + "children": [ + { + "value": 3452, + "name": "Versions", + "path": "Frameworks/QuickTime.framework/Versions" + } + ] + }, + { + "value": 13168, + "name": "Ruby.framework", + "path": "Frameworks/Ruby.framework", + "children": [ + { + "value": 13160, + "name": "Versions", + "path": "Frameworks/Ruby.framework/Versions" + } + ] + }, + { + "value": 204, + "name": "RubyCocoa.framework", + "path": "Frameworks/RubyCocoa.framework", + "children": [ + { + "value": 196, + "name": "Versions", + "path": "Frameworks/RubyCocoa.framework/Versions" + } + ] + }, + { + "value": 3628, + "name": "SceneKit.framework", + "path": "Frameworks/SceneKit.framework", + "children": [ + { + "value": 3616, + "name": "Versions", + "path": "Frameworks/SceneKit.framework/Versions" + } + ] + }, + { + "value": 1812, + "name": "ScreenSaver.framework", + "path": "Frameworks/ScreenSaver.framework", + "children": [ + { + "value": 1804, + "name": "Versions", + "path": "Frameworks/ScreenSaver.framework/Versions" + } + ] + }, + { + "value": 12, + "name": "Scripting.framework", + "path": "Frameworks/Scripting.framework", + "children": [ + { + "value": 4, + "name": "Versions", + "path": "Frameworks/Scripting.framework/Versions" + } + ] + }, + { + "value": 144, + "name": "ScriptingBridge.framework", + "path": "Frameworks/ScriptingBridge.framework", + "children": [ + { + "value": 136, + "name": "Versions", + "path": "Frameworks/ScriptingBridge.framework/Versions" + } + ] + }, + { + "value": 6224, + "name": "Security.framework", + "path": "Frameworks/Security.framework", + "children": [ + { + "value": 124, + "name": "PlugIns", + "path": "Frameworks/Security.framework/PlugIns" + }, + { + "value": 6088, + "name": "Versions", + "path": "Frameworks/Security.framework/Versions" + } + ] + }, + { + "value": 2076, + "name": "SecurityFoundation.framework", + "path": "Frameworks/SecurityFoundation.framework", + "children": [ + { + "value": 2068, + "name": "Versions", + "path": "Frameworks/SecurityFoundation.framework/Versions" + } + ] + }, + { + "value": 8660, + "name": "SecurityInterface.framework", + "path": "Frameworks/SecurityInterface.framework", + "children": [ + { + "value": 8652, + "name": "Versions", + "path": "Frameworks/SecurityInterface.framework/Versions" + } + ] + }, + { + "value": 88, + "name": "ServiceManagement.framework", + "path": "Frameworks/ServiceManagement.framework", + "children": [ + { + "value": 68, + "name": "Versions", + "path": "Frameworks/ServiceManagement.framework/Versions" + }, + { + "value": 12, + "name": "XPCServices", + "path": "Frameworks/ServiceManagement.framework/XPCServices" + } + ] + }, + { + "value": 1112, + "name": "Social.framework", + "path": "Frameworks/Social.framework", + "children": [ + { + "value": 516, + "name": "Versions", + "path": "Frameworks/Social.framework/Versions" + }, + { + "value": 588, + "name": "XPCServices", + "path": "Frameworks/Social.framework/XPCServices" + } + ] + }, + { + "value": 500, + "name": "SpriteKit.framework", + "path": "Frameworks/SpriteKit.framework", + "children": [ + { + "value": 492, + "name": "Versions", + "path": "Frameworks/SpriteKit.framework/Versions" + } + ] + }, + { + "value": 96, + "name": "StoreKit.framework", + "path": "Frameworks/StoreKit.framework", + "children": [ + { + "value": 88, + "name": "Versions", + "path": "Frameworks/StoreKit.framework/Versions" + } + ] + }, + { + "value": 1608, + "name": "SyncServices.framework", + "path": "Frameworks/SyncServices.framework", + "children": [ + { + "value": 1600, + "name": "Versions", + "path": "Frameworks/SyncServices.framework/Versions" + } + ] + }, + { + "value": 44, + "name": "System.framework", + "path": "Frameworks/System.framework", + "children": [ + { + "value": 36, + "name": "Versions", + "path": "Frameworks/System.framework/Versions" + } + ] + }, + { + "value": 576, + "name": "SystemConfiguration.framework", + "path": "Frameworks/SystemConfiguration.framework", + "children": [ + { + "value": 568, + "name": "Versions", + "path": "Frameworks/SystemConfiguration.framework/Versions" + } + ] + }, + { + "value": 3208, + "name": "Tcl.framework", + "path": "Frameworks/Tcl.framework", + "children": [ + { + "value": 3200, + "name": "Versions", + "path": "Frameworks/Tcl.framework/Versions" + } + ] + }, + { + "value": 3172, + "name": "Tk.framework", + "path": "Frameworks/Tk.framework", + "children": [ + { + "value": 3160, + "name": "Versions", + "path": "Frameworks/Tk.framework/Versions" + } + ] + }, + { + "value": 76, + "name": "TWAIN.framework", + "path": "Frameworks/TWAIN.framework", + "children": [ + { + "value": 68, + "name": "Versions", + "path": "Frameworks/TWAIN.framework/Versions" + } + ] + }, + { + "value": 24, + "name": "VideoDecodeAcceleration.framework", + "path": "Frameworks/VideoDecodeAcceleration.framework", + "children": [ + { + "value": 16, + "name": "Versions", + "path": "Frameworks/VideoDecodeAcceleration.framework/Versions" + } + ] + }, + { + "value": 3648, + "name": "VideoToolbox.framework", + "path": "Frameworks/VideoToolbox.framework", + "children": [ + { + "value": 3636, + "name": "Versions", + "path": "Frameworks/VideoToolbox.framework/Versions" + } + ] + }, + { + "value": 17668, + "name": "WebKit.framework", + "path": "Frameworks/WebKit.framework", + "children": [ + { + "value": 17512, + "name": "Versions", + "path": "Frameworks/WebKit.framework/Versions" + }, + { + "value": 116, + "name": "WebKitPluginHost.app", + "path": "Frameworks/WebKit.framework/WebKitPluginHost.app" + } + ] + } + ] + }, + { + "value": 1076, + "name": "Graphics", + "path": "Graphics", + "children": [ + { + "value": 876, + "name": "QuartzComposer Patches", + "path": "Graphics/QuartzComposer Patches", + "children": [ + { + "value": 148, + "name": "Backdrops.plugin", + "path": "Graphics/QuartzComposer Patches/Backdrops.plugin" + }, + { + "value": 36, + "name": "FaceEffects.plugin", + "path": "Graphics/QuartzComposer Patches/FaceEffects.plugin" + } + ] + }, + { + "value": 200, + "name": "QuartzComposer Plug-Ins", + "path": "Graphics/QuartzComposer Plug-Ins", + "children": [ + { + "value": 200, + "name": "WOTD.plugin", + "path": "Graphics/QuartzComposer Plug-Ins/WOTD.plugin" + } + ] + } + ] + }, + { + "value": 0, + "name": "IdentityServices", + "path": "IdentityServices", + "children": [ + { + "value": 0, + "name": "ServiceDefinitions", + "path": "IdentityServices/ServiceDefinitions" + } + ] + }, + { + "value": 2900, + "name": "ImageCapture", + "path": "ImageCapture", + "children": [ + { + "value": 200, + "name": "Automatic Tasks", + "path": "ImageCapture/Automatic Tasks", + "children": [ + { + "value": 52, + "name": "Build Web Page.app", + "path": "ImageCapture/Automatic Tasks/Build Web Page.app" + }, + { + "value": 148, + "name": "MakePDF.app", + "path": "ImageCapture/Automatic Tasks/MakePDF.app" + } + ] + }, + { + "value": 480, + "name": "Devices", + "path": "ImageCapture/Devices", + "children": [ + { + "value": 84, + "name": "AirScanScanner.app", + "path": "ImageCapture/Devices/AirScanScanner.app" + }, + { + "value": 44, + "name": "MassStorageCamera.app", + "path": "ImageCapture/Devices/MassStorageCamera.app" + }, + { + "value": 124, + "name": "PTPCamera.app", + "path": "ImageCapture/Devices/PTPCamera.app" + }, + { + "value": 36, + "name": "Type4Camera.app", + "path": "ImageCapture/Devices/Type4Camera.app" + }, + { + "value": 32, + "name": "Type5Camera.app", + "path": "ImageCapture/Devices/Type5Camera.app" + }, + { + "value": 36, + "name": "Type8Camera.app", + "path": "ImageCapture/Devices/Type8Camera.app" + }, + { + "value": 124, + "name": "VirtualScanner.app", + "path": "ImageCapture/Devices/VirtualScanner.app" + } + ] + }, + { + "value": 2212, + "name": "Support", + "path": "ImageCapture/Support", + "children": [ + { + "value": 432, + "name": "Application", + "path": "ImageCapture/Support/Application" + }, + { + "value": 1608, + "name": "Icons", + "path": "ImageCapture/Support/Icons" + }, + { + "value": 172, + "name": "Image Capture Extension.app", + "path": "ImageCapture/Support/Image Capture Extension.app" + }, + { + "value": 3184, + "name": "CoreDeploy.bundle", + "path": "Java/Support/CoreDeploy.bundle" + }, + { + "value": 2732, + "name": "Deploy.bundle", + "path": "Java/Support/Deploy.bundle" + } + ] + }, + { + "value": 8, + "name": "Tools", + "path": "ImageCapture/Tools" + }, + { + "value": 0, + "name": "TWAIN Data Sources", + "path": "ImageCapture/TWAIN Data Sources" + } + ] + }, + { + "value": 23668, + "name": "InputMethods", + "path": "InputMethods", + "children": [ + { + "value": 1400, + "name": "50onPaletteServer.app", + "path": "InputMethods/50onPaletteServer.app", + "children": [ + { + "value": 1400, + "name": "Contents", + "path": "InputMethods/50onPaletteServer.app/Contents" + } + ] + }, + { + "value": 5728, + "name": "CharacterPalette.app", + "path": "InputMethods/CharacterPalette.app", + "children": [ + { + "value": 5728, + "name": "Contents", + "path": "InputMethods/CharacterPalette.app/Contents" + } + ] + }, + { + "value": 2476, + "name": "DictationIM.app", + "path": "InputMethods/DictationIM.app", + "children": [ + { + "value": 2476, + "name": "Contents", + "path": "InputMethods/DictationIM.app/Contents" + } + ] + }, + { + "value": 88, + "name": "InkServer.app", + "path": "InputMethods/InkServer.app", + "children": [ + { + "value": 88, + "name": "Contents", + "path": "InputMethods/InkServer.app/Contents" + } + ] + }, + { + "value": 736, + "name": "KeyboardViewer.app", + "path": "InputMethods/KeyboardViewer.app", + "children": [ + { + "value": 736, + "name": "Contents", + "path": "InputMethods/KeyboardViewer.app/Contents" + } + ] + }, + { + "value": 1144, + "name": "KoreanIM.app", + "path": "InputMethods/KoreanIM.app", + "children": [ + { + "value": 1144, + "name": "Contents", + "path": "InputMethods/KoreanIM.app/Contents" + } + ] + }, + { + "value": 2484, + "name": "Kotoeri.app", + "path": "InputMethods/Kotoeri.app", + "children": [ + { + "value": 2484, + "name": "Contents", + "path": "InputMethods/Kotoeri.app/Contents" + } + ] + }, + { + "value": 40, + "name": "PluginIM.app", + "path": "InputMethods/PluginIM.app", + "children": [ + { + "value": 40, + "name": "Contents", + "path": "InputMethods/PluginIM.app/Contents" + } + ] + }, + { + "value": 24, + "name": "PressAndHold.app", + "path": "InputMethods/PressAndHold.app", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "InputMethods/PressAndHold.app/Contents" + } + ] + }, + { + "value": 64, + "name": "SCIM.app", + "path": "InputMethods/SCIM.app", + "children": [ + { + "value": 64, + "name": "Contents", + "path": "InputMethods/SCIM.app/Contents" + } + ] + }, + { + "value": 6916, + "name": "Switch Control.app", + "path": "InputMethods/Switch Control.app", + "children": [ + { + "value": 6916, + "name": "Contents", + "path": "InputMethods/Switch Control.app/Contents" + } + ] + }, + { + "value": 104, + "name": "TamilIM.app", + "path": "InputMethods/TamilIM.app", + "children": [ + { + "value": 104, + "name": "Contents", + "path": "InputMethods/TamilIM.app/Contents" + } + ] + }, + { + "value": 92, + "name": "TCIM.app", + "path": "InputMethods/TCIM.app", + "children": [ + { + "value": 92, + "name": "Contents", + "path": "InputMethods/TCIM.app/Contents" + } + ] + }, + { + "value": 1820, + "name": "TrackpadIM.app", + "path": "InputMethods/TrackpadIM.app", + "children": [ + { + "value": 1820, + "name": "Contents", + "path": "InputMethods/TrackpadIM.app/Contents" + } + ] + }, + { + "value": 552, + "name": "VietnameseIM.app", + "path": "InputMethods/VietnameseIM.app", + "children": [ + { + "value": 552, + "name": "Contents", + "path": "InputMethods/VietnameseIM.app/Contents" + } + ] + } + ] + }, + { + "value": 17668, + "name": "InternetAccounts", + "path": "InternetAccounts", + "children": [ + { + "value": 336, + "name": "126.iaplugin", + "path": "InternetAccounts/126.iaplugin", + "children": [ + { + "value": 336, + "name": "Contents", + "path": "InternetAccounts/126.iaplugin/Contents" + } + ] + }, + { + "value": 332, + "name": "163.iaplugin", + "path": "InternetAccounts/163.iaplugin", + "children": [ + { + "value": 332, + "name": "Contents", + "path": "InternetAccounts/163.iaplugin/Contents" + } + ] + }, + { + "value": 48, + "name": "AddressBook.iaplugin", + "path": "InternetAccounts/AddressBook.iaplugin", + "children": [ + { + "value": 48, + "name": "Contents", + "path": "InternetAccounts/AddressBook.iaplugin/Contents" + } + ] + }, + { + "value": 304, + "name": "AOL.iaplugin", + "path": "InternetAccounts/AOL.iaplugin", + "children": [ + { + "value": 304, + "name": "Contents", + "path": "InternetAccounts/AOL.iaplugin/Contents" + } + ] + }, + { + "value": 44, + "name": "Calendar.iaplugin", + "path": "InternetAccounts/Calendar.iaplugin", + "children": [ + { + "value": 44, + "name": "Contents", + "path": "InternetAccounts/Calendar.iaplugin/Contents" + } + ] + }, + { + "value": 784, + "name": "Exchange.iaplugin", + "path": "InternetAccounts/Exchange.iaplugin", + "children": [ + { + "value": 784, + "name": "Contents", + "path": "InternetAccounts/Exchange.iaplugin/Contents" + } + ] + }, + { + "value": 996, + "name": "Facebook.iaplugin", + "path": "InternetAccounts/Facebook.iaplugin", + "children": [ + { + "value": 996, + "name": "Contents", + "path": "InternetAccounts/Facebook.iaplugin/Contents" + } + ] + }, + { + "value": 596, + "name": "Flickr.iaplugin", + "path": "InternetAccounts/Flickr.iaplugin", + "children": [ + { + "value": 596, + "name": "Contents", + "path": "InternetAccounts/Flickr.iaplugin/Contents" + } + ] + }, + { + "value": 384, + "name": "Google.iaplugin", + "path": "InternetAccounts/Google.iaplugin", + "children": [ + { + "value": 384, + "name": "Contents", + "path": "InternetAccounts/Google.iaplugin/Contents" + } + ] + }, + { + "value": 32, + "name": "iChat.iaplugin", + "path": "InternetAccounts/iChat.iaplugin", + "children": [ + { + "value": 32, + "name": "Contents", + "path": "InternetAccounts/iChat.iaplugin/Contents" + } + ] + }, + { + "value": 7436, + "name": "iCloud.iaplugin", + "path": "InternetAccounts/iCloud.iaplugin", + "children": [ + { + "value": 7436, + "name": "Contents", + "path": "InternetAccounts/iCloud.iaplugin/Contents" + } + ] + }, + { + "value": 840, + "name": "LinkedIn.iaplugin", + "path": "InternetAccounts/LinkedIn.iaplugin", + "children": [ + { + "value": 840, + "name": "Contents", + "path": "InternetAccounts/LinkedIn.iaplugin/Contents" + } + ] + }, + { + "value": 28, + "name": "Mail.iaplugin", + "path": "InternetAccounts/Mail.iaplugin", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "InternetAccounts/Mail.iaplugin/Contents" + } + ] + }, + { + "value": 32, + "name": "Notes.iaplugin", + "path": "InternetAccounts/Notes.iaplugin", + "children": [ + { + "value": 32, + "name": "Contents", + "path": "InternetAccounts/Notes.iaplugin/Contents" + } + ] + }, + { + "value": 416, + "name": "OSXServer.iaplugin", + "path": "InternetAccounts/OSXServer.iaplugin", + "children": [ + { + "value": 416, + "name": "Contents", + "path": "InternetAccounts/OSXServer.iaplugin/Contents" + } + ] + }, + { + "value": 376, + "name": "QQ.iaplugin", + "path": "InternetAccounts/QQ.iaplugin", + "children": [ + { + "value": 376, + "name": "Contents", + "path": "InternetAccounts/QQ.iaplugin/Contents" + } + ] + }, + { + "value": 32, + "name": "Reminders.iaplugin", + "path": "InternetAccounts/Reminders.iaplugin", + "children": [ + { + "value": 32, + "name": "Contents", + "path": "InternetAccounts/Reminders.iaplugin/Contents" + } + ] + }, + { + "value": 1024, + "name": "SetupPlugins", + "path": "InternetAccounts/SetupPlugins", + "children": [ + { + "value": 412, + "name": "CalUIAccountSetup.iaplugin", + "path": "InternetAccounts/SetupPlugins/CalUIAccountSetup.iaplugin" + }, + { + "value": 580, + "name": "Contacts.iaplugin", + "path": "InternetAccounts/SetupPlugins/Contacts.iaplugin" + }, + { + "value": 8, + "name": "MailAccountSetup.iaplugin", + "path": "InternetAccounts/SetupPlugins/MailAccountSetup.iaplugin" + }, + { + "value": 16, + "name": "Messages.iaplugin", + "path": "InternetAccounts/SetupPlugins/Messages.iaplugin" + }, + { + "value": 8, + "name": "NotesAccountSetup.iaplugin", + "path": "InternetAccounts/SetupPlugins/NotesAccountSetup.iaplugin" + } + ] + }, + { + "value": 392, + "name": "TencentWeibo.iaplugin", + "path": "InternetAccounts/TencentWeibo.iaplugin", + "children": [ + { + "value": 392, + "name": "Contents", + "path": "InternetAccounts/TencentWeibo.iaplugin/Contents" + } + ] + }, + { + "value": 612, + "name": "Tudou.iaplugin", + "path": "InternetAccounts/Tudou.iaplugin", + "children": [ + { + "value": 612, + "name": "Contents", + "path": "InternetAccounts/Tudou.iaplugin/Contents" + } + ] + }, + { + "value": 608, + "name": "TwitterPlugin.iaplugin", + "path": "InternetAccounts/TwitterPlugin.iaplugin", + "children": [ + { + "value": 608, + "name": "Contents", + "path": "InternetAccounts/TwitterPlugin.iaplugin/Contents" + } + ] + }, + { + "value": 584, + "name": "Vimeo.iaplugin", + "path": "InternetAccounts/Vimeo.iaplugin", + "children": [ + { + "value": 584, + "name": "Contents", + "path": "InternetAccounts/Vimeo.iaplugin/Contents" + } + ] + }, + { + "value": 468, + "name": "Weibo.iaplugin", + "path": "InternetAccounts/Weibo.iaplugin", + "children": [ + { + "value": 468, + "name": "Contents", + "path": "InternetAccounts/Weibo.iaplugin/Contents" + } + ] + }, + { + "value": 316, + "name": "Yahoo.iaplugin", + "path": "InternetAccounts/Yahoo.iaplugin", + "children": [ + { + "value": 316, + "name": "Contents", + "path": "InternetAccounts/Yahoo.iaplugin/Contents" + } + ] + }, + { + "value": 648, + "name": "Youku.iaplugin", + "path": "InternetAccounts/Youku.iaplugin", + "children": [ + { + "value": 648, + "name": "Contents", + "path": "InternetAccounts/Youku.iaplugin/Contents" + } + ] + } + ] + }, + { + "value": 68776, + "name": "Java", + "path": "Java", + "children": [ + { + "value": 8848, + "name": "Extensions", + "path": "Java/Extensions" + }, + { + "value": 54012, + "name": "JavaVirtualMachines", + "path": "Java/JavaVirtualMachines", + "children": [ + { + "value": 54012, + "name": "1.6.0.jdk", + "path": "Java/JavaVirtualMachines/1.6.0.jdk" + } + ] + }, + { + "value": 5916, + "name": "Support", + "path": "Java/Support", + "children": [ + { + "value": 432, + "name": "Application", + "path": "ImageCapture/Support/Application" + }, + { + "value": 1608, + "name": "Icons", + "path": "ImageCapture/Support/Icons" + }, + { + "value": 172, + "name": "Image Capture Extension.app", + "path": "ImageCapture/Support/Image Capture Extension.app" + }, + { + "value": 3184, + "name": "CoreDeploy.bundle", + "path": "Java/Support/CoreDeploy.bundle" + }, + { + "value": 2732, + "name": "Deploy.bundle", + "path": "Java/Support/Deploy.bundle" + } + ] + } + ] + }, + { + "value": 48, + "name": "KerberosPlugins", + "path": "KerberosPlugins", + "children": [ + { + "value": 48, + "name": "KerberosFrameworkPlugins", + "path": "KerberosPlugins/KerberosFrameworkPlugins", + "children": [ + { + "value": 8, + "name": "heimdalodpac.bundle", + "path": "KerberosPlugins/KerberosFrameworkPlugins/heimdalodpac.bundle" + }, + { + "value": 16, + "name": "LKDCLocate.bundle", + "path": "KerberosPlugins/KerberosFrameworkPlugins/LKDCLocate.bundle" + }, + { + "value": 12, + "name": "Reachability.bundle", + "path": "KerberosPlugins/KerberosFrameworkPlugins/Reachability.bundle" + }, + { + "value": 12, + "name": "SCKerberosConfig.bundle", + "path": "KerberosPlugins/KerberosFrameworkPlugins/SCKerberosConfig.bundle" + } + ] + } + ] + }, + { + "value": 276, + "name": "KeyboardLayouts", + "path": "KeyboardLayouts", + "children": [ + { + "value": 276, + "name": "AppleKeyboardLayouts.bundle", + "path": "KeyboardLayouts/AppleKeyboardLayouts.bundle", + "children": [ + { + "value": 276, + "name": "Contents", + "path": "KeyboardLayouts/AppleKeyboardLayouts.bundle/Contents" + } + ] + } + ] + }, + { + "value": 408, + "name": "Keychains", + "path": "Keychains" + }, + { + "value": 4, + "name": "LaunchAgents", + "path": "LaunchAgents" + }, + { + "value": 20, + "name": "LaunchDaemons", + "path": "LaunchDaemons" + }, + { + "value": 96532, + "name": "LinguisticData", + "path": "LinguisticData", + "children": [ + { + "value": 8, + "name": "da", + "path": "LinguisticData/da" + }, + { + "value": 16476, + "name": "de", + "path": "LinguisticData/de" + }, + { + "value": 9788, + "name": "en", + "path": "LinguisticData/en", + "children": [ + { + "value": 36, + "name": "GB", + "path": "LinguisticData/en/GB" + }, + { + "value": 28, + "name": "US", + "path": "LinguisticData/en/US" + } + ] + }, + { + "value": 10276, + "name": "es", + "path": "LinguisticData/es" + }, + { + "value": 0, + "name": "fi", + "path": "LinguisticData/fi" + }, + { + "value": 12468, + "name": "fr", + "path": "LinguisticData/fr" + }, + { + "value": 7336, + "name": "it", + "path": "LinguisticData/it" + }, + { + "value": 192, + "name": "ko", + "path": "LinguisticData/ko" + }, + { + "value": 48, + "name": "nl", + "path": "LinguisticData/nl" + }, + { + "value": 112, + "name": "no", + "path": "LinguisticData/no" + }, + { + "value": 4496, + "name": "pt", + "path": "LinguisticData/pt" + }, + { + "value": 24, + "name": "ru", + "path": "LinguisticData/ru" + }, + { + "value": 20, + "name": "sv", + "path": "LinguisticData/sv" + }, + { + "value": 0, + "name": "tr", + "path": "LinguisticData/tr" + }, + { + "value": 35288, + "name": "zh", + "path": "LinguisticData/zh", + "children": [ + { + "value": 2604, + "name": "Hans", + "path": "LinguisticData/zh/Hans" + }, + { + "value": 2868, + "name": "Hant", + "path": "LinguisticData/zh/Hant" + } + ] + } + ] + }, + { + "value": 4, + "name": "LocationBundles", + "path": "LocationBundles" + }, + { + "value": 800, + "name": "LoginPlugins", + "path": "LoginPlugins", + "children": [ + { + "value": 348, + "name": "BezelServices.loginPlugin", + "path": "LoginPlugins/BezelServices.loginPlugin", + "children": [ + { + "value": 348, + "name": "Contents", + "path": "LoginPlugins/BezelServices.loginPlugin/Contents" + } + ] + }, + { + "value": 108, + "name": "DisplayServices.loginPlugin", + "path": "LoginPlugins/DisplayServices.loginPlugin", + "children": [ + { + "value": 108, + "name": "Contents", + "path": "LoginPlugins/DisplayServices.loginPlugin/Contents" + } + ] + }, + { + "value": 344, + "name": "FSDisconnect.loginPlugin", + "path": "LoginPlugins/FSDisconnect.loginPlugin", + "children": [ + { + "value": 344, + "name": "Contents", + "path": "LoginPlugins/FSDisconnect.loginPlugin/Contents" + } + ] + } + ] + }, + { + "value": 188, + "name": "Messages", + "path": "Messages", + "children": [ + { + "value": 188, + "name": "PlugIns", + "path": "Messages/PlugIns", + "children": [ + { + "value": 12, + "name": "Balloons.transcriptstyle", + "path": "Messages/PlugIns/Balloons.transcriptstyle" + }, + { + "value": 8, + "name": "Boxes.transcriptstyle", + "path": "Messages/PlugIns/Boxes.transcriptstyle" + }, + { + "value": 8, + "name": "Compact.transcriptstyle", + "path": "Messages/PlugIns/Compact.transcriptstyle" + }, + { + "value": 76, + "name": "FaceTime.imservice", + "path": "Messages/PlugIns/FaceTime.imservice" + }, + { + "value": 84, + "name": "iMessage.imservice", + "path": "Messages/PlugIns/iMessage.imservice" + } + ] + } + ] + }, + { + "value": 0, + "name": "Metadata", + "path": "Metadata", + "children": [ + { + "value": 0, + "name": "com.apple.finder.legacy.mdlabels", + "path": "Metadata/com.apple.finder.legacy.mdlabels", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Metadata/com.apple.finder.legacy.mdlabels/Contents" + } + ] + } + ] + }, + { + "value": 3276, + "name": "MonitorPanels", + "path": "MonitorPanels", + "children": [ + { + "value": 860, + "name": "AppleDisplay.monitorPanels", + "path": "MonitorPanels/AppleDisplay.monitorPanels", + "children": [ + { + "value": 860, + "name": "Contents", + "path": "MonitorPanels/AppleDisplay.monitorPanels/Contents" + } + ] + }, + { + "value": 36, + "name": "Arrange.monitorPanel", + "path": "MonitorPanels/Arrange.monitorPanel", + "children": [ + { + "value": 36, + "name": "Contents", + "path": "MonitorPanels/Arrange.monitorPanel/Contents" + } + ] + }, + { + "value": 2080, + "name": "Display.monitorPanel", + "path": "MonitorPanels/Display.monitorPanel", + "children": [ + { + "value": 2080, + "name": "Contents", + "path": "MonitorPanels/Display.monitorPanel/Contents" + } + ] + }, + { + "value": 300, + "name": "Profile.monitorPanel", + "path": "MonitorPanels/Profile.monitorPanel", + "children": [ + { + "value": 300, + "name": "Contents", + "path": "MonitorPanels/Profile.monitorPanel/Contents" + } + ] + } + ] + }, + { + "value": 652, + "name": "OpenDirectory", + "path": "OpenDirectory", + "children": [ + { + "value": 8, + "name": "Configurations", + "path": "OpenDirectory/Configurations" + }, + { + "value": 0, + "name": "DynamicNodeTemplates", + "path": "OpenDirectory/DynamicNodeTemplates" + }, + { + "value": 0, + "name": "ManagedClient", + "path": "OpenDirectory/ManagedClient" + }, + { + "value": 12, + "name": "Mappings", + "path": "OpenDirectory/Mappings" + }, + { + "value": 612, + "name": "Modules", + "path": "OpenDirectory/Modules", + "children": [ + { + "value": 68, + "name": "ActiveDirectory.bundle", + "path": "OpenDirectory/Modules/ActiveDirectory.bundle" + }, + { + "value": 12, + "name": "AppleID.bundle", + "path": "OpenDirectory/Modules/AppleID.bundle" + }, + { + "value": 76, + "name": "AppleODClientLDAP.bundle", + "path": "OpenDirectory/Modules/AppleODClientLDAP.bundle" + }, + { + "value": 68, + "name": "AppleODClientPWS.bundle", + "path": "OpenDirectory/Modules/AppleODClientPWS.bundle" + }, + { + "value": 12, + "name": "ConfigurationProfiles.bundle", + "path": "OpenDirectory/Modules/ConfigurationProfiles.bundle" + }, + { + "value": 20, + "name": "configure.bundle", + "path": "OpenDirectory/Modules/configure.bundle" + }, + { + "value": 8, + "name": "FDESupport.bundle", + "path": "OpenDirectory/Modules/FDESupport.bundle" + }, + { + "value": 12, + "name": "Kerberosv5.bundle", + "path": "OpenDirectory/Modules/Kerberosv5.bundle" + }, + { + "value": 8, + "name": "keychain.bundle", + "path": "OpenDirectory/Modules/keychain.bundle" + }, + { + "value": 44, + "name": "ldap.bundle", + "path": "OpenDirectory/Modules/ldap.bundle" + }, + { + "value": 12, + "name": "legacy.bundle", + "path": "OpenDirectory/Modules/legacy.bundle" + }, + { + "value": 12, + "name": "NetLogon.bundle", + "path": "OpenDirectory/Modules/NetLogon.bundle" + }, + { + "value": 24, + "name": "nis.bundle", + "path": "OpenDirectory/Modules/nis.bundle" + }, + { + "value": 68, + "name": "PlistFile.bundle", + "path": "OpenDirectory/Modules/PlistFile.bundle" + }, + { + "value": 16, + "name": "proxy.bundle", + "path": "OpenDirectory/Modules/proxy.bundle" + }, + { + "value": 20, + "name": "search.bundle", + "path": "OpenDirectory/Modules/search.bundle" + }, + { + "value": 8, + "name": "statistics.bundle", + "path": "OpenDirectory/Modules/statistics.bundle" + }, + { + "value": 124, + "name": "SystemCache.bundle", + "path": "OpenDirectory/Modules/SystemCache.bundle" + } + ] + }, + { + "value": 8, + "name": "Templates", + "path": "OpenDirectory/Templates", + "children": [ + { + "value": 0, + "name": "LDAPv3", + "path": "DirectoryServices/Templates/LDAPv3" + } + ] + } + ] + }, + { + "value": 0, + "name": "OpenSSL", + "path": "OpenSSL", + "children": [ + { + "value": 0, + "name": "certs", + "path": "OpenSSL/certs" + }, + { + "value": 0, + "name": "misc", + "path": "OpenSSL/misc" + }, + { + "value": 0, + "name": "private", + "path": "OpenSSL/private" + } + ] + }, + { + "value": 8, + "name": "PasswordServer Filters", + "path": "PasswordServer Filters" + }, + { + "value": 0, + "name": "PerformanceMetrics", + "path": "PerformanceMetrics" + }, + { + "value": 57236, + "name": "Perl", + "path": "Perl", + "children": [ + { + "value": 14848, + "name": "5.12", + "path": "Perl/5.12", + "children": [ + { + "value": 20, + "name": "App", + "path": "Perl/5.12/App" + }, + { + "value": 48, + "name": "Archive", + "path": "Perl/5.12/Archive" + }, + { + "value": 12, + "name": "Attribute", + "path": "Perl/5.12/Attribute" + }, + { + "value": 16, + "name": "autodie", + "path": "Perl/5.12/autodie" + }, + { + "value": 56, + "name": "B", + "path": "Perl/5.12/B" + }, + { + "value": 0, + "name": "Carp", + "path": "Perl/5.12/Carp" + }, + { + "value": 32, + "name": "CGI", + "path": "Perl/5.12/CGI" + }, + { + "value": 8, + "name": "Class", + "path": "Perl/5.12/Class" + }, + { + "value": 12, + "name": "Compress", + "path": "Perl/5.12/Compress" + }, + { + "value": 0, + "name": "Config", + "path": "Perl/5.12/Config" + }, + { + "value": 120, + "name": "CPAN", + "path": "Perl/5.12/CPAN" + }, + { + "value": 180, + "name": "CPANPLUS", + "path": "Perl/5.12/CPANPLUS" + }, + { + "value": 7064, + "name": "darwin-thread-multi-2level", + "path": "Perl/5.12/darwin-thread-multi-2level" + }, + { + "value": 0, + "name": "DBM_Filter", + "path": "Perl/5.12/DBM_Filter" + }, + { + "value": 0, + "name": "Devel", + "path": "Perl/5.12/Devel" + }, + { + "value": 0, + "name": "Digest", + "path": "Perl/5.12/Digest" + }, + { + "value": 12, + "name": "Encode", + "path": "Perl/5.12/Encode" + }, + { + "value": 0, + "name": "encoding", + "path": "Perl/5.12/encoding" + }, + { + "value": 0, + "name": "Exporter", + "path": "Perl/5.12/Exporter" + }, + { + "value": 224, + "name": "ExtUtils", + "path": "Perl/5.12/ExtUtils" + }, + { + "value": 104, + "name": "File", + "path": "Perl/5.12/File" + }, + { + "value": 12, + "name": "Filter", + "path": "Perl/5.12/Filter" + }, + { + "value": 28, + "name": "Getopt", + "path": "Perl/5.12/Getopt" + }, + { + "value": 24, + "name": "I18N", + "path": "Perl/5.12/I18N" + }, + { + "value": 0, + "name": "inc", + "path": "Perl/5.12/inc" + }, + { + "value": 152, + "name": "IO", + "path": "Perl/5.12/IO" + }, + { + "value": 24, + "name": "IPC", + "path": "Perl/5.12/IPC" + }, + { + "value": 60, + "name": "Locale", + "path": "Perl/5.12/Locale" + }, + { + "value": 8, + "name": "Log", + "path": "Perl/5.12/Log" + }, + { + "value": 144, + "name": "Math", + "path": "Perl/5.12/Math" + }, + { + "value": 8, + "name": "Memoize", + "path": "Perl/5.12/Memoize" + }, + { + "value": 284, + "name": "Module", + "path": "Perl/5.12/Module" + }, + { + "value": 80, + "name": "Net", + "path": "Perl/5.12/Net" + }, + { + "value": 8, + "name": "Object", + "path": "Perl/5.12/Object" + }, + { + "value": 0, + "name": "overload", + "path": "Perl/5.12/overload" + }, + { + "value": 0, + "name": "Package", + "path": "Perl/5.12/Package" + }, + { + "value": 8, + "name": "Params", + "path": "Perl/5.12/Params" + }, + { + "value": 0, + "name": "Parse", + "path": "Perl/5.12/Parse" + }, + { + "value": 0, + "name": "PerlIO", + "path": "Perl/5.12/PerlIO" + }, + { + "value": 312, + "name": "Pod", + "path": "Perl/5.12/Pod" + }, + { + "value": 2452, + "name": "pods", + "path": "Perl/5.12/pods" + }, + { + "value": 0, + "name": "Search", + "path": "Perl/5.12/Search" + }, + { + "value": 32, + "name": "TAP", + "path": "Perl/5.12/TAP" + }, + { + "value": 36, + "name": "Term", + "path": "Perl/5.12/Term" + }, + { + "value": 60, + "name": "Test", + "path": "Perl/5.12/Test" + }, + { + "value": 20, + "name": "Text", + "path": "Perl/5.12/Text" + }, + { + "value": 8, + "name": "Thread", + "path": "Perl/5.12/Thread" + }, + { + "value": 28, + "name": "Tie", + "path": "Perl/5.12/Tie" + }, + { + "value": 8, + "name": "Time", + "path": "Perl/5.12/Time" + }, + { + "value": 280, + "name": "Unicode", + "path": "Perl/5.12/Unicode" + }, + { + "value": 2348, + "name": "unicore", + "path": "Perl/5.12/unicore" + }, + { + "value": 8, + "name": "User", + "path": "Perl/5.12/User" + }, + { + "value": 12, + "name": "version", + "path": "Perl/5.12/version" + }, + { + "value": 0, + "name": "warnings", + "path": "Perl/5.12/warnings" + } + ] + }, + { + "value": 14072, + "name": "5.16", + "path": "Perl/5.16", + "children": [ + { + "value": 20, + "name": "App", + "path": "Perl/5.16/App" + }, + { + "value": 48, + "name": "Archive", + "path": "Perl/5.16/Archive" + }, + { + "value": 12, + "name": "Attribute", + "path": "Perl/5.16/Attribute" + }, + { + "value": 16, + "name": "autodie", + "path": "Perl/5.16/autodie" + }, + { + "value": 56, + "name": "B", + "path": "Perl/5.16/B" + }, + { + "value": 0, + "name": "Carp", + "path": "Perl/5.16/Carp" + }, + { + "value": 32, + "name": "CGI", + "path": "Perl/5.16/CGI" + }, + { + "value": 8, + "name": "Class", + "path": "Perl/5.16/Class" + }, + { + "value": 12, + "name": "Compress", + "path": "Perl/5.16/Compress" + }, + { + "value": 0, + "name": "Config", + "path": "Perl/5.16/Config" + }, + { + "value": 192, + "name": "CPAN", + "path": "Perl/5.16/CPAN" + }, + { + "value": 180, + "name": "CPANPLUS", + "path": "Perl/5.16/CPANPLUS" + }, + { + "value": 7328, + "name": "darwin-thread-multi-2level", + "path": "Perl/5.16/darwin-thread-multi-2level" + }, + { + "value": 0, + "name": "DBM_Filter", + "path": "Perl/5.16/DBM_Filter" + }, + { + "value": 0, + "name": "Devel", + "path": "Perl/5.16/Devel" + }, + { + "value": 0, + "name": "Digest", + "path": "Perl/5.16/Digest" + }, + { + "value": 12, + "name": "Encode", + "path": "Perl/5.16/Encode" + }, + { + "value": 0, + "name": "encoding", + "path": "Perl/5.16/encoding" + }, + { + "value": 0, + "name": "Exporter", + "path": "Perl/5.16/Exporter" + }, + { + "value": 248, + "name": "ExtUtils", + "path": "Perl/5.16/ExtUtils" + }, + { + "value": 96, + "name": "File", + "path": "Perl/5.16/File" + }, + { + "value": 12, + "name": "Filter", + "path": "Perl/5.16/Filter" + }, + { + "value": 28, + "name": "Getopt", + "path": "Perl/5.16/Getopt" + }, + { + "value": 12, + "name": "HTTP", + "path": "Perl/5.16/HTTP" + }, + { + "value": 24, + "name": "I18N", + "path": "Perl/5.16/I18N" + }, + { + "value": 0, + "name": "inc", + "path": "Perl/5.16/inc" + }, + { + "value": 168, + "name": "IO", + "path": "Perl/5.16/IO" + }, + { + "value": 28, + "name": "IPC", + "path": "Perl/5.16/IPC" + }, + { + "value": 28, + "name": "JSON", + "path": "Perl/5.16/JSON" + }, + { + "value": 372, + "name": "Locale", + "path": "Perl/5.16/Locale" + }, + { + "value": 8, + "name": "Log", + "path": "Perl/5.16/Log" + }, + { + "value": 148, + "name": "Math", + "path": "Perl/5.16/Math" + }, + { + "value": 8, + "name": "Memoize", + "path": "Perl/5.16/Memoize" + }, + { + "value": 212, + "name": "Module", + "path": "Perl/5.16/Module" + }, + { + "value": 80, + "name": "Net", + "path": "Perl/5.16/Net" + }, + { + "value": 8, + "name": "Object", + "path": "Perl/5.16/Object" + }, + { + "value": 0, + "name": "overload", + "path": "Perl/5.16/overload" + }, + { + "value": 0, + "name": "Package", + "path": "Perl/5.16/Package" + }, + { + "value": 8, + "name": "Params", + "path": "Perl/5.16/Params" + }, + { + "value": 0, + "name": "Parse", + "path": "Perl/5.16/Parse" + }, + { + "value": 0, + "name": "Perl", + "path": "Perl/5.16/Perl" + }, + { + "value": 0, + "name": "PerlIO", + "path": "Perl/5.16/PerlIO" + }, + { + "value": 324, + "name": "Pod", + "path": "Perl/5.16/Pod" + }, + { + "value": 2452, + "name": "pods", + "path": "Perl/5.16/pods" + }, + { + "value": 0, + "name": "Search", + "path": "Perl/5.16/Search" + }, + { + "value": 44, + "name": "TAP", + "path": "Perl/5.16/TAP" + }, + { + "value": 36, + "name": "Term", + "path": "Perl/5.16/Term" + }, + { + "value": 60, + "name": "Test", + "path": "Perl/5.16/Test" + }, + { + "value": 20, + "name": "Text", + "path": "Perl/5.16/Text" + }, + { + "value": 8, + "name": "Thread", + "path": "Perl/5.16/Thread" + }, + { + "value": 28, + "name": "Tie", + "path": "Perl/5.16/Tie" + }, + { + "value": 8, + "name": "Time", + "path": "Perl/5.16/Time" + }, + { + "value": 684, + "name": "Unicode", + "path": "Perl/5.16/Unicode" + }, + { + "value": 468, + "name": "unicore", + "path": "Perl/5.16/unicore" + }, + { + "value": 8, + "name": "User", + "path": "Perl/5.16/User" + }, + { + "value": 12, + "name": "version", + "path": "Perl/5.16/version" + }, + { + "value": 0, + "name": "warnings", + "path": "Perl/5.16/warnings" + } + ] + }, + { + "value": 28316, + "name": "Extras", + "path": "Perl/Extras", + "children": [ + { + "value": 14188, + "name": "5.12", + "path": "Perl/Extras/5.12" + }, + { + "value": 14128, + "name": "5.16", + "path": "Perl/Extras/5.16" + } + ] + } + ] + }, + { + "value": 226552, + "name": "PreferencePanes", + "path": "PreferencePanes", + "children": [ + { + "value": 5380, + "name": "Accounts.prefPane", + "path": "PreferencePanes/Accounts.prefPane", + "children": [ + { + "value": 5380, + "name": "Contents", + "path": "PreferencePanes/Accounts.prefPane/Contents" + } + ] + }, + { + "value": 1448, + "name": "Appearance.prefPane", + "path": "PreferencePanes/Appearance.prefPane", + "children": [ + { + "value": 1448, + "name": "Contents", + "path": "PreferencePanes/Appearance.prefPane/Contents" + } + ] + }, + { + "value": 2008, + "name": "AppStore.prefPane", + "path": "PreferencePanes/AppStore.prefPane", + "children": [ + { + "value": 2008, + "name": "Contents", + "path": "PreferencePanes/AppStore.prefPane/Contents" + } + ] + }, + { + "value": 1636, + "name": "Bluetooth.prefPane", + "path": "PreferencePanes/Bluetooth.prefPane", + "children": [ + { + "value": 1636, + "name": "Contents", + "path": "PreferencePanes/Bluetooth.prefPane/Contents" + } + ] + }, + { + "value": 2348, + "name": "DateAndTime.prefPane", + "path": "PreferencePanes/DateAndTime.prefPane", + "children": [ + { + "value": 2348, + "name": "Contents", + "path": "PreferencePanes/DateAndTime.prefPane/Contents" + } + ] + }, + { + "value": 4644, + "name": "DesktopScreenEffectsPref.prefPane", + "path": "PreferencePanes/DesktopScreenEffectsPref.prefPane", + "children": [ + { + "value": 4644, + "name": "Contents", + "path": "PreferencePanes/DesktopScreenEffectsPref.prefPane/Contents" + } + ] + }, + { + "value": 2148, + "name": "DigiHubDiscs.prefPane", + "path": "PreferencePanes/DigiHubDiscs.prefPane", + "children": [ + { + "value": 2148, + "name": "Contents", + "path": "PreferencePanes/DigiHubDiscs.prefPane/Contents" + } + ] + }, + { + "value": 624, + "name": "Displays.prefPane", + "path": "PreferencePanes/Displays.prefPane", + "children": [ + { + "value": 624, + "name": "Contents", + "path": "PreferencePanes/Displays.prefPane/Contents" + } + ] + }, + { + "value": 1012, + "name": "Dock.prefPane", + "path": "PreferencePanes/Dock.prefPane", + "children": [ + { + "value": 1012, + "name": "Contents", + "path": "PreferencePanes/Dock.prefPane/Contents" + } + ] + }, + { + "value": 2568, + "name": "EnergySaver.prefPane", + "path": "PreferencePanes/EnergySaver.prefPane", + "children": [ + { + "value": 2568, + "name": "Contents", + "path": "PreferencePanes/EnergySaver.prefPane/Contents" + } + ] + }, + { + "value": 3056, + "name": "Expose.prefPane", + "path": "PreferencePanes/Expose.prefPane", + "children": [ + { + "value": 3056, + "name": "Contents", + "path": "PreferencePanes/Expose.prefPane/Contents" + } + ] + }, + { + "value": 156, + "name": "FibreChannel.prefPane", + "path": "PreferencePanes/FibreChannel.prefPane", + "children": [ + { + "value": 156, + "name": "Contents", + "path": "PreferencePanes/FibreChannel.prefPane/Contents" + } + ] + }, + { + "value": 252, + "name": "iCloudPref.prefPane", + "path": "PreferencePanes/iCloudPref.prefPane", + "children": [ + { + "value": 252, + "name": "Contents", + "path": "PreferencePanes/iCloudPref.prefPane/Contents" + } + ] + }, + { + "value": 1588, + "name": "Ink.prefPane", + "path": "PreferencePanes/Ink.prefPane", + "children": [ + { + "value": 1588, + "name": "Contents", + "path": "PreferencePanes/Ink.prefPane/Contents" + } + ] + }, + { + "value": 4616, + "name": "InternetAccounts.prefPane", + "path": "PreferencePanes/InternetAccounts.prefPane", + "children": [ + { + "value": 4616, + "name": "Contents", + "path": "PreferencePanes/InternetAccounts.prefPane/Contents" + } + ] + }, + { + "value": 3676, + "name": "Keyboard.prefPane", + "path": "PreferencePanes/Keyboard.prefPane", + "children": [ + { + "value": 3676, + "name": "Contents", + "path": "PreferencePanes/Keyboard.prefPane/Contents" + } + ] + }, + { + "value": 3468, + "name": "Localization.prefPane", + "path": "PreferencePanes/Localization.prefPane", + "children": [ + { + "value": 3468, + "name": "Contents", + "path": "PreferencePanes/Localization.prefPane/Contents" + } + ] + }, + { + "value": 23180, + "name": "Mouse.prefPane", + "path": "PreferencePanes/Mouse.prefPane", + "children": [ + { + "value": 23180, + "name": "Contents", + "path": "PreferencePanes/Mouse.prefPane/Contents" + } + ] + }, + { + "value": 20588, + "name": "Network.prefPane", + "path": "PreferencePanes/Network.prefPane", + "children": [ + { + "value": 20588, + "name": "Contents", + "path": "PreferencePanes/Network.prefPane/Contents" + } + ] + }, + { + "value": 1512, + "name": "Notifications.prefPane", + "path": "PreferencePanes/Notifications.prefPane", + "children": [ + { + "value": 1512, + "name": "Contents", + "path": "PreferencePanes/Notifications.prefPane/Contents" + } + ] + }, + { + "value": 7648, + "name": "ParentalControls.prefPane", + "path": "PreferencePanes/ParentalControls.prefPane", + "children": [ + { + "value": 7648, + "name": "Contents", + "path": "PreferencePanes/ParentalControls.prefPane/Contents" + } + ] + }, + { + "value": 4060, + "name": "PrintAndScan.prefPane", + "path": "PreferencePanes/PrintAndScan.prefPane", + "children": [ + { + "value": 4060, + "name": "Contents", + "path": "PreferencePanes/PrintAndScan.prefPane/Contents" + } + ] + }, + { + "value": 1904, + "name": "Profiles.prefPane", + "path": "PreferencePanes/Profiles.prefPane", + "children": [ + { + "value": 1904, + "name": "Contents", + "path": "PreferencePanes/Profiles.prefPane/Contents" + } + ] + }, + { + "value": 6280, + "name": "Security.prefPane", + "path": "PreferencePanes/Security.prefPane", + "children": [ + { + "value": 6280, + "name": "Contents", + "path": "PreferencePanes/Security.prefPane/Contents" + } + ] + }, + { + "value": 9608, + "name": "SharingPref.prefPane", + "path": "PreferencePanes/SharingPref.prefPane", + "children": [ + { + "value": 9608, + "name": "Contents", + "path": "PreferencePanes/SharingPref.prefPane/Contents" + } + ] + }, + { + "value": 2204, + "name": "Sound.prefPane", + "path": "PreferencePanes/Sound.prefPane", + "children": [ + { + "value": 2204, + "name": "Contents", + "path": "PreferencePanes/Sound.prefPane/Contents" + } + ] + }, + { + "value": 1072, + "name": "Speech.prefPane", + "path": "PreferencePanes/Speech.prefPane", + "children": [ + { + "value": 1072, + "name": "Contents", + "path": "PreferencePanes/Speech.prefPane/Contents" + } + ] + }, + { + "value": 1112, + "name": "Spotlight.prefPane", + "path": "PreferencePanes/Spotlight.prefPane", + "children": [ + { + "value": 1112, + "name": "Contents", + "path": "PreferencePanes/Spotlight.prefPane/Contents" + } + ] + }, + { + "value": 2040, + "name": "StartupDisk.prefPane", + "path": "PreferencePanes/StartupDisk.prefPane", + "children": [ + { + "value": 2040, + "name": "Contents", + "path": "PreferencePanes/StartupDisk.prefPane/Contents" + } + ] + }, + { + "value": 3080, + "name": "TimeMachine.prefPane", + "path": "PreferencePanes/TimeMachine.prefPane", + "children": [ + { + "value": 3080, + "name": "Contents", + "path": "PreferencePanes/TimeMachine.prefPane/Contents" + } + ] + }, + { + "value": 93312, + "name": "Trackpad.prefPane", + "path": "PreferencePanes/Trackpad.prefPane", + "children": [ + { + "value": 93312, + "name": "Contents", + "path": "PreferencePanes/Trackpad.prefPane/Contents" + } + ] + }, + { + "value": 7680, + "name": "UniversalAccessPref.prefPane", + "path": "PreferencePanes/UniversalAccessPref.prefPane", + "children": [ + { + "value": 7680, + "name": "Contents", + "path": "PreferencePanes/UniversalAccessPref.prefPane/Contents" + } + ] + }, + { + "value": 640, + "name": "Xsan.prefPane", + "path": "PreferencePanes/Xsan.prefPane", + "children": [ + { + "value": 640, + "name": "Contents", + "path": "PreferencePanes/Xsan.prefPane/Contents" + } + ] + } + ] + }, + { + "value": 224, + "name": "Printers", + "path": "Printers", + "children": [ + { + "value": 224, + "name": "Libraries", + "path": "Printers/Libraries", + "children": [ + { + "value": 24, + "name": "USBGenericPrintingClass.plugin", + "path": "Printers/Libraries/USBGenericPrintingClass.plugin" + }, + { + "value": 24, + "name": "USBGenericTOPrintingClass.plugin", + "path": "Printers/Libraries/USBGenericTOPrintingClass.plugin" + } + ] + } + ] + }, + { + "value": 586092, + "name": "PrivateFrameworks", + "path": "PrivateFrameworks", + "children": [ + { + "value": 52, + "name": "AccessibilityBundles.framework", + "path": "PrivateFrameworks/AccessibilityBundles.framework", + "children": [ + { + "value": 44, + "name": "Versions", + "path": "PrivateFrameworks/AccessibilityBundles.framework/Versions" + } + ] + }, + { + "value": 348, + "name": "AccountsDaemon.framework", + "path": "PrivateFrameworks/AccountsDaemon.framework", + "children": [ + { + "value": 332, + "name": "Versions", + "path": "PrivateFrameworks/AccountsDaemon.framework/Versions" + }, + { + "value": 8, + "name": "XPCServices", + "path": "PrivateFrameworks/AccountsDaemon.framework/XPCServices" + } + ] + }, + { + "value": 168, + "name": "Admin.framework", + "path": "PrivateFrameworks/Admin.framework", + "children": [ + { + "value": 160, + "name": "Versions", + "path": "PrivateFrameworks/Admin.framework/Versions" + } + ] + }, + { + "value": 408, + "name": "AirPortDevices.framework", + "path": "PrivateFrameworks/AirPortDevices.framework", + "children": [ + { + "value": 408, + "name": "Versions", + "path": "PrivateFrameworks/AirPortDevices.framework/Versions" + } + ] + }, + { + "value": 1324, + "name": "AirTrafficHost.framework", + "path": "PrivateFrameworks/AirTrafficHost.framework", + "children": [ + { + "value": 1276, + "name": "Versions", + "path": "PrivateFrameworks/AirTrafficHost.framework/Versions" + } + ] + }, + { + "value": 2408, + "name": "Altitude.framework", + "path": "PrivateFrameworks/Altitude.framework", + "children": [ + { + "value": 2400, + "name": "Versions", + "path": "PrivateFrameworks/Altitude.framework/Versions" + } + ] + }, + { + "value": 224, + "name": "AOSAccounts.framework", + "path": "PrivateFrameworks/AOSAccounts.framework", + "children": [ + { + "value": 216, + "name": "Versions", + "path": "PrivateFrameworks/AOSAccounts.framework/Versions" + } + ] + }, + { + "value": 4672, + "name": "AOSKit.framework", + "path": "PrivateFrameworks/AOSKit.framework", + "children": [ + { + "value": 4656, + "name": "Versions", + "path": "PrivateFrameworks/AOSKit.framework/Versions" + } + ] + }, + { + "value": 20, + "name": "AOSMigrate.framework", + "path": "PrivateFrameworks/AOSMigrate.framework", + "children": [ + { + "value": 12, + "name": "Versions", + "path": "PrivateFrameworks/AOSMigrate.framework/Versions" + } + ] + }, + { + "value": 1300, + "name": "AOSNotification.framework", + "path": "PrivateFrameworks/AOSNotification.framework", + "children": [ + { + "value": 52, + "name": "Versions", + "path": "PrivateFrameworks/AOSNotification.framework/Versions" + } + ] + }, + { + "value": 16500, + "name": "AOSUI.framework", + "path": "PrivateFrameworks/AOSUI.framework", + "children": [ + { + "value": 16492, + "name": "Versions", + "path": "PrivateFrameworks/AOSUI.framework/Versions" + } + ] + }, + { + "value": 124, + "name": "AppContainer.framework", + "path": "PrivateFrameworks/AppContainer.framework", + "children": [ + { + "value": 116, + "name": "Versions", + "path": "PrivateFrameworks/AppContainer.framework/Versions" + } + ] + }, + { + "value": 324, + "name": "Apple80211.framework", + "path": "PrivateFrameworks/Apple80211.framework", + "children": [ + { + "value": 316, + "name": "Versions", + "path": "PrivateFrameworks/Apple80211.framework/Versions" + } + ] + }, + { + "value": 20, + "name": "AppleAppSupport.framework", + "path": "PrivateFrameworks/AppleAppSupport.framework", + "children": [ + { + "value": 12, + "name": "Versions", + "path": "PrivateFrameworks/AppleAppSupport.framework/Versions" + } + ] + }, + { + "value": 88, + "name": "AppleFSCompression.framework", + "path": "PrivateFrameworks/AppleFSCompression.framework", + "children": [ + { + "value": 80, + "name": "Versions", + "path": "PrivateFrameworks/AppleFSCompression.framework/Versions" + } + ] + }, + { + "value": 712, + "name": "AppleGVA.framework", + "path": "PrivateFrameworks/AppleGVA.framework", + "children": [ + { + "value": 704, + "name": "Versions", + "path": "PrivateFrameworks/AppleGVA.framework/Versions" + } + ] + }, + { + "value": 88, + "name": "AppleGVACore.framework", + "path": "PrivateFrameworks/AppleGVACore.framework", + "children": [ + { + "value": 80, + "name": "Versions", + "path": "PrivateFrameworks/AppleGVACore.framework/Versions" + } + ] + }, + { + "value": 52, + "name": "AppleLDAP.framework", + "path": "PrivateFrameworks/AppleLDAP.framework", + "children": [ + { + "value": 44, + "name": "Versions", + "path": "PrivateFrameworks/AppleLDAP.framework/Versions" + } + ] + }, + { + "value": 588, + "name": "AppleProfileFamily.framework", + "path": "PrivateFrameworks/AppleProfileFamily.framework", + "children": [ + { + "value": 580, + "name": "Versions", + "path": "PrivateFrameworks/AppleProfileFamily.framework/Versions" + } + ] + }, + { + "value": 508, + "name": "ApplePushService.framework", + "path": "PrivateFrameworks/ApplePushService.framework", + "children": [ + { + "value": 128, + "name": "Versions", + "path": "PrivateFrameworks/ApplePushService.framework/Versions" + } + ] + }, + { + "value": 672, + "name": "AppleScript.framework", + "path": "PrivateFrameworks/AppleScript.framework", + "children": [ + { + "value": 664, + "name": "Versions", + "path": "PrivateFrameworks/AppleScript.framework/Versions" + } + ] + }, + { + "value": 68, + "name": "AppleSRP.framework", + "path": "PrivateFrameworks/AppleSRP.framework", + "children": [ + { + "value": 60, + "name": "Versions", + "path": "PrivateFrameworks/AppleSRP.framework/Versions" + } + ] + }, + { + "value": 44, + "name": "AppleSystemInfo.framework", + "path": "PrivateFrameworks/AppleSystemInfo.framework", + "children": [ + { + "value": 36, + "name": "Versions", + "path": "PrivateFrameworks/AppleSystemInfo.framework/Versions" + } + ] + }, + { + "value": 336, + "name": "AppleVA.framework", + "path": "PrivateFrameworks/AppleVA.framework", + "children": [ + { + "value": 328, + "name": "Versions", + "path": "PrivateFrameworks/AppleVA.framework/Versions" + } + ] + }, + { + "value": 72, + "name": "AppSandbox.framework", + "path": "PrivateFrameworks/AppSandbox.framework", + "children": [ + { + "value": 64, + "name": "Versions", + "path": "PrivateFrameworks/AppSandbox.framework/Versions" + } + ] + }, + { + "value": 380, + "name": "Assistant.framework", + "path": "PrivateFrameworks/Assistant.framework", + "children": [ + { + "value": 372, + "name": "Versions", + "path": "PrivateFrameworks/Assistant.framework/Versions" + } + ] + }, + { + "value": 1772, + "name": "AssistantServices.framework", + "path": "PrivateFrameworks/AssistantServices.framework", + "children": [ + { + "value": 116, + "name": "Versions", + "path": "PrivateFrameworks/AssistantServices.framework/Versions" + } + ] + }, + { + "value": 684, + "name": "AssistiveControlSupport.framework", + "path": "PrivateFrameworks/AssistiveControlSupport.framework", + "children": [ + { + "value": 224, + "name": "Frameworks", + "path": "PrivateFrameworks/AssistiveControlSupport.framework/Frameworks" + }, + { + "value": 452, + "name": "Versions", + "path": "PrivateFrameworks/AssistiveControlSupport.framework/Versions" + } + ] + }, + { + "value": 1880, + "name": "AVConference.framework", + "path": "PrivateFrameworks/AVConference.framework", + "children": [ + { + "value": 388, + "name": "Frameworks", + "path": "PrivateFrameworks/AVConference.framework/Frameworks" + }, + { + "value": 1484, + "name": "Versions", + "path": "PrivateFrameworks/AVConference.framework/Versions" + } + ] + }, + { + "value": 168, + "name": "AVCore.framework", + "path": "PrivateFrameworks/AVCore.framework", + "children": [ + { + "value": 160, + "name": "Versions", + "path": "PrivateFrameworks/AVCore.framework/Versions" + } + ] + }, + { + "value": 296, + "name": "AVFoundationCF.framework", + "path": "PrivateFrameworks/AVFoundationCF.framework", + "children": [ + { + "value": 288, + "name": "Versions", + "path": "PrivateFrameworks/AVFoundationCF.framework/Versions" + } + ] + }, + { + "value": 3728, + "name": "Backup.framework", + "path": "PrivateFrameworks/Backup.framework", + "children": [ + { + "value": 3720, + "name": "Versions", + "path": "PrivateFrameworks/Backup.framework/Versions" + } + ] + }, + { + "value": 52, + "name": "BezelServices.framework", + "path": "PrivateFrameworks/BezelServices.framework", + "children": [ + { + "value": 44, + "name": "Versions", + "path": "PrivateFrameworks/BezelServices.framework/Versions" + } + ] + }, + { + "value": 316, + "name": "Bom.framework", + "path": "PrivateFrameworks/Bom.framework", + "children": [ + { + "value": 308, + "name": "Versions", + "path": "PrivateFrameworks/Bom.framework/Versions" + } + ] + }, + { + "value": 88, + "name": "BookKit.framework", + "path": "PrivateFrameworks/BookKit.framework", + "children": [ + { + "value": 76, + "name": "Versions", + "path": "PrivateFrameworks/BookKit.framework/Versions" + } + ] + }, + { + "value": 124, + "name": "BookmarkDAV.framework", + "path": "PrivateFrameworks/BookmarkDAV.framework", + "children": [ + { + "value": 108, + "name": "Versions", + "path": "PrivateFrameworks/BookmarkDAV.framework/Versions" + } + ] + }, + { + "value": 1732, + "name": "BrowserKit.framework", + "path": "PrivateFrameworks/BrowserKit.framework", + "children": [ + { + "value": 1724, + "name": "Versions", + "path": "PrivateFrameworks/BrowserKit.framework/Versions" + } + ] + }, + { + "value": 52, + "name": "ByteRangeLocking.framework", + "path": "PrivateFrameworks/ByteRangeLocking.framework", + "children": [ + { + "value": 44, + "name": "Versions", + "path": "PrivateFrameworks/ByteRangeLocking.framework/Versions" + } + ] + }, + { + "value": 64, + "name": "Calculate.framework", + "path": "PrivateFrameworks/Calculate.framework", + "children": [ + { + "value": 56, + "name": "Versions", + "path": "PrivateFrameworks/Calculate.framework/Versions" + } + ] + }, + { + "value": 356, + "name": "CalDAV.framework", + "path": "PrivateFrameworks/CalDAV.framework", + "children": [ + { + "value": 348, + "name": "Versions", + "path": "PrivateFrameworks/CalDAV.framework/Versions" + } + ] + }, + { + "value": 104, + "name": "CalendarAgent.framework", + "path": "PrivateFrameworks/CalendarAgent.framework", + "children": [ + { + "value": 8, + "name": "Executables", + "path": "PrivateFrameworks/CalendarAgent.framework/Executables" + }, + { + "value": 88, + "name": "Versions", + "path": "PrivateFrameworks/CalendarAgent.framework/Versions" + } + ] + }, + { + "value": 88, + "name": "CalendarAgentLink.framework", + "path": "PrivateFrameworks/CalendarAgentLink.framework", + "children": [ + { + "value": 80, + "name": "Versions", + "path": "PrivateFrameworks/CalendarAgentLink.framework/Versions" + } + ] + }, + { + "value": 220, + "name": "CalendarDraw.framework", + "path": "PrivateFrameworks/CalendarDraw.framework", + "children": [ + { + "value": 212, + "name": "Versions", + "path": "PrivateFrameworks/CalendarDraw.framework/Versions" + } + ] + }, + { + "value": 196, + "name": "CalendarFoundation.framework", + "path": "PrivateFrameworks/CalendarFoundation.framework", + "children": [ + { + "value": 188, + "name": "Versions", + "path": "PrivateFrameworks/CalendarFoundation.framework/Versions" + } + ] + }, + { + "value": 4872, + "name": "CalendarPersistence.framework", + "path": "PrivateFrameworks/CalendarPersistence.framework", + "children": [ + { + "value": 4864, + "name": "Versions", + "path": "PrivateFrameworks/CalendarPersistence.framework/Versions" + } + ] + }, + { + "value": 900, + "name": "CalendarUI.framework", + "path": "PrivateFrameworks/CalendarUI.framework", + "children": [ + { + "value": 892, + "name": "Versions", + "path": "PrivateFrameworks/CalendarUI.framework/Versions" + } + ] + }, + { + "value": 76, + "name": "CaptiveNetwork.framework", + "path": "PrivateFrameworks/CaptiveNetwork.framework", + "children": [ + { + "value": 68, + "name": "Versions", + "path": "PrivateFrameworks/CaptiveNetwork.framework/Versions" + } + ] + }, + { + "value": 1180, + "name": "CharacterPicker.framework", + "path": "PrivateFrameworks/CharacterPicker.framework", + "children": [ + { + "value": 1168, + "name": "Versions", + "path": "PrivateFrameworks/CharacterPicker.framework/Versions" + } + ] + }, + { + "value": 192, + "name": "ChunkingLibrary.framework", + "path": "PrivateFrameworks/ChunkingLibrary.framework", + "children": [ + { + "value": 184, + "name": "Versions", + "path": "PrivateFrameworks/ChunkingLibrary.framework/Versions" + } + ] + }, + { + "value": 48, + "name": "ClockMenuExtraPreferences.framework", + "path": "PrivateFrameworks/ClockMenuExtraPreferences.framework", + "children": [ + { + "value": 40, + "name": "Versions", + "path": "PrivateFrameworks/ClockMenuExtraPreferences.framework/Versions" + } + ] + }, + { + "value": 160, + "name": "CloudServices.framework", + "path": "PrivateFrameworks/CloudServices.framework", + "children": [ + { + "value": 104, + "name": "Versions", + "path": "PrivateFrameworks/CloudServices.framework/Versions" + }, + { + "value": 48, + "name": "XPCServices", + "path": "PrivateFrameworks/CloudServices.framework/XPCServices" + } + ] + }, + { + "value": 10768, + "name": "CommerceKit.framework", + "path": "PrivateFrameworks/CommerceKit.framework", + "children": [ + { + "value": 10752, + "name": "Versions", + "path": "PrivateFrameworks/CommerceKit.framework/Versions" + } + ] + }, + { + "value": 68, + "name": "CommonAuth.framework", + "path": "PrivateFrameworks/CommonAuth.framework", + "children": [ + { + "value": 60, + "name": "Versions", + "path": "PrivateFrameworks/CommonAuth.framework/Versions" + } + ] + }, + { + "value": 120, + "name": "CommonCandidateWindow.framework", + "path": "PrivateFrameworks/CommonCandidateWindow.framework", + "children": [ + { + "value": 112, + "name": "Versions", + "path": "PrivateFrameworks/CommonCandidateWindow.framework/Versions" + } + ] + }, + { + "value": 72, + "name": "CommunicationsFilter.framework", + "path": "PrivateFrameworks/CommunicationsFilter.framework", + "children": [ + { + "value": 28, + "name": "CMFSyncAgent.app", + "path": "PrivateFrameworks/CommunicationsFilter.framework/CMFSyncAgent.app" + }, + { + "value": 36, + "name": "Versions", + "path": "PrivateFrameworks/CommunicationsFilter.framework/Versions" + } + ] + }, + { + "value": 24, + "name": "ConfigProfileHelper.framework", + "path": "PrivateFrameworks/ConfigProfileHelper.framework", + "children": [ + { + "value": 16, + "name": "Versions", + "path": "PrivateFrameworks/ConfigProfileHelper.framework/Versions" + } + ] + }, + { + "value": 156, + "name": "ConfigurationProfiles.framework", + "path": "PrivateFrameworks/ConfigurationProfiles.framework", + "children": [ + { + "value": 148, + "name": "Versions", + "path": "PrivateFrameworks/ConfigurationProfiles.framework/Versions" + } + ] + }, + { + "value": 20, + "name": "ContactsAssistantServices.framework", + "path": "PrivateFrameworks/ContactsAssistantServices.framework", + "children": [ + { + "value": 12, + "name": "Versions", + "path": "PrivateFrameworks/ContactsAssistantServices.framework/Versions" + } + ] + }, + { + "value": 72, + "name": "ContactsAutocomplete.framework", + "path": "PrivateFrameworks/ContactsAutocomplete.framework", + "children": [ + { + "value": 64, + "name": "Versions", + "path": "PrivateFrameworks/ContactsAutocomplete.framework/Versions" + } + ] + }, + { + "value": 24, + "name": "ContactsData.framework", + "path": "PrivateFrameworks/ContactsData.framework", + "children": [ + { + "value": 16, + "name": "Versions", + "path": "PrivateFrameworks/ContactsData.framework/Versions" + } + ] + }, + { + "value": 60, + "name": "ContactsFoundation.framework", + "path": "PrivateFrameworks/ContactsFoundation.framework", + "children": [ + { + "value": 52, + "name": "Versions", + "path": "PrivateFrameworks/ContactsFoundation.framework/Versions" + } + ] + }, + { + "value": 100, + "name": "ContactsUI.framework", + "path": "PrivateFrameworks/ContactsUI.framework", + "children": [ + { + "value": 92, + "name": "Versions", + "path": "PrivateFrameworks/ContactsUI.framework/Versions" + } + ] + }, + { + "value": 1668, + "name": "CoreADI.framework", + "path": "PrivateFrameworks/CoreADI.framework", + "children": [ + { + "value": 1660, + "name": "Versions", + "path": "PrivateFrameworks/CoreADI.framework/Versions" + } + ] + }, + { + "value": 4092, + "name": "CoreAUC.framework", + "path": "PrivateFrameworks/CoreAUC.framework", + "children": [ + { + "value": 4084, + "name": "Versions", + "path": "PrivateFrameworks/CoreAUC.framework/Versions" + } + ] + }, + { + "value": 200, + "name": "CoreAVCHD.framework", + "path": "PrivateFrameworks/CoreAVCHD.framework", + "children": [ + { + "value": 192, + "name": "Versions", + "path": "PrivateFrameworks/CoreAVCHD.framework/Versions" + } + ] + }, + { + "value": 2624, + "name": "CoreChineseEngine.framework", + "path": "PrivateFrameworks/CoreChineseEngine.framework", + "children": [ + { + "value": 2616, + "name": "Versions", + "path": "PrivateFrameworks/CoreChineseEngine.framework/Versions" + } + ] + }, + { + "value": 240, + "name": "CoreDaemon.framework", + "path": "PrivateFrameworks/CoreDaemon.framework", + "children": [ + { + "value": 232, + "name": "Versions", + "path": "PrivateFrameworks/CoreDaemon.framework/Versions" + } + ] + }, + { + "value": 488, + "name": "CoreDAV.framework", + "path": "PrivateFrameworks/CoreDAV.framework", + "children": [ + { + "value": 480, + "name": "Versions", + "path": "PrivateFrameworks/CoreDAV.framework/Versions" + } + ] + }, + { + "value": 19280, + "name": "CoreFP.framework", + "path": "PrivateFrameworks/CoreFP.framework", + "children": [ + { + "value": 19268, + "name": "Versions", + "path": "PrivateFrameworks/CoreFP.framework/Versions" + } + ] + }, + { + "value": 16124, + "name": "CoreHandwriting.framework", + "path": "PrivateFrameworks/CoreHandwriting.framework", + "children": [ + { + "value": 16116, + "name": "Versions", + "path": "PrivateFrameworks/CoreHandwriting.framework/Versions" + } + ] + }, + { + "value": 2124, + "name": "CoreKE.framework", + "path": "PrivateFrameworks/CoreKE.framework", + "children": [ + { + "value": 2116, + "name": "Versions", + "path": "PrivateFrameworks/CoreKE.framework/Versions" + } + ] + }, + { + "value": 7856, + "name": "CoreLSKD.framework", + "path": "PrivateFrameworks/CoreLSKD.framework", + "children": [ + { + "value": 7848, + "name": "Versions", + "path": "PrivateFrameworks/CoreLSKD.framework/Versions" + } + ] + }, + { + "value": 824, + "name": "CoreMediaAuthoring.framework", + "path": "PrivateFrameworks/CoreMediaAuthoring.framework", + "children": [ + { + "value": 816, + "name": "Versions", + "path": "PrivateFrameworks/CoreMediaAuthoring.framework/Versions" + } + ] + }, + { + "value": 784, + "name": "CoreMediaIOServicesPrivate.framework", + "path": "PrivateFrameworks/CoreMediaIOServicesPrivate.framework", + "children": [ + { + "value": 776, + "name": "Versions", + "path": "PrivateFrameworks/CoreMediaIOServicesPrivate.framework/Versions" + } + ] + }, + { + "value": 116, + "name": "CoreMediaPrivate.framework", + "path": "PrivateFrameworks/CoreMediaPrivate.framework", + "children": [ + { + "value": 108, + "name": "Versions", + "path": "PrivateFrameworks/CoreMediaPrivate.framework/Versions" + } + ] + }, + { + "value": 292, + "name": "CoreMediaStream.framework", + "path": "PrivateFrameworks/CoreMediaStream.framework", + "children": [ + { + "value": 284, + "name": "Versions", + "path": "PrivateFrameworks/CoreMediaStream.framework/Versions" + } + ] + }, + { + "value": 1436, + "name": "CorePDF.framework", + "path": "PrivateFrameworks/CorePDF.framework", + "children": [ + { + "value": 1428, + "name": "Versions", + "path": "PrivateFrameworks/CorePDF.framework/Versions" + } + ] + }, + { + "value": 1324, + "name": "CoreProfile.framework", + "path": "PrivateFrameworks/CoreProfile.framework", + "children": [ + { + "value": 1312, + "name": "Versions", + "path": "PrivateFrameworks/CoreProfile.framework/Versions" + } + ] + }, + { + "value": 1384, + "name": "CoreRAID.framework", + "path": "PrivateFrameworks/CoreRAID.framework", + "children": [ + { + "value": 1372, + "name": "Versions", + "path": "PrivateFrameworks/CoreRAID.framework/Versions" + } + ] + }, + { + "value": 128, + "name": "CoreRecents.framework", + "path": "PrivateFrameworks/CoreRecents.framework", + "children": [ + { + "value": 120, + "name": "Versions", + "path": "PrivateFrameworks/CoreRecents.framework/Versions" + } + ] + }, + { + "value": 832, + "name": "CoreRecognition.framework", + "path": "PrivateFrameworks/CoreRecognition.framework", + "children": [ + { + "value": 824, + "name": "Versions", + "path": "PrivateFrameworks/CoreRecognition.framework/Versions" + } + ] + }, + { + "value": 104, + "name": "CoreSDB.framework", + "path": "PrivateFrameworks/CoreSDB.framework", + "children": [ + { + "value": 96, + "name": "Versions", + "path": "PrivateFrameworks/CoreSDB.framework/Versions" + } + ] + }, + { + "value": 280, + "name": "CoreServicesInternal.framework", + "path": "PrivateFrameworks/CoreServicesInternal.framework", + "children": [ + { + "value": 272, + "name": "Versions", + "path": "PrivateFrameworks/CoreServicesInternal.framework/Versions" + } + ] + }, + { + "value": 576, + "name": "CoreSymbolication.framework", + "path": "PrivateFrameworks/CoreSymbolication.framework", + "children": [ + { + "value": 536, + "name": "Versions", + "path": "PrivateFrameworks/CoreSymbolication.framework/Versions" + } + ] + }, + { + "value": 476, + "name": "CoreThemeDefinition.framework", + "path": "PrivateFrameworks/CoreThemeDefinition.framework", + "children": [ + { + "value": 468, + "name": "Versions", + "path": "PrivateFrameworks/CoreThemeDefinition.framework/Versions" + } + ] + }, + { + "value": 4976, + "name": "CoreUI.framework", + "path": "PrivateFrameworks/CoreUI.framework", + "children": [ + { + "value": 4968, + "name": "Versions", + "path": "PrivateFrameworks/CoreUI.framework/Versions" + } + ] + }, + { + "value": 576, + "name": "CoreUtils.framework", + "path": "PrivateFrameworks/CoreUtils.framework", + "children": [ + { + "value": 568, + "name": "Versions", + "path": "PrivateFrameworks/CoreUtils.framework/Versions" + } + ] + }, + { + "value": 3476, + "name": "CoreWLANKit.framework", + "path": "PrivateFrameworks/CoreWLANKit.framework", + "children": [ + { + "value": 3468, + "name": "Versions", + "path": "PrivateFrameworks/CoreWLANKit.framework/Versions" + } + ] + }, + { + "value": 92, + "name": "CrashReporterSupport.framework", + "path": "PrivateFrameworks/CrashReporterSupport.framework", + "children": [ + { + "value": 84, + "name": "Versions", + "path": "PrivateFrameworks/CrashReporterSupport.framework/Versions" + } + ] + }, + { + "value": 132, + "name": "DashboardClient.framework", + "path": "PrivateFrameworks/DashboardClient.framework", + "children": [ + { + "value": 124, + "name": "Versions", + "path": "PrivateFrameworks/DashboardClient.framework/Versions" + } + ] + }, + { + "value": 1716, + "name": "DataDetectors.framework", + "path": "PrivateFrameworks/DataDetectors.framework", + "children": [ + { + "value": 1708, + "name": "Versions", + "path": "PrivateFrameworks/DataDetectors.framework/Versions" + } + ] + }, + { + "value": 4952, + "name": "DataDetectorsCore.framework", + "path": "PrivateFrameworks/DataDetectorsCore.framework", + "children": [ + { + "value": 4940, + "name": "Versions", + "path": "PrivateFrameworks/DataDetectorsCore.framework/Versions" + } + ] + }, + { + "value": 500, + "name": "DCERPC.framework", + "path": "PrivateFrameworks/DCERPC.framework", + "children": [ + { + "value": 492, + "name": "Versions", + "path": "PrivateFrameworks/DCERPC.framework/Versions" + } + ] + }, + { + "value": 232, + "name": "DebugSymbols.framework", + "path": "PrivateFrameworks/DebugSymbols.framework", + "children": [ + { + "value": 224, + "name": "Versions", + "path": "PrivateFrameworks/DebugSymbols.framework/Versions" + } + ] + }, + { + "value": 1792, + "name": "DesktopServicesPriv.framework", + "path": "PrivateFrameworks/DesktopServicesPriv.framework", + "children": [ + { + "value": 1780, + "name": "Versions", + "path": "PrivateFrameworks/DesktopServicesPriv.framework/Versions" + } + ] + }, + { + "value": 128, + "name": "DeviceLink.framework", + "path": "PrivateFrameworks/DeviceLink.framework", + "children": [ + { + "value": 120, + "name": "Versions", + "path": "PrivateFrameworks/DeviceLink.framework/Versions" + } + ] + }, + { + "value": 464, + "name": "DeviceToDeviceKit.framework", + "path": "PrivateFrameworks/DeviceToDeviceKit.framework", + "children": [ + { + "value": 456, + "name": "Versions", + "path": "PrivateFrameworks/DeviceToDeviceKit.framework/Versions" + } + ] + }, + { + "value": 52, + "name": "DeviceToDeviceManager.framework", + "path": "PrivateFrameworks/DeviceToDeviceManager.framework", + "children": [ + { + "value": 28, + "name": "PlugIns", + "path": "PrivateFrameworks/DeviceToDeviceManager.framework/PlugIns" + }, + { + "value": 16, + "name": "Versions", + "path": "PrivateFrameworks/DeviceToDeviceManager.framework/Versions" + } + ] + }, + { + "value": 28, + "name": "DiagnosticLogCollection.framework", + "path": "PrivateFrameworks/DiagnosticLogCollection.framework", + "children": [ + { + "value": 20, + "name": "Versions", + "path": "PrivateFrameworks/DiagnosticLogCollection.framework/Versions" + } + ] + }, + { + "value": 56, + "name": "DigiHubPreference.framework", + "path": "PrivateFrameworks/DigiHubPreference.framework", + "children": [ + { + "value": 48, + "name": "Versions", + "path": "PrivateFrameworks/DigiHubPreference.framework/Versions" + } + ] + }, + { + "value": 1344, + "name": "DirectoryEditor.framework", + "path": "PrivateFrameworks/DirectoryEditor.framework", + "children": [ + { + "value": 1336, + "name": "Versions", + "path": "PrivateFrameworks/DirectoryEditor.framework/Versions" + } + ] + }, + { + "value": 104, + "name": "DirectoryServer.framework", + "path": "PrivateFrameworks/DirectoryServer.framework", + "children": [ + { + "value": 52, + "name": "Frameworks", + "path": "PrivateFrameworks/DirectoryServer.framework/Frameworks" + }, + { + "value": 40, + "name": "Versions", + "path": "PrivateFrameworks/DirectoryServer.framework/Versions" + } + ] + }, + { + "value": 1596, + "name": "DiskImages.framework", + "path": "PrivateFrameworks/DiskImages.framework", + "children": [ + { + "value": 1588, + "name": "Versions", + "path": "PrivateFrameworks/DiskImages.framework/Versions" + } + ] + }, + { + "value": 1168, + "name": "DiskManagement.framework", + "path": "PrivateFrameworks/DiskManagement.framework", + "children": [ + { + "value": 1160, + "name": "Versions", + "path": "PrivateFrameworks/DiskManagement.framework/Versions" + } + ] + }, + { + "value": 80, + "name": "DisplayServices.framework", + "path": "PrivateFrameworks/DisplayServices.framework", + "children": [ + { + "value": 72, + "name": "Versions", + "path": "PrivateFrameworks/DisplayServices.framework/Versions" + } + ] + }, + { + "value": 32, + "name": "DMNotification.framework", + "path": "PrivateFrameworks/DMNotification.framework", + "children": [ + { + "value": 24, + "name": "Versions", + "path": "PrivateFrameworks/DMNotification.framework/Versions" + } + ] + }, + { + "value": 24, + "name": "DVD.framework", + "path": "PrivateFrameworks/DVD.framework", + "children": [ + { + "value": 16, + "name": "Versions", + "path": "PrivateFrameworks/DVD.framework/Versions" + } + ] + }, + { + "value": 272, + "name": "EAP8021X.framework", + "path": "PrivateFrameworks/EAP8021X.framework", + "children": [ + { + "value": 20, + "name": "Support", + "path": "PrivateFrameworks/EAP8021X.framework/Support" + }, + { + "value": 244, + "name": "Versions", + "path": "PrivateFrameworks/EAP8021X.framework/Versions" + } + ] + }, + { + "value": 56, + "name": "EasyConfig.framework", + "path": "PrivateFrameworks/EasyConfig.framework", + "children": [ + { + "value": 48, + "name": "Versions", + "path": "PrivateFrameworks/EasyConfig.framework/Versions" + } + ] + }, + { + "value": 872, + "name": "EFILogin.framework", + "path": "PrivateFrameworks/EFILogin.framework", + "children": [ + { + "value": 864, + "name": "Versions", + "path": "PrivateFrameworks/EFILogin.framework/Versions" + } + ] + }, + { + "value": 32, + "name": "EmailAddressing.framework", + "path": "PrivateFrameworks/EmailAddressing.framework", + "children": [ + { + "value": 24, + "name": "Versions", + "path": "PrivateFrameworks/EmailAddressing.framework/Versions" + } + ] + }, + { + "value": 444, + "name": "ExchangeWebServices.framework", + "path": "PrivateFrameworks/ExchangeWebServices.framework", + "children": [ + { + "value": 436, + "name": "Versions", + "path": "PrivateFrameworks/ExchangeWebServices.framework/Versions" + } + ] + }, + { + "value": 23556, + "name": "FaceCore.framework", + "path": "PrivateFrameworks/FaceCore.framework", + "children": [ + { + "value": 23548, + "name": "Versions", + "path": "PrivateFrameworks/FaceCore.framework/Versions" + } + ] + }, + { + "value": 12, + "name": "FaceCoreLight.framework", + "path": "PrivateFrameworks/FaceCoreLight.framework", + "children": [ + { + "value": 8, + "name": "Versions", + "path": "PrivateFrameworks/FaceCoreLight.framework/Versions" + } + ] + }, + { + "value": 2836, + "name": "FamilyControls.framework", + "path": "PrivateFrameworks/FamilyControls.framework", + "children": [ + { + "value": 2828, + "name": "Versions", + "path": "PrivateFrameworks/FamilyControls.framework/Versions" + } + ] + }, + { + "value": 104, + "name": "FileSync.framework", + "path": "PrivateFrameworks/FileSync.framework", + "children": [ + { + "value": 96, + "name": "Versions", + "path": "PrivateFrameworks/FileSync.framework/Versions" + } + ] + }, + { + "value": 12048, + "name": "FinderKit.framework", + "path": "PrivateFrameworks/FinderKit.framework", + "children": [ + { + "value": 12040, + "name": "Versions", + "path": "PrivateFrameworks/FinderKit.framework/Versions" + } + ] + }, + { + "value": 1068, + "name": "FindMyMac.framework", + "path": "PrivateFrameworks/FindMyMac.framework", + "children": [ + { + "value": 1044, + "name": "Versions", + "path": "PrivateFrameworks/FindMyMac.framework/Versions" + }, + { + "value": 16, + "name": "XPCServices", + "path": "PrivateFrameworks/FindMyMac.framework/XPCServices" + } + ] + }, + { + "value": 32, + "name": "FTClientServices.framework", + "path": "PrivateFrameworks/FTClientServices.framework", + "children": [ + { + "value": 24, + "name": "Versions", + "path": "PrivateFrameworks/FTClientServices.framework/Versions" + } + ] + }, + { + "value": 156, + "name": "FTServices.framework", + "path": "PrivateFrameworks/FTServices.framework", + "children": [ + { + "value": 148, + "name": "Versions", + "path": "PrivateFrameworks/FTServices.framework/Versions" + } + ] + }, + { + "value": 216, + "name": "FWAVC.framework", + "path": "PrivateFrameworks/FWAVC.framework", + "children": [ + { + "value": 208, + "name": "Versions", + "path": "PrivateFrameworks/FWAVC.framework/Versions" + } + ] + }, + { + "value": 116, + "name": "FWAVCPrivate.framework", + "path": "PrivateFrameworks/FWAVCPrivate.framework", + "children": [ + { + "value": 108, + "name": "Versions", + "path": "PrivateFrameworks/FWAVCPrivate.framework/Versions" + } + ] + }, + { + "value": 624, + "name": "GameKitServices.framework", + "path": "PrivateFrameworks/GameKitServices.framework", + "children": [ + { + "value": 616, + "name": "Versions", + "path": "PrivateFrameworks/GameKitServices.framework/Versions" + } + ] + }, + { + "value": 312, + "name": "GenerationalStorage.framework", + "path": "PrivateFrameworks/GenerationalStorage.framework", + "children": [ + { + "value": 300, + "name": "Versions", + "path": "PrivateFrameworks/GenerationalStorage.framework/Versions" + } + ] + }, + { + "value": 14920, + "name": "GeoKit.framework", + "path": "PrivateFrameworks/GeoKit.framework", + "children": [ + { + "value": 14912, + "name": "Versions", + "path": "PrivateFrameworks/GeoKit.framework/Versions" + } + ] + }, + { + "value": 27272, + "name": "GeoServices.framework", + "path": "PrivateFrameworks/GeoServices.framework", + "children": [ + { + "value": 2104, + "name": "Versions", + "path": "PrivateFrameworks/GeoServices.framework/Versions" + } + ] + }, + { + "value": 152, + "name": "GPUSupport.framework", + "path": "PrivateFrameworks/GPUSupport.framework", + "children": [ + { + "value": 144, + "name": "Versions", + "path": "PrivateFrameworks/GPUSupport.framework/Versions" + } + ] + }, + { + "value": 28, + "name": "GraphicsAppSupport.framework", + "path": "PrivateFrameworks/GraphicsAppSupport.framework", + "children": [ + { + "value": 16, + "name": "Versions", + "path": "PrivateFrameworks/GraphicsAppSupport.framework/Versions" + } + ] + }, + { + "value": 336, + "name": "GraphKit.framework", + "path": "PrivateFrameworks/GraphKit.framework", + "children": [ + { + "value": 328, + "name": "Versions", + "path": "PrivateFrameworks/GraphKit.framework/Versions" + } + ] + }, + { + "value": 56, + "name": "HDAInterface.framework", + "path": "PrivateFrameworks/HDAInterface.framework", + "children": [ + { + "value": 48, + "name": "Versions", + "path": "PrivateFrameworks/HDAInterface.framework/Versions" + } + ] + }, + { + "value": 1044, + "name": "Heimdal.framework", + "path": "PrivateFrameworks/Heimdal.framework", + "children": [ + { + "value": 508, + "name": "Helpers", + "path": "PrivateFrameworks/Heimdal.framework/Helpers" + }, + { + "value": 528, + "name": "Versions", + "path": "PrivateFrameworks/Heimdal.framework/Versions" + } + ] + }, + { + "value": 56, + "name": "HeimODAdmin.framework", + "path": "PrivateFrameworks/HeimODAdmin.framework", + "children": [ + { + "value": 48, + "name": "Versions", + "path": "PrivateFrameworks/HeimODAdmin.framework/Versions" + } + ] + }, + { + "value": 232, + "name": "HelpData.framework", + "path": "PrivateFrameworks/HelpData.framework", + "children": [ + { + "value": 224, + "name": "Versions", + "path": "PrivateFrameworks/HelpData.framework/Versions" + } + ] + }, + { + "value": 104, + "name": "IASUtilities.framework", + "path": "PrivateFrameworks/IASUtilities.framework", + "children": [ + { + "value": 92, + "name": "Versions", + "path": "PrivateFrameworks/IASUtilities.framework/Versions" + } + ] + }, + { + "value": 224, + "name": "iCalendar.framework", + "path": "PrivateFrameworks/iCalendar.framework", + "children": [ + { + "value": 216, + "name": "Versions", + "path": "PrivateFrameworks/iCalendar.framework/Versions" + } + ] + }, + { + "value": 116, + "name": "ICANotifications.framework", + "path": "PrivateFrameworks/ICANotifications.framework", + "children": [ + { + "value": 108, + "name": "Versions", + "path": "PrivateFrameworks/ICANotifications.framework/Versions" + } + ] + }, + { + "value": 308, + "name": "IconServices.framework", + "path": "PrivateFrameworks/IconServices.framework", + "children": [ + { + "value": 296, + "name": "Versions", + "path": "PrivateFrameworks/IconServices.framework/Versions" + } + ] + }, + { + "value": 256, + "name": "IDS.framework", + "path": "PrivateFrameworks/IDS.framework", + "children": [ + { + "value": 248, + "name": "Versions", + "path": "PrivateFrameworks/IDS.framework/Versions" + } + ] + }, + { + "value": 4572, + "name": "IDSCore.framework", + "path": "PrivateFrameworks/IDSCore.framework", + "children": [ + { + "value": 1300, + "name": "identityservicesd.app", + "path": "PrivateFrameworks/IDSCore.framework/identityservicesd.app" + }, + { + "value": 3264, + "name": "Versions", + "path": "PrivateFrameworks/IDSCore.framework/Versions" + } + ] + }, + { + "value": 116, + "name": "IDSFoundation.framework", + "path": "PrivateFrameworks/IDSFoundation.framework", + "children": [ + { + "value": 108, + "name": "Versions", + "path": "PrivateFrameworks/IDSFoundation.framework/Versions" + } + ] + }, + { + "value": 24, + "name": "IDSSystemPreferencesSignIn.framework", + "path": "PrivateFrameworks/IDSSystemPreferencesSignIn.framework", + "children": [ + { + "value": 16, + "name": "Versions", + "path": "PrivateFrameworks/IDSSystemPreferencesSignIn.framework/Versions" + } + ] + }, + { + "value": 16772, + "name": "iLifeMediaBrowser.framework", + "path": "PrivateFrameworks/iLifeMediaBrowser.framework", + "children": [ + { + "value": 16764, + "name": "Versions", + "path": "PrivateFrameworks/iLifeMediaBrowser.framework/Versions" + } + ] + }, + { + "value": 252, + "name": "IMAP.framework", + "path": "PrivateFrameworks/IMAP.framework", + "children": [ + { + "value": 244, + "name": "Versions", + "path": "PrivateFrameworks/IMAP.framework/Versions" + } + ] + }, + { + "value": 396, + "name": "IMAVCore.framework", + "path": "PrivateFrameworks/IMAVCore.framework", + "children": [ + { + "value": 388, + "name": "Versions", + "path": "PrivateFrameworks/IMAVCore.framework/Versions" + } + ] + }, + { + "value": 856, + "name": "IMCore.framework", + "path": "PrivateFrameworks/IMCore.framework", + "children": [ + { + "value": 148, + "name": "imagent.app", + "path": "PrivateFrameworks/IMCore.framework/imagent.app" + }, + { + "value": 700, + "name": "Versions", + "path": "PrivateFrameworks/IMCore.framework/Versions" + } + ] + }, + { + "value": 364, + "name": "IMDaemonCore.framework", + "path": "PrivateFrameworks/IMDaemonCore.framework", + "children": [ + { + "value": 356, + "name": "Versions", + "path": "PrivateFrameworks/IMDaemonCore.framework/Versions" + } + ] + }, + { + "value": 68, + "name": "IMDMessageServices.framework", + "path": "PrivateFrameworks/IMDMessageServices.framework", + "children": [ + { + "value": 16, + "name": "Versions", + "path": "PrivateFrameworks/IMDMessageServices.framework/Versions" + }, + { + "value": 44, + "name": "XPCServices", + "path": "PrivateFrameworks/IMDMessageServices.framework/XPCServices" + } + ] + }, + { + "value": 316, + "name": "IMDPersistence.framework", + "path": "PrivateFrameworks/IMDPersistence.framework", + "children": [ + { + "value": 240, + "name": "Versions", + "path": "PrivateFrameworks/IMDPersistence.framework/Versions" + }, + { + "value": 68, + "name": "XPCServices", + "path": "PrivateFrameworks/IMDPersistence.framework/XPCServices" + } + ] + }, + { + "value": 596, + "name": "IMFoundation.framework", + "path": "PrivateFrameworks/IMFoundation.framework", + "children": [ + { + "value": 484, + "name": "Versions", + "path": "PrivateFrameworks/IMFoundation.framework/Versions" + }, + { + "value": 24, + "name": "XPCServices", + "path": "PrivateFrameworks/IMFoundation.framework/XPCServices" + } + ] + }, + { + "value": 88, + "name": "IMTranscoding.framework", + "path": "PrivateFrameworks/IMTranscoding.framework", + "children": [ + { + "value": 20, + "name": "Versions", + "path": "PrivateFrameworks/IMTranscoding.framework/Versions" + }, + { + "value": 60, + "name": "XPCServices", + "path": "PrivateFrameworks/IMTranscoding.framework/XPCServices" + } + ] + }, + { + "value": 92, + "name": "IMTransferServices.framework", + "path": "PrivateFrameworks/IMTransferServices.framework", + "children": [ + { + "value": 28, + "name": "Versions", + "path": "PrivateFrameworks/IMTransferServices.framework/Versions" + }, + { + "value": 56, + "name": "XPCServices", + "path": "PrivateFrameworks/IMTransferServices.framework/XPCServices" + } + ] + }, + { + "value": 48, + "name": "IncomingCallFilter.framework", + "path": "PrivateFrameworks/IncomingCallFilter.framework", + "children": [ + { + "value": 40, + "name": "Versions", + "path": "PrivateFrameworks/IncomingCallFilter.framework/Versions" + } + ] + }, + { + "value": 1668, + "name": "Install.framework", + "path": "PrivateFrameworks/Install.framework", + "children": [ + { + "value": 644, + "name": "Frameworks", + "path": "PrivateFrameworks/Install.framework/Frameworks" + }, + { + "value": 1016, + "name": "Versions", + "path": "PrivateFrameworks/Install.framework/Versions" + } + ] + }, + { + "value": 24, + "name": "International.framework", + "path": "PrivateFrameworks/International.framework", + "children": [ + { + "value": 16, + "name": "Versions", + "path": "PrivateFrameworks/International.framework/Versions" + } + ] + }, + { + "value": 2052, + "name": "InternetAccounts.framework", + "path": "PrivateFrameworks/InternetAccounts.framework", + "children": [ + { + "value": 2040, + "name": "Versions", + "path": "PrivateFrameworks/InternetAccounts.framework/Versions" + } + ] + }, + { + "value": 216, + "name": "IntlPreferences.framework", + "path": "PrivateFrameworks/IntlPreferences.framework", + "children": [ + { + "value": 208, + "name": "Versions", + "path": "PrivateFrameworks/IntlPreferences.framework/Versions" + } + ] + }, + { + "value": 52, + "name": "IOAccelerator.framework", + "path": "PrivateFrameworks/IOAccelerator.framework", + "children": [ + { + "value": 44, + "name": "Versions", + "path": "PrivateFrameworks/IOAccelerator.framework/Versions" + } + ] + }, + { + "value": 68, + "name": "IOAccelMemoryInfo.framework", + "path": "PrivateFrameworks/IOAccelMemoryInfo.framework", + "children": [ + { + "value": 60, + "name": "Versions", + "path": "PrivateFrameworks/IOAccelMemoryInfo.framework/Versions" + } + ] + }, + { + "value": 20, + "name": "IOPlatformPluginFamily.framework", + "path": "PrivateFrameworks/IOPlatformPluginFamily.framework", + "children": [ + { + "value": 12, + "name": "Versions", + "path": "PrivateFrameworks/IOPlatformPluginFamily.framework/Versions" + } + ] + }, + { + "value": 44, + "name": "iPod.framework", + "path": "PrivateFrameworks/iPod.framework", + "children": [ + { + "value": 36, + "name": "Versions", + "path": "PrivateFrameworks/iPod.framework/Versions" + } + ] + }, + { + "value": 160, + "name": "iPodSync.framework", + "path": "PrivateFrameworks/iPodSync.framework", + "children": [ + { + "value": 152, + "name": "Versions", + "path": "PrivateFrameworks/iPodSync.framework/Versions" + } + ] + }, + { + "value": 516, + "name": "ISSupport.framework", + "path": "PrivateFrameworks/ISSupport.framework", + "children": [ + { + "value": 508, + "name": "Versions", + "path": "PrivateFrameworks/ISSupport.framework/Versions" + } + ] + }, + { + "value": 644, + "name": "iTunesAccess.framework", + "path": "PrivateFrameworks/iTunesAccess.framework", + "children": [ + { + "value": 636, + "name": "Versions", + "path": "PrivateFrameworks/iTunesAccess.framework/Versions" + } + ] + }, + { + "value": 92, + "name": "JavaApplicationLauncher.framework", + "path": "PrivateFrameworks/JavaApplicationLauncher.framework", + "children": [ + { + "value": 84, + "name": "Versions", + "path": "PrivateFrameworks/JavaApplicationLauncher.framework/Versions" + } + ] + }, + { + "value": 48, + "name": "JavaLaunching.framework", + "path": "PrivateFrameworks/JavaLaunching.framework", + "children": [ + { + "value": 40, + "name": "Versions", + "path": "PrivateFrameworks/JavaLaunching.framework/Versions" + } + ] + }, + { + "value": 8, + "name": "KerberosHelper", + "path": "PrivateFrameworks/KerberosHelper", + "children": [ + { + "value": 8, + "name": "Helpers", + "path": "PrivateFrameworks/KerberosHelper/Helpers" + } + ] + }, + { + "value": 132, + "name": "KerberosHelper.framework", + "path": "PrivateFrameworks/KerberosHelper.framework", + "children": [ + { + "value": 40, + "name": "Helpers", + "path": "PrivateFrameworks/KerberosHelper.framework/Helpers" + }, + { + "value": 84, + "name": "Versions", + "path": "PrivateFrameworks/KerberosHelper.framework/Versions" + } + ] + }, + { + "value": 44, + "name": "kperf.framework", + "path": "PrivateFrameworks/kperf.framework", + "children": [ + { + "value": 36, + "name": "Versions", + "path": "PrivateFrameworks/kperf.framework/Versions" + } + ] + }, + { + "value": 100, + "name": "Librarian.framework", + "path": "PrivateFrameworks/Librarian.framework", + "children": [ + { + "value": 92, + "name": "Versions", + "path": "PrivateFrameworks/Librarian.framework/Versions" + } + ] + }, + { + "value": 56, + "name": "LibraryRepair.framework", + "path": "PrivateFrameworks/LibraryRepair.framework", + "children": [ + { + "value": 44, + "name": "Versions", + "path": "PrivateFrameworks/LibraryRepair.framework/Versions" + } + ] + }, + { + "value": 144, + "name": "login.framework", + "path": "PrivateFrameworks/login.framework", + "children": [ + { + "value": 132, + "name": "Versions", + "path": "PrivateFrameworks/login.framework/Versions" + } + ] + }, + { + "value": 4060, + "name": "LoginUIKit.framework", + "path": "PrivateFrameworks/LoginUIKit.framework", + "children": [ + { + "value": 4048, + "name": "Versions", + "path": "PrivateFrameworks/LoginUIKit.framework/Versions" + } + ] + }, + { + "value": 576, + "name": "Lookup.framework", + "path": "PrivateFrameworks/Lookup.framework", + "children": [ + { + "value": 568, + "name": "Versions", + "path": "PrivateFrameworks/Lookup.framework/Versions" + } + ] + }, + { + "value": 32, + "name": "MachineSettings.framework", + "path": "PrivateFrameworks/MachineSettings.framework", + "children": [ + { + "value": 24, + "name": "Versions", + "path": "PrivateFrameworks/MachineSettings.framework/Versions" + } + ] + }, + { + "value": 2812, + "name": "Mail.framework", + "path": "PrivateFrameworks/Mail.framework", + "children": [ + { + "value": 2800, + "name": "Versions", + "path": "PrivateFrameworks/Mail.framework/Versions" + } + ] + }, + { + "value": 1856, + "name": "MailCore.framework", + "path": "PrivateFrameworks/MailCore.framework", + "children": [ + { + "value": 1848, + "name": "Versions", + "path": "PrivateFrameworks/MailCore.framework/Versions" + } + ] + }, + { + "value": 68, + "name": "MailService.framework", + "path": "PrivateFrameworks/MailService.framework", + "children": [ + { + "value": 56, + "name": "Versions", + "path": "PrivateFrameworks/MailService.framework/Versions" + } + ] + }, + { + "value": 292, + "name": "MailUI.framework", + "path": "PrivateFrameworks/MailUI.framework", + "children": [ + { + "value": 280, + "name": "Versions", + "path": "PrivateFrameworks/MailUI.framework/Versions" + } + ] + }, + { + "value": 80, + "name": "ManagedClient.framework", + "path": "PrivateFrameworks/ManagedClient.framework", + "children": [ + { + "value": 72, + "name": "Versions", + "path": "PrivateFrameworks/ManagedClient.framework/Versions" + } + ] + }, + { + "value": 44, + "name": "Mangrove.framework", + "path": "PrivateFrameworks/Mangrove.framework", + "children": [ + { + "value": 32, + "name": "Versions", + "path": "PrivateFrameworks/Mangrove.framework/Versions" + } + ] + }, + { + "value": 28, + "name": "Marco.framework", + "path": "PrivateFrameworks/Marco.framework", + "children": [ + { + "value": 20, + "name": "Versions", + "path": "PrivateFrameworks/Marco.framework/Versions" + } + ] + }, + { + "value": 52, + "name": "MDSChannel.framework", + "path": "PrivateFrameworks/MDSChannel.framework", + "children": [ + { + "value": 44, + "name": "Versions", + "path": "PrivateFrameworks/MDSChannel.framework/Versions" + } + ] + }, + { + "value": 1488, + "name": "MediaControlSender.framework", + "path": "PrivateFrameworks/MediaControlSender.framework", + "children": [ + { + "value": 1480, + "name": "Versions", + "path": "PrivateFrameworks/MediaControlSender.framework/Versions" + } + ] + }, + { + "value": 480, + "name": "MediaKit.framework", + "path": "PrivateFrameworks/MediaKit.framework", + "children": [ + { + "value": 468, + "name": "Versions", + "path": "PrivateFrameworks/MediaKit.framework/Versions" + } + ] + }, + { + "value": 288, + "name": "MediaUI.framework", + "path": "PrivateFrameworks/MediaUI.framework", + "children": [ + { + "value": 280, + "name": "Versions", + "path": "PrivateFrameworks/MediaUI.framework/Versions" + } + ] + }, + { + "value": 56, + "name": "MessageProtection.framework", + "path": "PrivateFrameworks/MessageProtection.framework", + "children": [ + { + "value": 48, + "name": "Versions", + "path": "PrivateFrameworks/MessageProtection.framework/Versions" + } + ] + }, + { + "value": 680, + "name": "MessagesHelperKit.framework", + "path": "PrivateFrameworks/MessagesHelperKit.framework", + "children": [ + { + "value": 640, + "name": "PlugIns", + "path": "PrivateFrameworks/MessagesHelperKit.framework/PlugIns" + }, + { + "value": 32, + "name": "Versions", + "path": "PrivateFrameworks/MessagesHelperKit.framework/Versions" + } + ] + }, + { + "value": 160, + "name": "MessagesKit.framework", + "path": "PrivateFrameworks/MessagesKit.framework", + "children": [ + { + "value": 112, + "name": "Versions", + "path": "PrivateFrameworks/MessagesKit.framework/Versions" + }, + { + "value": 40, + "name": "XPCServices", + "path": "PrivateFrameworks/MessagesKit.framework/XPCServices" + } + ] + }, + { + "value": 372, + "name": "MMCS.framework", + "path": "PrivateFrameworks/MMCS.framework", + "children": [ + { + "value": 364, + "name": "Versions", + "path": "PrivateFrameworks/MMCS.framework/Versions" + } + ] + }, + { + "value": 56, + "name": "MMCSServices.framework", + "path": "PrivateFrameworks/MMCSServices.framework", + "children": [ + { + "value": 48, + "name": "Versions", + "path": "PrivateFrameworks/MMCSServices.framework/Versions" + } + ] + }, + { + "value": 1932, + "name": "MobileDevice.framework", + "path": "PrivateFrameworks/MobileDevice.framework", + "children": [ + { + "value": 1924, + "name": "Versions", + "path": "PrivateFrameworks/MobileDevice.framework/Versions" + } + ] + }, + { + "value": 80, + "name": "MonitorPanel.framework", + "path": "PrivateFrameworks/MonitorPanel.framework", + "children": [ + { + "value": 72, + "name": "Versions", + "path": "PrivateFrameworks/MonitorPanel.framework/Versions" + } + ] + }, + { + "value": 132, + "name": "MultitouchSupport.framework", + "path": "PrivateFrameworks/MultitouchSupport.framework", + "children": [ + { + "value": 124, + "name": "Versions", + "path": "PrivateFrameworks/MultitouchSupport.framework/Versions" + } + ] + }, + { + "value": 76, + "name": "NetAuth.framework", + "path": "PrivateFrameworks/NetAuth.framework", + "children": [ + { + "value": 68, + "name": "Versions", + "path": "PrivateFrameworks/NetAuth.framework/Versions" + } + ] + }, + { + "value": 52, + "name": "NetFSServer.framework", + "path": "PrivateFrameworks/NetFSServer.framework", + "children": [ + { + "value": 44, + "name": "Versions", + "path": "PrivateFrameworks/NetFSServer.framework/Versions" + } + ] + }, + { + "value": 56, + "name": "NetworkDiagnosticsUI.framework", + "path": "PrivateFrameworks/NetworkDiagnosticsUI.framework", + "children": [ + { + "value": 48, + "name": "Versions", + "path": "PrivateFrameworks/NetworkDiagnosticsUI.framework/Versions" + } + ] + }, + { + "value": 84, + "name": "NetworkMenusCommon.framework", + "path": "PrivateFrameworks/NetworkMenusCommon.framework", + "children": [ + { + "value": 0, + "name": "_CodeSignature", + "path": "PrivateFrameworks/NetworkMenusCommon.framework/_CodeSignature" + } + ] + }, + { + "value": 32, + "name": "NetworkStatistics.framework", + "path": "PrivateFrameworks/NetworkStatistics.framework", + "children": [ + { + "value": 24, + "name": "Versions", + "path": "PrivateFrameworks/NetworkStatistics.framework/Versions" + } + ] + }, + { + "value": 416, + "name": "Notes.framework", + "path": "PrivateFrameworks/Notes.framework", + "children": [ + { + "value": 400, + "name": "Versions", + "path": "PrivateFrameworks/Notes.framework/Versions" + } + ] + }, + { + "value": 84, + "name": "nt.framework", + "path": "PrivateFrameworks/nt.framework", + "children": [ + { + "value": 76, + "name": "Versions", + "path": "PrivateFrameworks/nt.framework/Versions" + } + ] + }, + { + "value": 24, + "name": "OAuth.framework", + "path": "PrivateFrameworks/OAuth.framework", + "children": [ + { + "value": 16, + "name": "Versions", + "path": "PrivateFrameworks/OAuth.framework/Versions" + } + ] + }, + { + "value": 6676, + "name": "OfficeImport.framework", + "path": "PrivateFrameworks/OfficeImport.framework", + "children": [ + { + "value": 6668, + "name": "Versions", + "path": "PrivateFrameworks/OfficeImport.framework/Versions" + } + ] + }, + { + "value": 160, + "name": "oncrpc.framework", + "path": "PrivateFrameworks/oncrpc.framework", + "children": [ + { + "value": 36, + "name": "bin", + "path": "PrivateFrameworks/oncrpc.framework/bin" + }, + { + "value": 116, + "name": "Versions", + "path": "PrivateFrameworks/oncrpc.framework/Versions" + } + ] + }, + { + "value": 140, + "name": "OpenDirectoryConfig.framework", + "path": "PrivateFrameworks/OpenDirectoryConfig.framework", + "children": [ + { + "value": 132, + "name": "Versions", + "path": "PrivateFrameworks/OpenDirectoryConfig.framework/Versions" + } + ] + }, + { + "value": 1292, + "name": "OpenDirectoryConfigUI.framework", + "path": "PrivateFrameworks/OpenDirectoryConfigUI.framework", + "children": [ + { + "value": 1284, + "name": "Versions", + "path": "PrivateFrameworks/OpenDirectoryConfigUI.framework/Versions" + } + ] + }, + { + "value": 1140, + "name": "PackageKit.framework", + "path": "PrivateFrameworks/PackageKit.framework", + "children": [ + { + "value": 272, + "name": "Frameworks", + "path": "PrivateFrameworks/PackageKit.framework/Frameworks" + }, + { + "value": 860, + "name": "Versions", + "path": "PrivateFrameworks/PackageKit.framework/Versions" + } + ] + }, + { + "value": 64, + "name": "PacketFilter.framework", + "path": "PrivateFrameworks/PacketFilter.framework", + "children": [ + { + "value": 56, + "name": "Versions", + "path": "PrivateFrameworks/PacketFilter.framework/Versions" + } + ] + }, + { + "value": 3312, + "name": "PassKit.framework", + "path": "PrivateFrameworks/PassKit.framework", + "children": [ + { + "value": 3300, + "name": "Versions", + "path": "PrivateFrameworks/PassKit.framework/Versions" + } + ] + }, + { + "value": 216, + "name": "PasswordServer.framework", + "path": "PrivateFrameworks/PasswordServer.framework", + "children": [ + { + "value": 208, + "name": "Versions", + "path": "PrivateFrameworks/PasswordServer.framework/Versions" + } + ] + }, + { + "value": 400, + "name": "PerformanceAnalysis.framework", + "path": "PrivateFrameworks/PerformanceAnalysis.framework", + "children": [ + { + "value": 360, + "name": "Versions", + "path": "PrivateFrameworks/PerformanceAnalysis.framework/Versions" + }, + { + "value": 32, + "name": "XPCServices", + "path": "PrivateFrameworks/PerformanceAnalysis.framework/XPCServices" + } + ] + }, + { + "value": 80, + "name": "PhoneNumbers.framework", + "path": "PrivateFrameworks/PhoneNumbers.framework", + "children": [ + { + "value": 72, + "name": "Versions", + "path": "PrivateFrameworks/PhoneNumbers.framework/Versions" + } + ] + }, + { + "value": 152, + "name": "PhysicsKit.framework", + "path": "PrivateFrameworks/PhysicsKit.framework", + "children": [ + { + "value": 144, + "name": "Versions", + "path": "PrivateFrameworks/PhysicsKit.framework/Versions" + } + ] + }, + { + "value": 112, + "name": "PlatformHardwareManagement.framework", + "path": "PrivateFrameworks/PlatformHardwareManagement.framework", + "children": [ + { + "value": 104, + "name": "Versions", + "path": "PrivateFrameworks/PlatformHardwareManagement.framework/Versions" + } + ] + }, + { + "value": 76, + "name": "PodcastProducerCore.framework", + "path": "PrivateFrameworks/PodcastProducerCore.framework", + "children": [ + { + "value": 68, + "name": "Versions", + "path": "PrivateFrameworks/PodcastProducerCore.framework/Versions" + } + ] + }, + { + "value": 612, + "name": "PodcastProducerKit.framework", + "path": "PrivateFrameworks/PodcastProducerKit.framework", + "children": [ + { + "value": 604, + "name": "Versions", + "path": "PrivateFrameworks/PodcastProducerKit.framework/Versions" + } + ] + }, + { + "value": 956, + "name": "PreferencePanesSupport.framework", + "path": "PrivateFrameworks/PreferencePanesSupport.framework", + "children": [ + { + "value": 948, + "name": "Versions", + "path": "PrivateFrameworks/PreferencePanesSupport.framework/Versions" + } + ] + }, + { + "value": 9580, + "name": "PrintingPrivate.framework", + "path": "PrivateFrameworks/PrintingPrivate.framework", + "children": [ + { + "value": 9572, + "name": "Versions", + "path": "PrivateFrameworks/PrintingPrivate.framework/Versions" + } + ] + }, + { + "value": 104432, + "name": "ProKit.framework", + "path": "PrivateFrameworks/ProKit.framework", + "children": [ + { + "value": 104424, + "name": "Versions", + "path": "PrivateFrameworks/ProKit.framework/Versions" + } + ] + }, + { + "value": 9784, + "name": "ProofReader.framework", + "path": "PrivateFrameworks/ProofReader.framework", + "children": [ + { + "value": 9776, + "name": "Versions", + "path": "PrivateFrameworks/ProofReader.framework/Versions" + } + ] + }, + { + "value": 76, + "name": "ProtocolBuffer.framework", + "path": "PrivateFrameworks/ProtocolBuffer.framework", + "children": [ + { + "value": 68, + "name": "Versions", + "path": "PrivateFrameworks/ProtocolBuffer.framework/Versions" + } + ] + }, + { + "value": 7628, + "name": "PSNormalizer.framework", + "path": "PrivateFrameworks/PSNormalizer.framework", + "children": [ + { + "value": 7616, + "name": "Versions", + "path": "PrivateFrameworks/PSNormalizer.framework/Versions" + } + ] + }, + { + "value": 96, + "name": "RemotePacketCapture.framework", + "path": "PrivateFrameworks/RemotePacketCapture.framework", + "children": [ + { + "value": 88, + "name": "Versions", + "path": "PrivateFrameworks/RemotePacketCapture.framework/Versions" + } + ] + }, + { + "value": 388, + "name": "RemoteViewServices.framework", + "path": "PrivateFrameworks/RemoteViewServices.framework", + "children": [ + { + "value": 304, + "name": "Versions", + "path": "PrivateFrameworks/RemoteViewServices.framework/Versions" + }, + { + "value": 76, + "name": "XPCServices", + "path": "PrivateFrameworks/RemoteViewServices.framework/XPCServices" + } + ] + }, + { + "value": 420, + "name": "Restore.framework", + "path": "PrivateFrameworks/Restore.framework", + "children": [ + { + "value": 412, + "name": "Versions", + "path": "PrivateFrameworks/Restore.framework/Versions" + } + ] + }, + { + "value": 56, + "name": "RTCReporting.framework", + "path": "PrivateFrameworks/RTCReporting.framework", + "children": [ + { + "value": 48, + "name": "Versions", + "path": "PrivateFrameworks/RTCReporting.framework/Versions" + } + ] + }, + { + "value": 6168, + "name": "Safari.framework", + "path": "PrivateFrameworks/Safari.framework", + "children": [ + { + "value": 6156, + "name": "Versions", + "path": "PrivateFrameworks/Safari.framework/Versions" + } + ] + }, + { + "value": 40, + "name": "SafariServices.framework", + "path": "PrivateFrameworks/SafariServices.framework", + "children": [ + { + "value": 28, + "name": "Versions", + "path": "PrivateFrameworks/SafariServices.framework/Versions" + } + ] + }, + { + "value": 432, + "name": "SAObjects.framework", + "path": "PrivateFrameworks/SAObjects.framework", + "children": [ + { + "value": 424, + "name": "Versions", + "path": "PrivateFrameworks/SAObjects.framework/Versions" + } + ] + }, + { + "value": 84, + "name": "SCEP.framework", + "path": "PrivateFrameworks/SCEP.framework", + "children": [ + { + "value": 76, + "name": "Versions", + "path": "PrivateFrameworks/SCEP.framework/Versions" + } + ] + }, + { + "value": 24256, + "name": "ScreenReader.framework", + "path": "PrivateFrameworks/ScreenReader.framework", + "children": [ + { + "value": 24244, + "name": "Versions", + "path": "PrivateFrameworks/ScreenReader.framework/Versions" + } + ] + }, + { + "value": 528, + "name": "ScreenSharing.framework", + "path": "PrivateFrameworks/ScreenSharing.framework", + "children": [ + { + "value": 520, + "name": "Versions", + "path": "PrivateFrameworks/ScreenSharing.framework/Versions" + } + ] + }, + { + "value": 36, + "name": "SecCodeWrapper.framework", + "path": "PrivateFrameworks/SecCodeWrapper.framework", + "children": [ + { + "value": 28, + "name": "Versions", + "path": "PrivateFrameworks/SecCodeWrapper.framework/Versions" + } + ] + }, + { + "value": 36, + "name": "SecureNetworking.framework", + "path": "PrivateFrameworks/SecureNetworking.framework", + "children": [ + { + "value": 28, + "name": "Versions", + "path": "PrivateFrameworks/SecureNetworking.framework/Versions" + } + ] + }, + { + "value": 60, + "name": "SecurityTokend.framework", + "path": "PrivateFrameworks/SecurityTokend.framework", + "children": [ + { + "value": 52, + "name": "Versions", + "path": "PrivateFrameworks/SecurityTokend.framework/Versions" + } + ] + }, + { + "value": 280, + "name": "SemanticDocumentManagement.framework", + "path": "PrivateFrameworks/SemanticDocumentManagement.framework", + "children": [ + { + "value": 272, + "name": "Versions", + "path": "PrivateFrameworks/SemanticDocumentManagement.framework/Versions" + } + ] + }, + { + "value": 720, + "name": "ServerFoundation.framework", + "path": "PrivateFrameworks/ServerFoundation.framework", + "children": [ + { + "value": 712, + "name": "Versions", + "path": "PrivateFrameworks/ServerFoundation.framework/Versions" + } + ] + }, + { + "value": 320, + "name": "ServerInformation.framework", + "path": "PrivateFrameworks/ServerInformation.framework", + "children": [ + { + "value": 312, + "name": "Versions", + "path": "PrivateFrameworks/ServerInformation.framework/Versions" + } + ] + }, + { + "value": 176, + "name": "SetupAssistantSupport.framework", + "path": "PrivateFrameworks/SetupAssistantSupport.framework", + "children": [ + { + "value": 168, + "name": "Versions", + "path": "PrivateFrameworks/SetupAssistantSupport.framework/Versions" + } + ] + }, + { + "value": 5512, + "name": "ShareKit.framework", + "path": "PrivateFrameworks/ShareKit.framework", + "children": [ + { + "value": 5496, + "name": "Versions", + "path": "PrivateFrameworks/ShareKit.framework/Versions" + } + ] + }, + { + "value": 100, + "name": "Sharing.framework", + "path": "PrivateFrameworks/Sharing.framework", + "children": [ + { + "value": 92, + "name": "Versions", + "path": "PrivateFrameworks/Sharing.framework/Versions" + } + ] + }, + { + "value": 616, + "name": "Shortcut.framework", + "path": "PrivateFrameworks/Shortcut.framework", + "children": [ + { + "value": 608, + "name": "Versions", + "path": "PrivateFrameworks/Shortcut.framework/Versions" + } + ] + }, + { + "value": 20, + "name": "SleepServices.framework", + "path": "PrivateFrameworks/SleepServices.framework", + "children": [ + { + "value": 12, + "name": "Versions", + "path": "PrivateFrameworks/SleepServices.framework/Versions" + } + ] + }, + { + "value": 62320, + "name": "Slideshows.framework", + "path": "PrivateFrameworks/Slideshows.framework", + "children": [ + { + "value": 62312, + "name": "Versions", + "path": "PrivateFrameworks/Slideshows.framework/Versions" + } + ] + }, + { + "value": 144, + "name": "SMBClient.framework", + "path": "PrivateFrameworks/SMBClient.framework", + "children": [ + { + "value": 136, + "name": "Versions", + "path": "PrivateFrameworks/SMBClient.framework/Versions" + } + ] + }, + { + "value": 112, + "name": "SocialAppsCore.framework", + "path": "PrivateFrameworks/SocialAppsCore.framework", + "children": [ + { + "value": 104, + "name": "Versions", + "path": "PrivateFrameworks/SocialAppsCore.framework/Versions" + } + ] + }, + { + "value": 936, + "name": "SocialUI.framework", + "path": "PrivateFrameworks/SocialUI.framework", + "children": [ + { + "value": 924, + "name": "Versions", + "path": "PrivateFrameworks/SocialUI.framework/Versions" + } + ] + }, + { + "value": 444, + "name": "SoftwareUpdate.framework", + "path": "PrivateFrameworks/SoftwareUpdate.framework", + "children": [ + { + "value": 436, + "name": "Versions", + "path": "PrivateFrameworks/SoftwareUpdate.framework/Versions" + } + ] + }, + { + "value": 2112, + "name": "SpeechDictionary.framework", + "path": "PrivateFrameworks/SpeechDictionary.framework", + "children": [ + { + "value": 2104, + "name": "Versions", + "path": "PrivateFrameworks/SpeechDictionary.framework/Versions" + } + ] + }, + { + "value": 8492, + "name": "SpeechObjects.framework", + "path": "PrivateFrameworks/SpeechObjects.framework", + "children": [ + { + "value": 8484, + "name": "Versions", + "path": "PrivateFrameworks/SpeechObjects.framework/Versions" + } + ] + }, + { + "value": 4248, + "name": "SpeechRecognitionCore.framework", + "path": "PrivateFrameworks/SpeechRecognitionCore.framework", + "children": [ + { + "value": 4236, + "name": "Versions", + "path": "PrivateFrameworks/SpeechRecognitionCore.framework/Versions" + } + ] + }, + { + "value": 2212, + "name": "SpotlightIndex.framework", + "path": "PrivateFrameworks/SpotlightIndex.framework", + "children": [ + { + "value": 2204, + "name": "Versions", + "path": "PrivateFrameworks/SpotlightIndex.framework/Versions" + } + ] + }, + { + "value": 48, + "name": "SPSupport.framework", + "path": "PrivateFrameworks/SPSupport.framework", + "children": [ + { + "value": 40, + "name": "Versions", + "path": "PrivateFrameworks/SPSupport.framework/Versions" + } + ] + }, + { + "value": 184, + "name": "StoreJavaScript.framework", + "path": "PrivateFrameworks/StoreJavaScript.framework", + "children": [ + { + "value": 176, + "name": "Versions", + "path": "PrivateFrameworks/StoreJavaScript.framework/Versions" + } + ] + }, + { + "value": 844, + "name": "StoreUI.framework", + "path": "PrivateFrameworks/StoreUI.framework", + "children": [ + { + "value": 836, + "name": "Versions", + "path": "PrivateFrameworks/StoreUI.framework/Versions" + } + ] + }, + { + "value": 32, + "name": "StoreXPCServices.framework", + "path": "PrivateFrameworks/StoreXPCServices.framework", + "children": [ + { + "value": 20, + "name": "Versions", + "path": "PrivateFrameworks/StoreXPCServices.framework/Versions" + } + ] + }, + { + "value": 72, + "name": "StreamingZip.framework", + "path": "PrivateFrameworks/StreamingZip.framework", + "children": [ + { + "value": 60, + "name": "Versions", + "path": "PrivateFrameworks/StreamingZip.framework/Versions" + } + ] + }, + { + "value": 456, + "name": "Suggestions.framework", + "path": "PrivateFrameworks/Suggestions.framework", + "children": [ + { + "value": 448, + "name": "Versions", + "path": "PrivateFrameworks/Suggestions.framework/Versions" + } + ] + }, + { + "value": 504, + "name": "Symbolication.framework", + "path": "PrivateFrameworks/Symbolication.framework", + "children": [ + { + "value": 496, + "name": "Versions", + "path": "PrivateFrameworks/Symbolication.framework/Versions" + } + ] + }, + { + "value": 320, + "name": "Symptoms.framework", + "path": "PrivateFrameworks/Symptoms.framework", + "children": [ + { + "value": 312, + "name": "Frameworks", + "path": "PrivateFrameworks/Symptoms.framework/Frameworks" + }, + { + "value": 4, + "name": "Versions", + "path": "PrivateFrameworks/Symptoms.framework/Versions" + } + ] + }, + { + "value": 280, + "name": "SyncedDefaults.framework", + "path": "PrivateFrameworks/SyncedDefaults.framework", + "children": [ + { + "value": 216, + "name": "Support", + "path": "PrivateFrameworks/SyncedDefaults.framework/Support" + }, + { + "value": 56, + "name": "Versions", + "path": "PrivateFrameworks/SyncedDefaults.framework/Versions" + } + ] + }, + { + "value": 5272, + "name": "SyncServicesUI.framework", + "path": "PrivateFrameworks/SyncServicesUI.framework", + "children": [ + { + "value": 5264, + "name": "Versions", + "path": "PrivateFrameworks/SyncServicesUI.framework/Versions" + } + ] + }, + { + "value": 932, + "name": "SystemAdministration.framework", + "path": "PrivateFrameworks/SystemAdministration.framework", + "children": [ + { + "value": 864, + "name": "Versions", + "path": "PrivateFrameworks/SystemAdministration.framework/Versions" + }, + { + "value": 60, + "name": "XPCServices", + "path": "PrivateFrameworks/SystemAdministration.framework/XPCServices" + } + ] + }, + { + "value": 5656, + "name": "SystemMigration.framework", + "path": "PrivateFrameworks/SystemMigration.framework", + "children": [ + { + "value": 508, + "name": "Frameworks", + "path": "PrivateFrameworks/SystemMigration.framework/Frameworks" + }, + { + "value": 5140, + "name": "Versions", + "path": "PrivateFrameworks/SystemMigration.framework/Versions" + } + ] + }, + { + "value": 52, + "name": "SystemUIPlugin.framework", + "path": "PrivateFrameworks/SystemUIPlugin.framework", + "children": [ + { + "value": 44, + "name": "Versions", + "path": "PrivateFrameworks/SystemUIPlugin.framework/Versions" + } + ] + }, + { + "value": 144, + "name": "TCC.framework", + "path": "PrivateFrameworks/TCC.framework", + "children": [ + { + "value": 136, + "name": "Versions", + "path": "PrivateFrameworks/TCC.framework/Versions" + } + ] + }, + { + "value": 48, + "name": "TrustEvaluationAgent.framework", + "path": "PrivateFrameworks/TrustEvaluationAgent.framework", + "children": [ + { + "value": 40, + "name": "Versions", + "path": "PrivateFrameworks/TrustEvaluationAgent.framework/Versions" + } + ] + }, + { + "value": 720, + "name": "Ubiquity.framework", + "path": "PrivateFrameworks/Ubiquity.framework", + "children": [ + { + "value": 708, + "name": "Versions", + "path": "PrivateFrameworks/Ubiquity.framework/Versions" + } + ] + }, + { + "value": 136, + "name": "UIRecording.framework", + "path": "PrivateFrameworks/UIRecording.framework", + "children": [ + { + "value": 128, + "name": "Versions", + "path": "PrivateFrameworks/UIRecording.framework/Versions" + } + ] + }, + { + "value": 56, + "name": "Uninstall.framework", + "path": "PrivateFrameworks/Uninstall.framework", + "children": [ + { + "value": 48, + "name": "Versions", + "path": "PrivateFrameworks/Uninstall.framework/Versions" + } + ] + }, + { + "value": 2320, + "name": "UniversalAccess.framework", + "path": "PrivateFrameworks/UniversalAccess.framework", + "children": [ + { + "value": 2308, + "name": "Versions", + "path": "PrivateFrameworks/UniversalAccess.framework/Versions" + } + ] + }, + { + "value": 1248, + "name": "VCXMPP.framework", + "path": "PrivateFrameworks/VCXMPP.framework", + "children": [ + { + "value": 1232, + "name": "Versions", + "path": "PrivateFrameworks/VCXMPP.framework/Versions" + } + ] + }, + { + "value": 2016, + "name": "VectorKit.framework", + "path": "PrivateFrameworks/VectorKit.framework", + "children": [ + { + "value": 2008, + "name": "Versions", + "path": "PrivateFrameworks/VectorKit.framework/Versions" + } + ] + }, + { + "value": 1164, + "name": "VideoConference.framework", + "path": "PrivateFrameworks/VideoConference.framework", + "children": [ + { + "value": 1156, + "name": "Versions", + "path": "PrivateFrameworks/VideoConference.framework/Versions" + } + ] + }, + { + "value": 2152, + "name": "VideoProcessing.framework", + "path": "PrivateFrameworks/VideoProcessing.framework", + "children": [ + { + "value": 2144, + "name": "Versions", + "path": "PrivateFrameworks/VideoProcessing.framework/Versions" + } + ] + }, + { + "value": 420, + "name": "ViewBridge.framework", + "path": "PrivateFrameworks/ViewBridge.framework", + "children": [ + { + "value": 412, + "name": "Versions", + "path": "PrivateFrameworks/ViewBridge.framework/Versions" + } + ] + }, + { + "value": 164, + "name": "vmutils.framework", + "path": "PrivateFrameworks/vmutils.framework", + "children": [ + { + "value": 156, + "name": "Versions", + "path": "PrivateFrameworks/vmutils.framework/Versions" + } + ] + }, + { + "value": 284, + "name": "WeatherKit.framework", + "path": "PrivateFrameworks/WeatherKit.framework", + "children": [ + { + "value": 272, + "name": "Versions", + "path": "PrivateFrameworks/WeatherKit.framework/Versions" + } + ] + }, + { + "value": 2228, + "name": "WebContentAnalysis.framework", + "path": "PrivateFrameworks/WebContentAnalysis.framework", + "children": [ + { + "value": 2220, + "name": "Versions", + "path": "PrivateFrameworks/WebContentAnalysis.framework/Versions" + } + ] + }, + { + "value": 24, + "name": "WebFilterDNS.framework", + "path": "PrivateFrameworks/WebFilterDNS.framework", + "children": [ + { + "value": 16, + "name": "Versions", + "path": "PrivateFrameworks/WebFilterDNS.framework/Versions" + } + ] + }, + { + "value": 132, + "name": "WebInspector.framework", + "path": "PrivateFrameworks/WebInspector.framework", + "children": [ + { + "value": 124, + "name": "Versions", + "path": "PrivateFrameworks/WebInspector.framework/Versions" + } + ] + }, + { + "value": 1228, + "name": "WebInspectorUI.framework", + "path": "PrivateFrameworks/WebInspectorUI.framework", + "children": [ + { + "value": 1220, + "name": "Versions", + "path": "PrivateFrameworks/WebInspectorUI.framework/Versions" + } + ] + }, + { + "value": 2672, + "name": "WebKit2.framework", + "path": "PrivateFrameworks/WebKit2.framework", + "children": [ + { + "value": 16, + "name": "NetworkProcess.app", + "path": "PrivateFrameworks/WebKit2.framework/NetworkProcess.app" + }, + { + "value": 8, + "name": "OfflineStorageProcess.app", + "path": "PrivateFrameworks/WebKit2.framework/OfflineStorageProcess.app" + }, + { + "value": 20, + "name": "PluginProcess.app", + "path": "PrivateFrameworks/WebKit2.framework/PluginProcess.app" + }, + { + "value": 8, + "name": "SharedWorkerProcess.app", + "path": "PrivateFrameworks/WebKit2.framework/SharedWorkerProcess.app" + }, + { + "value": 2592, + "name": "Versions", + "path": "PrivateFrameworks/WebKit2.framework/Versions" + }, + { + "value": 16, + "name": "WebProcess.app", + "path": "PrivateFrameworks/WebKit2.framework/WebProcess.app" + } + ] + }, + { + "value": 496, + "name": "WhitePages.framework", + "path": "PrivateFrameworks/WhitePages.framework", + "children": [ + { + "value": 488, + "name": "Versions", + "path": "PrivateFrameworks/WhitePages.framework/Versions" + } + ] + }, + { + "value": 36, + "name": "WiFiCloudSyncEngine.framework", + "path": "PrivateFrameworks/WiFiCloudSyncEngine.framework", + "children": [ + { + "value": 28, + "name": "Versions", + "path": "PrivateFrameworks/WiFiCloudSyncEngine.framework/Versions" + } + ] + }, + { + "value": 444, + "name": "WirelessDiagnosticsSupport.framework", + "path": "PrivateFrameworks/WirelessDiagnosticsSupport.framework", + "children": [ + { + "value": 436, + "name": "Versions", + "path": "PrivateFrameworks/WirelessDiagnosticsSupport.framework/Versions" + } + ] + }, + { + "value": 372, + "name": "XMPPCore.framework", + "path": "PrivateFrameworks/XMPPCore.framework", + "children": [ + { + "value": 364, + "name": "Versions", + "path": "PrivateFrameworks/XMPPCore.framework/Versions" + } + ] + }, + { + "value": 48, + "name": "XPCObjects.framework", + "path": "PrivateFrameworks/XPCObjects.framework", + "children": [ + { + "value": 40, + "name": "Versions", + "path": "PrivateFrameworks/XPCObjects.framework/Versions" + } + ] + }, + { + "value": 60, + "name": "XPCService.framework", + "path": "PrivateFrameworks/XPCService.framework", + "children": [ + { + "value": 52, + "name": "Versions", + "path": "PrivateFrameworks/XPCService.framework/Versions" + } + ] + }, + { + "value": 516, + "name": "XQuery.framework", + "path": "PrivateFrameworks/XQuery.framework", + "children": [ + { + "value": 508, + "name": "Versions", + "path": "PrivateFrameworks/XQuery.framework/Versions" + } + ] + } + ] + }, + { + "value": 2988, + "name": "QuickLook", + "path": "QuickLook", + "children": [ + { + "value": 8, + "name": "Audio.qlgenerator", + "path": "QuickLook/Audio.qlgenerator", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "QuickLook/Audio.qlgenerator/Contents" + } + ] + }, + { + "value": 12, + "name": "Bookmark.qlgenerator", + "path": "QuickLook/Bookmark.qlgenerator", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "QuickLook/Bookmark.qlgenerator/Contents" + } + ] + }, + { + "value": 12, + "name": "Clippings.qlgenerator", + "path": "QuickLook/Clippings.qlgenerator", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "QuickLook/Clippings.qlgenerator/Contents" + } + ] + }, + { + "value": 232, + "name": "Contact.qlgenerator", + "path": "QuickLook/Contact.qlgenerator", + "children": [ + { + "value": 232, + "name": "Contents", + "path": "QuickLook/Contact.qlgenerator/Contents" + } + ] + }, + { + "value": 8, + "name": "EPS.qlgenerator", + "path": "QuickLook/EPS.qlgenerator", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "QuickLook/EPS.qlgenerator/Contents" + } + ] + }, + { + "value": 12, + "name": "Font.qlgenerator", + "path": "QuickLook/Font.qlgenerator", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "QuickLook/Font.qlgenerator/Contents" + } + ] + }, + { + "value": 1432, + "name": "iCal.qlgenerator", + "path": "QuickLook/iCal.qlgenerator", + "children": [ + { + "value": 1432, + "name": "Contents", + "path": "QuickLook/iCal.qlgenerator/Contents" + } + ] + }, + { + "value": 8, + "name": "iChat.qlgenerator", + "path": "QuickLook/iChat.qlgenerator", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "QuickLook/iChat.qlgenerator/Contents" + } + ] + }, + { + "value": 8, + "name": "Icon.qlgenerator", + "path": "QuickLook/Icon.qlgenerator", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "QuickLook/Icon.qlgenerator/Contents" + } + ] + }, + { + "value": 8, + "name": "Image.qlgenerator", + "path": "QuickLook/Image.qlgenerator", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "QuickLook/Image.qlgenerator/Contents" + } + ] + }, + { + "value": 12, + "name": "LocPDF.qlgenerator", + "path": "QuickLook/LocPDF.qlgenerator", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "QuickLook/LocPDF.qlgenerator/Contents" + } + ] + }, + { + "value": 28, + "name": "Mail.qlgenerator", + "path": "QuickLook/Mail.qlgenerator", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "QuickLook/Mail.qlgenerator/Contents" + } + ] + }, + { + "value": 12, + "name": "Movie.qlgenerator", + "path": "QuickLook/Movie.qlgenerator", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "QuickLook/Movie.qlgenerator/Contents" + } + ] + }, + { + "value": 20, + "name": "Notes.qlgenerator", + "path": "QuickLook/Notes.qlgenerator", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "QuickLook/Notes.qlgenerator/Contents" + } + ] + }, + { + "value": 24, + "name": "Office.qlgenerator", + "path": "QuickLook/Office.qlgenerator", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "QuickLook/Office.qlgenerator/Contents" + } + ] + }, + { + "value": 8, + "name": "Package.qlgenerator", + "path": "QuickLook/Package.qlgenerator", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "QuickLook/Package.qlgenerator/Contents" + } + ] + }, + { + "value": 20, + "name": "PDF.qlgenerator", + "path": "QuickLook/PDF.qlgenerator", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "QuickLook/PDF.qlgenerator/Contents" + } + ] + }, + { + "value": 8, + "name": "SceneKit.qlgenerator", + "path": "QuickLook/SceneKit.qlgenerator", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "QuickLook/SceneKit.qlgenerator/Contents" + } + ] + }, + { + "value": 36, + "name": "Security.qlgenerator", + "path": "QuickLook/Security.qlgenerator", + "children": [ + { + "value": 36, + "name": "Contents", + "path": "QuickLook/Security.qlgenerator/Contents" + } + ] + }, + { + "value": 1060, + "name": "StandardBundles.qlgenerator", + "path": "QuickLook/StandardBundles.qlgenerator", + "children": [ + { + "value": 1060, + "name": "Contents", + "path": "QuickLook/StandardBundles.qlgenerator/Contents" + } + ] + }, + { + "value": 12, + "name": "Text.qlgenerator", + "path": "QuickLook/Text.qlgenerator", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "QuickLook/Text.qlgenerator/Contents" + } + ] + }, + { + "value": 8, + "name": "Web.qlgenerator", + "path": "QuickLook/Web.qlgenerator", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "QuickLook/Web.qlgenerator/Contents" + } + ] + } + ] + }, + { + "value": 17888, + "name": "QuickTime", + "path": "QuickTime", + "children": [ + { + "value": 24, + "name": "AppleGVAHW.component", + "path": "QuickTime/AppleGVAHW.component", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "QuickTime/AppleGVAHW.component/Contents" + } + ] + }, + { + "value": 60, + "name": "ApplePixletVideo.component", + "path": "QuickTime/ApplePixletVideo.component", + "children": [ + { + "value": 60, + "name": "Contents", + "path": "QuickTime/ApplePixletVideo.component/Contents" + } + ] + }, + { + "value": 216, + "name": "AppleProResDecoder.component", + "path": "QuickTime/AppleProResDecoder.component", + "children": [ + { + "value": 216, + "name": "Contents", + "path": "QuickTime/AppleProResDecoder.component/Contents" + } + ] + }, + { + "value": 756, + "name": "AppleVAH264HW.component", + "path": "QuickTime/AppleVAH264HW.component", + "children": [ + { + "value": 756, + "name": "Contents", + "path": "QuickTime/AppleVAH264HW.component/Contents" + } + ] + }, + { + "value": 24, + "name": "QuartzComposer.component", + "path": "QuickTime/QuartzComposer.component", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "QuickTime/QuartzComposer.component/Contents" + } + ] + }, + { + "value": 520, + "name": "QuickTime3GPP.component", + "path": "QuickTime/QuickTime3GPP.component", + "children": [ + { + "value": 520, + "name": "Contents", + "path": "QuickTime/QuickTime3GPP.component/Contents" + } + ] + }, + { + "value": 11548, + "name": "QuickTimeComponents.component", + "path": "QuickTime/QuickTimeComponents.component", + "children": [ + { + "value": 11548, + "name": "Contents", + "path": "QuickTime/QuickTimeComponents.component/Contents" + } + ] + }, + { + "value": 76, + "name": "QuickTimeFireWireDV.component", + "path": "QuickTime/QuickTimeFireWireDV.component", + "children": [ + { + "value": 76, + "name": "Contents", + "path": "QuickTime/QuickTimeFireWireDV.component/Contents" + } + ] + }, + { + "value": 1592, + "name": "QuickTimeH264.component", + "path": "QuickTime/QuickTimeH264.component", + "children": [ + { + "value": 1592, + "name": "Contents", + "path": "QuickTime/QuickTimeH264.component/Contents" + } + ] + }, + { + "value": 64, + "name": "QuickTimeIIDCDigitizer.component", + "path": "QuickTime/QuickTimeIIDCDigitizer.component", + "children": [ + { + "value": 64, + "name": "Contents", + "path": "QuickTime/QuickTimeIIDCDigitizer.component/Contents" + } + ] + }, + { + "value": 832, + "name": "QuickTimeImporters.component", + "path": "QuickTime/QuickTimeImporters.component", + "children": [ + { + "value": 832, + "name": "Contents", + "path": "QuickTime/QuickTimeImporters.component/Contents" + } + ] + }, + { + "value": 200, + "name": "QuickTimeMPEG.component", + "path": "QuickTime/QuickTimeMPEG.component", + "children": [ + { + "value": 200, + "name": "Contents", + "path": "QuickTime/QuickTimeMPEG.component/Contents" + } + ] + }, + { + "value": 564, + "name": "QuickTimeMPEG4.component", + "path": "QuickTime/QuickTimeMPEG4.component", + "children": [ + { + "value": 564, + "name": "Contents", + "path": "QuickTime/QuickTimeMPEG4.component/Contents" + } + ] + }, + { + "value": 968, + "name": "QuickTimeStreaming.component", + "path": "QuickTime/QuickTimeStreaming.component", + "children": [ + { + "value": 968, + "name": "Contents", + "path": "QuickTime/QuickTimeStreaming.component/Contents" + } + ] + }, + { + "value": 120, + "name": "QuickTimeUSBVDCDigitizer.component", + "path": "QuickTime/QuickTimeUSBVDCDigitizer.component", + "children": [ + { + "value": 120, + "name": "Contents", + "path": "QuickTime/QuickTimeUSBVDCDigitizer.component/Contents" + } + ] + }, + { + "value": 324, + "name": "QuickTimeVR.component", + "path": "QuickTime/QuickTimeVR.component", + "children": [ + { + "value": 324, + "name": "Contents", + "path": "QuickTime/QuickTimeVR.component/Contents" + } + ] + } + ] + }, + { + "value": 28, + "name": "QuickTimeJava", + "path": "QuickTimeJava", + "children": [ + { + "value": 28, + "name": "QuickTimeJava.bundle", + "path": "QuickTimeJava/QuickTimeJava.bundle", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "QuickTimeJava/QuickTimeJava.bundle/Contents" + } + ] + } + ] + }, + { + "value": 20, + "name": "Recents", + "path": "Recents", + "children": [ + { + "value": 20, + "name": "Plugins", + "path": "Recents/Plugins", + "children": [ + { + "value": 36, + "name": "AddressBook.assistantBundle", + "path": "Assistant/Plugins/AddressBook.assistantBundle" + }, + { + "value": 8, + "name": "GenericAddressHandler.addresshandler", + "path": "Recents/Plugins/GenericAddressHandler.addresshandler" + }, + { + "value": 12, + "name": "MapsRecents.addresshandler", + "path": "Recents/Plugins/MapsRecents.addresshandler" + } + ] + } + ] + }, + { + "value": 12, + "name": "Sandbox", + "path": "Sandbox", + "children": [ + { + "value": 12, + "name": "Profiles", + "path": "Sandbox/Profiles" + } + ] + }, + { + "value": 1052, + "name": "ScreenSavers", + "path": "ScreenSavers", + "children": [ + { + "value": 8, + "name": "FloatingMessage.saver", + "path": "ScreenSavers/FloatingMessage.saver", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "ScreenSavers/FloatingMessage.saver/Contents" + } + ] + }, + { + "value": 360, + "name": "Flurry.saver", + "path": "ScreenSavers/Flurry.saver", + "children": [ + { + "value": 360, + "name": "Contents", + "path": "ScreenSavers/Flurry.saver/Contents" + } + ] + }, + { + "value": 568, + "name": "iTunes Artwork.saver", + "path": "ScreenSavers/iTunes Artwork.saver", + "children": [ + { + "value": 568, + "name": "Contents", + "path": "ScreenSavers/iTunes Artwork.saver/Contents" + } + ] + }, + { + "value": 52, + "name": "Random.saver", + "path": "ScreenSavers/Random.saver", + "children": [ + { + "value": 52, + "name": "Contents", + "path": "ScreenSavers/Random.saver/Contents" + } + ] + } + ] + }, + { + "value": 1848, + "name": "ScreenReader", + "path": "ScreenReader", + "children": [ + { + "value": 556, + "name": "BrailleDrivers", + "path": "ScreenReader/BrailleDrivers", + "children": [ + { + "value": 28, + "name": "Alva6 Series.brailledriver", + "path": "ScreenReader/BrailleDrivers/Alva6 Series.brailledriver" + }, + { + "value": 16, + "name": "Alva.brailledriver", + "path": "ScreenReader/BrailleDrivers/Alva.brailledriver" + }, + { + "value": 28, + "name": "BrailleConnect.brailledriver", + "path": "ScreenReader/BrailleDrivers/BrailleConnect.brailledriver" + }, + { + "value": 24, + "name": "BrailleNoteApex.brailledriver", + "path": "ScreenReader/BrailleDrivers/BrailleNoteApex.brailledriver" + }, + { + "value": 16, + "name": "BrailleNote.brailledriver", + "path": "ScreenReader/BrailleDrivers/BrailleNote.brailledriver" + }, + { + "value": 24, + "name": "BrailleSense.brailledriver", + "path": "ScreenReader/BrailleDrivers/BrailleSense.brailledriver" + }, + { + "value": 28, + "name": "Brailliant2.brailledriver", + "path": "ScreenReader/BrailleDrivers/Brailliant2.brailledriver" + }, + { + "value": 28, + "name": "Brailliant.brailledriver", + "path": "ScreenReader/BrailleDrivers/Brailliant.brailledriver" + }, + { + "value": 16, + "name": "Deininger.brailledriver", + "path": "ScreenReader/BrailleDrivers/Deininger.brailledriver" + }, + { + "value": 20, + "name": "EasyLink.brailledriver", + "path": "ScreenReader/BrailleDrivers/EasyLink.brailledriver" + }, + { + "value": 28, + "name": "Eurobraille.brailledriver", + "path": "ScreenReader/BrailleDrivers/Eurobraille.brailledriver" + }, + { + "value": 28, + "name": "FreedomScientific.brailledriver", + "path": "ScreenReader/BrailleDrivers/FreedomScientific.brailledriver" + }, + { + "value": 32, + "name": "HandyTech.brailledriver", + "path": "ScreenReader/BrailleDrivers/HandyTech.brailledriver" + }, + { + "value": 20, + "name": "HIMSDriver.brailledriver", + "path": "ScreenReader/BrailleDrivers/HIMSDriver.brailledriver" + }, + { + "value": 28, + "name": "KGSDriver.brailledriver", + "path": "ScreenReader/BrailleDrivers/KGSDriver.brailledriver" + }, + { + "value": 28, + "name": "MDV.brailledriver", + "path": "ScreenReader/BrailleDrivers/MDV.brailledriver" + }, + { + "value": 24, + "name": "NinepointSystems.brailledriver", + "path": "ScreenReader/BrailleDrivers/NinepointSystems.brailledriver" + }, + { + "value": 24, + "name": "Papenmeier.brailledriver", + "path": "ScreenReader/BrailleDrivers/Papenmeier.brailledriver" + }, + { + "value": 28, + "name": "Refreshabraille.brailledriver", + "path": "ScreenReader/BrailleDrivers/Refreshabraille.brailledriver" + }, + { + "value": 32, + "name": "Seika.brailledriver", + "path": "ScreenReader/BrailleDrivers/Seika.brailledriver" + }, + { + "value": 16, + "name": "SyncBraille.brailledriver", + "path": "ScreenReader/BrailleDrivers/SyncBraille.brailledriver" + }, + { + "value": 24, + "name": "VarioPro.brailledriver", + "path": "ScreenReader/BrailleDrivers/VarioPro.brailledriver" + }, + { + "value": 16, + "name": "Voyager.brailledriver", + "path": "ScreenReader/BrailleDrivers/Voyager.brailledriver" + } + ] + }, + { + "value": 1292, + "name": "BrailleTables", + "path": "ScreenReader/BrailleTables", + "children": [ + { + "value": 1292, + "name": "Duxbury.brailletable", + "path": "ScreenReader/BrailleTables/Duxbury.brailletable" + } + ] + } + ] + }, + { + "value": 1408, + "name": "ScriptingAdditions", + "path": "ScriptingAdditions", + "children": [ + { + "value": 8, + "name": "DigitalHub Scripting.osax", + "path": "ScriptingAdditions/DigitalHub Scripting.osax", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "ScriptingAdditions/DigitalHub Scripting.osax/Contents" + } + ] + }, + { + "value": 1400, + "name": "StandardAdditions.osax", + "path": "ScriptingAdditions/StandardAdditions.osax", + "children": [ + { + "value": 1400, + "name": "Contents", + "path": "ScriptingAdditions/StandardAdditions.osax/Contents" + } + ] + } + ] + }, + { + "value": 0, + "name": "ScriptingDefinitions", + "path": "ScriptingDefinitions" + }, + { + "value": 0, + "name": "SDKSettingsPlist", + "path": "SDKSettingsPlist" + }, + { + "value": 312, + "name": "Security", + "path": "Security", + "children": [ + { + "value": 100, + "name": "dotmac_tp.bundle", + "path": "Security/dotmac_tp.bundle", + "children": [ + { + "value": 100, + "name": "Contents", + "path": "Security/dotmac_tp.bundle/Contents" + } + ] + }, + { + "value": 72, + "name": "ldapdl.bundle", + "path": "Security/ldapdl.bundle", + "children": [ + { + "value": 72, + "name": "Contents", + "path": "Security/ldapdl.bundle/Contents" + } + ] + }, + { + "value": 132, + "name": "tokend", + "path": "Security/tokend", + "children": [ + { + "value": 132, + "name": "uiplugins", + "path": "Security/tokend/uiplugins" + } + ] + } + ] + }, + { + "value": 18208, + "name": "Services", + "path": "Services", + "children": [ + { + "value": 0, + "name": "Addto iTunes as a Spoken Track.workflow", + "path": "Services/Addto iTunes as a Spoken Track.workflow", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Services/Addto iTunes as a Spoken Track.workflow/Contents" + } + ] + }, + { + "value": 14308, + "name": "AppleSpell.service", + "path": "Services/AppleSpell.service", + "children": [ + { + "value": 14308, + "name": "Contents", + "path": "Services/AppleSpell.service/Contents" + } + ] + }, + { + "value": 556, + "name": "ChineseTextConverterService.app", + "path": "Services/ChineseTextConverterService.app", + "children": [ + { + "value": 556, + "name": "Contents", + "path": "Services/ChineseTextConverterService.app/Contents" + } + ] + }, + { + "value": 48, + "name": "EncodeSelected Audio Files.workflow", + "path": "Services/EncodeSelected Audio Files.workflow", + "children": [ + { + "value": 48, + "name": "Contents", + "path": "Services/EncodeSelected Audio Files.workflow/Contents" + } + ] + }, + { + "value": 40, + "name": "EncodeSelected Video Files.workflow", + "path": "Services/EncodeSelected Video Files.workflow", + "children": [ + { + "value": 40, + "name": "Contents", + "path": "Services/EncodeSelected Video Files.workflow/Contents" + } + ] + }, + { + "value": 1344, + "name": "ImageCaptureService.app", + "path": "Services/ImageCaptureService.app", + "children": [ + { + "value": 1344, + "name": "Contents", + "path": "Services/ImageCaptureService.app/Contents" + } + ] + }, + { + "value": 16, + "name": "OpenSpell.service", + "path": "Services/OpenSpell.service", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "Services/OpenSpell.service/Contents" + } + ] + }, + { + "value": 0, + "name": "SetDesktop Picture.workflow", + "path": "Services/SetDesktop Picture.workflow", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Services/SetDesktop Picture.workflow/Contents" + } + ] + }, + { + "value": 0, + "name": "ShowAddress in Google Maps.workflow", + "path": "Services/ShowAddress in Google Maps.workflow", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "Services/ShowAddress in Google Maps.workflow/Contents" + } + ] + }, + { + "value": 60, + "name": "ShowMap.workflow", + "path": "Services/ShowMap.workflow", + "children": [ + { + "value": 60, + "name": "Contents", + "path": "Services/ShowMap.workflow/Contents" + } + ] + }, + { + "value": 12, + "name": "SpeechService.service", + "path": "Services/SpeechService.service", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Services/SpeechService.service/Contents" + } + ] + }, + { + "value": 8, + "name": "Spotlight.service", + "path": "Services/Spotlight.service", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Services/Spotlight.service/Contents" + } + ] + }, + { + "value": 1816, + "name": "SummaryService.app", + "path": "Services/SummaryService.app", + "children": [ + { + "value": 1816, + "name": "Contents", + "path": "Services/SummaryService.app/Contents" + } + ] + } + ] + }, + { + "value": 700, + "name": "Sounds", + "path": "Sounds" + }, + { + "value": 1512668, + "name": "Speech", + "path": "Speech", + "children": [ + { + "value": 2804, + "name": "Recognizers", + "path": "Speech/Recognizers", + "children": [ + { + "value": 2804, + "name": "AppleSpeakableItems.SpeechRecognizer", + "path": "Speech/Recognizers/AppleSpeakableItems.SpeechRecognizer" + } + ] + }, + { + "value": 6684, + "name": "Synthesizers", + "path": "Speech/Synthesizers", + "children": [ + { + "value": 800, + "name": "MacinTalk.SpeechSynthesizer", + "path": "Speech/Synthesizers/MacinTalk.SpeechSynthesizer" + }, + { + "value": 3468, + "name": "MultiLingual.SpeechSynthesizer", + "path": "Speech/Synthesizers/MultiLingual.SpeechSynthesizer" + }, + { + "value": 2416, + "name": "Polyglot.SpeechSynthesizer", + "path": "Speech/Synthesizers/Polyglot.SpeechSynthesizer" + } + ] + }, + { + "value": 1503180, + "name": "Voices", + "path": "Speech/Voices", + "children": [ + { + "value": 1540, + "name": "Agnes.SpeechVoice", + "path": "Speech/Voices/Agnes.SpeechVoice" + }, + { + "value": 20, + "name": "Albert.SpeechVoice", + "path": "Speech/Voices/Albert.SpeechVoice" + }, + { + "value": 412132, + "name": "Alex.SpeechVoice", + "path": "Speech/Voices/Alex.SpeechVoice" + }, + { + "value": 624, + "name": "AliceCompact.SpeechVoice", + "path": "Speech/Voices/AliceCompact.SpeechVoice" + }, + { + "value": 908, + "name": "AlvaCompact.SpeechVoice", + "path": "Speech/Voices/AlvaCompact.SpeechVoice" + }, + { + "value": 668, + "name": "AmelieCompact.SpeechVoice", + "path": "Speech/Voices/AmelieCompact.SpeechVoice" + }, + { + "value": 1016, + "name": "AnnaCompact.SpeechVoice", + "path": "Speech/Voices/AnnaCompact.SpeechVoice" + }, + { + "value": 12, + "name": "BadNews.SpeechVoice", + "path": "Speech/Voices/BadNews.SpeechVoice" + }, + { + "value": 20, + "name": "Bahh.SpeechVoice", + "path": "Speech/Voices/Bahh.SpeechVoice" + }, + { + "value": 48, + "name": "Bells.SpeechVoice", + "path": "Speech/Voices/Bells.SpeechVoice" + }, + { + "value": 20, + "name": "Boing.SpeechVoice", + "path": "Speech/Voices/Boing.SpeechVoice" + }, + { + "value": 1684, + "name": "Bruce.SpeechVoice", + "path": "Speech/Voices/Bruce.SpeechVoice" + }, + { + "value": 12, + "name": "Bubbles.SpeechVoice", + "path": "Speech/Voices/Bubbles.SpeechVoice" + }, + { + "value": 24, + "name": "Cellos.SpeechVoice", + "path": "Speech/Voices/Cellos.SpeechVoice" + }, + { + "value": 720, + "name": "DamayantiCompact.SpeechVoice", + "path": "Speech/Voices/DamayantiCompact.SpeechVoice" + }, + { + "value": 1000, + "name": "DanielCompact.SpeechVoice", + "path": "Speech/Voices/DanielCompact.SpeechVoice" + }, + { + "value": 24, + "name": "Deranged.SpeechVoice", + "path": "Speech/Voices/Deranged.SpeechVoice" + }, + { + "value": 740, + "name": "EllenCompact.SpeechVoice", + "path": "Speech/Voices/EllenCompact.SpeechVoice" + }, + { + "value": 12, + "name": "Fred.SpeechVoice", + "path": "Speech/Voices/Fred.SpeechVoice" + }, + { + "value": 12, + "name": "GoodNews.SpeechVoice", + "path": "Speech/Voices/GoodNews.SpeechVoice" + }, + { + "value": 28, + "name": "Hysterical.SpeechVoice", + "path": "Speech/Voices/Hysterical.SpeechVoice" + }, + { + "value": 492, + "name": "IoanaCompact.SpeechVoice", + "path": "Speech/Voices/IoanaCompact.SpeechVoice" + }, + { + "value": 596, + "name": "JoanaCompact.SpeechVoice", + "path": "Speech/Voices/JoanaCompact.SpeechVoice" + }, + { + "value": 12, + "name": "Junior.SpeechVoice", + "path": "Speech/Voices/Junior.SpeechVoice" + }, + { + "value": 1336, + "name": "KanyaCompact.SpeechVoice", + "path": "Speech/Voices/KanyaCompact.SpeechVoice" + }, + { + "value": 1004, + "name": "KarenCompact.SpeechVoice", + "path": "Speech/Voices/KarenCompact.SpeechVoice" + }, + { + "value": 12, + "name": "Kathy.SpeechVoice", + "path": "Speech/Voices/Kathy.SpeechVoice" + }, + { + "value": 408836, + "name": "Kyoko.SpeechVoice", + "path": "Speech/Voices/Kyoko.SpeechVoice" + }, + { + "value": 2620, + "name": "KyokoCompact.SpeechVoice", + "path": "Speech/Voices/KyokoCompact.SpeechVoice" + }, + { + "value": 496, + "name": "LauraCompact.SpeechVoice", + "path": "Speech/Voices/LauraCompact.SpeechVoice" + }, + { + "value": 2104, + "name": "LekhaCompact.SpeechVoice", + "path": "Speech/Voices/LekhaCompact.SpeechVoice" + }, + { + "value": 548, + "name": "LucianaCompact.SpeechVoice", + "path": "Speech/Voices/LucianaCompact.SpeechVoice" + }, + { + "value": 504, + "name": "MariskaCompact.SpeechVoice", + "path": "Speech/Voices/MariskaCompact.SpeechVoice" + }, + { + "value": 2092, + "name": "Mei-JiaCompact.SpeechVoice", + "path": "Speech/Voices/Mei-JiaCompact.SpeechVoice" + }, + { + "value": 1020, + "name": "MelinaCompact.SpeechVoice", + "path": "Speech/Voices/MelinaCompact.SpeechVoice" + }, + { + "value": 2160, + "name": "MilenaCompact.SpeechVoice", + "path": "Speech/Voices/MilenaCompact.SpeechVoice" + }, + { + "value": 728, + "name": "MoiraCompact.SpeechVoice", + "path": "Speech/Voices/MoiraCompact.SpeechVoice" + }, + { + "value": 612, + "name": "MonicaCompact.SpeechVoice", + "path": "Speech/Voices/MonicaCompact.SpeechVoice" + }, + { + "value": 824, + "name": "NoraCompact.SpeechVoice", + "path": "Speech/Voices/NoraCompact.SpeechVoice" + }, + { + "value": 24, + "name": "Organ.SpeechVoice", + "path": "Speech/Voices/Organ.SpeechVoice" + }, + { + "value": 664, + "name": "PaulinaCompact.SpeechVoice", + "path": "Speech/Voices/PaulinaCompact.SpeechVoice" + }, + { + "value": 12, + "name": "Princess.SpeechVoice", + "path": "Speech/Voices/Princess.SpeechVoice" + }, + { + "value": 12, + "name": "Ralph.SpeechVoice", + "path": "Speech/Voices/Ralph.SpeechVoice" + }, + { + "value": 908, + "name": "SamanthaCompact.SpeechVoice", + "path": "Speech/Voices/SamanthaCompact.SpeechVoice" + }, + { + "value": 828, + "name": "SaraCompact.SpeechVoice", + "path": "Speech/Voices/SaraCompact.SpeechVoice" + }, + { + "value": 664, + "name": "SatuCompact.SpeechVoice", + "path": "Speech/Voices/SatuCompact.SpeechVoice" + }, + { + "value": 2336, + "name": "Sin-jiCompact.SpeechVoice", + "path": "Speech/Voices/Sin-jiCompact.SpeechVoice" + }, + { + "value": 2856, + "name": "TarikCompact.SpeechVoice", + "path": "Speech/Voices/TarikCompact.SpeechVoice" + }, + { + "value": 948, + "name": "TessaCompact.SpeechVoice", + "path": "Speech/Voices/TessaCompact.SpeechVoice" + }, + { + "value": 660, + "name": "ThomasCompact.SpeechVoice", + "path": "Speech/Voices/ThomasCompact.SpeechVoice" + }, + { + "value": 610156, + "name": "Ting-Ting.SpeechVoice", + "path": "Speech/Voices/Ting-Ting.SpeechVoice" + }, + { + "value": 1708, + "name": "Ting-TingCompact.SpeechVoice", + "path": "Speech/Voices/Ting-TingCompact.SpeechVoice" + }, + { + "value": 12, + "name": "Trinoids.SpeechVoice", + "path": "Speech/Voices/Trinoids.SpeechVoice" + }, + { + "value": 28632, + "name": "Vicki.SpeechVoice", + "path": "Speech/Voices/Vicki.SpeechVoice" + }, + { + "value": 1664, + "name": "Victoria.SpeechVoice", + "path": "Speech/Voices/Victoria.SpeechVoice" + }, + { + "value": 12, + "name": "Whisper.SpeechVoice", + "path": "Speech/Voices/Whisper.SpeechVoice" + }, + { + "value": 992, + "name": "XanderCompact.SpeechVoice", + "path": "Speech/Voices/XanderCompact.SpeechVoice" + }, + { + "value": 756, + "name": "YeldaCompact.SpeechVoice", + "path": "Speech/Voices/YeldaCompact.SpeechVoice" + }, + { + "value": 728, + "name": "YunaCompact.SpeechVoice", + "path": "Speech/Voices/YunaCompact.SpeechVoice" + }, + { + "value": 12, + "name": "Zarvox.SpeechVoice", + "path": "Speech/Voices/Zarvox.SpeechVoice" + }, + { + "value": 564, + "name": "ZosiaCompact.SpeechVoice", + "path": "Speech/Voices/ZosiaCompact.SpeechVoice" + }, + { + "value": 772, + "name": "ZuzanaCompact.SpeechVoice", + "path": "Speech/Voices/ZuzanaCompact.SpeechVoice" + } + ] + } + ] + }, + { + "value": 1060, + "name": "Spelling", + "path": "Spelling" + }, + { + "value": 412, + "name": "Spotlight", + "path": "Spotlight", + "children": [ + { + "value": 20, + "name": "Application.mdimporter", + "path": "Spotlight/Application.mdimporter", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Spotlight/Application.mdimporter/Contents" + } + ] + }, + { + "value": 12, + "name": "Archives.mdimporter", + "path": "Spotlight/Archives.mdimporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Spotlight/Archives.mdimporter/Contents" + } + ] + }, + { + "value": 20, + "name": "Audio.mdimporter", + "path": "Spotlight/Audio.mdimporter", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Spotlight/Audio.mdimporter/Contents" + } + ] + }, + { + "value": 12, + "name": "Automator.mdimporter", + "path": "Spotlight/Automator.mdimporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Spotlight/Automator.mdimporter/Contents" + } + ] + }, + { + "value": 12, + "name": "Bookmarks.mdimporter", + "path": "Spotlight/Bookmarks.mdimporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Spotlight/Bookmarks.mdimporter/Contents" + } + ] + }, + { + "value": 16, + "name": "Chat.mdimporter", + "path": "Spotlight/Chat.mdimporter", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "Spotlight/Chat.mdimporter/Contents" + } + ] + }, + { + "value": 28, + "name": "CoreMedia.mdimporter", + "path": "Spotlight/CoreMedia.mdimporter", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "Spotlight/CoreMedia.mdimporter/Contents" + } + ] + }, + { + "value": 32, + "name": "Font.mdimporter", + "path": "Spotlight/Font.mdimporter", + "children": [ + { + "value": 32, + "name": "Contents", + "path": "Spotlight/Font.mdimporter/Contents" + } + ] + }, + { + "value": 16, + "name": "iCal.mdimporter", + "path": "Spotlight/iCal.mdimporter", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "Spotlight/iCal.mdimporter/Contents" + } + ] + }, + { + "value": 28, + "name": "Image.mdimporter", + "path": "Spotlight/Image.mdimporter", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "Spotlight/Image.mdimporter/Contents" + } + ] + }, + { + "value": 72, + "name": "iPhoto.mdimporter", + "path": "Spotlight/iPhoto.mdimporter", + "children": [ + { + "value": 72, + "name": "Contents", + "path": "Spotlight/iPhoto.mdimporter/Contents" + } + ] + }, + { + "value": 16, + "name": "iPhoto8.mdimporter", + "path": "Spotlight/iPhoto8.mdimporter", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "Spotlight/iPhoto8.mdimporter/Contents" + } + ] + }, + { + "value": 12, + "name": "Mail.mdimporter", + "path": "Spotlight/Mail.mdimporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Spotlight/Mail.mdimporter/Contents" + } + ] + }, + { + "value": 12, + "name": "MIDI.mdimporter", + "path": "Spotlight/MIDI.mdimporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Spotlight/MIDI.mdimporter/Contents" + } + ] + }, + { + "value": 8, + "name": "Notes.mdimporter", + "path": "Spotlight/Notes.mdimporter", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "Spotlight/Notes.mdimporter/Contents" + } + ] + }, + { + "value": 16, + "name": "PDF.mdimporter", + "path": "Spotlight/PDF.mdimporter", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "Spotlight/PDF.mdimporter/Contents" + } + ] + }, + { + "value": 12, + "name": "PS.mdimporter", + "path": "Spotlight/PS.mdimporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Spotlight/PS.mdimporter/Contents" + } + ] + }, + { + "value": 12, + "name": "QuartzComposer.mdimporter", + "path": "Spotlight/QuartzComposer.mdimporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "Spotlight/QuartzComposer.mdimporter/Contents" + } + ] + }, + { + "value": 20, + "name": "RichText.mdimporter", + "path": "Spotlight/RichText.mdimporter", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Spotlight/RichText.mdimporter/Contents" + } + ] + }, + { + "value": 16, + "name": "SystemPrefs.mdimporter", + "path": "Spotlight/SystemPrefs.mdimporter", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "Spotlight/SystemPrefs.mdimporter/Contents" + } + ] + }, + { + "value": 20, + "name": "vCard.mdimporter", + "path": "Spotlight/vCard.mdimporter", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "Spotlight/vCard.mdimporter/Contents" + } + ] + } + ] + }, + { + "value": 0, + "name": "StartupItems", + "path": "StartupItems" + }, + { + "value": 168, + "name": "SyncServices", + "path": "SyncServices", + "children": [ + { + "value": 0, + "name": "AutoRegistration", + "path": "SyncServices/AutoRegistration", + "children": [ + { + "value": 0, + "name": "Clients", + "path": "SyncServices/AutoRegistration/Clients" + }, + { + "value": 0, + "name": "Schemas", + "path": "SyncServices/AutoRegistration/Schemas" + } + ] + }, + { + "value": 168, + "name": "Schemas", + "path": "SyncServices/Schemas", + "children": [ + { + "value": 24, + "name": "Bookmarks.syncschema", + "path": "SyncServices/Schemas/Bookmarks.syncschema" + }, + { + "value": 68, + "name": "Calendars.syncschema", + "path": "SyncServices/Schemas/Calendars.syncschema" + }, + { + "value": 48, + "name": "Contacts.syncschema", + "path": "SyncServices/Schemas/Contacts.syncschema" + }, + { + "value": 16, + "name": "Notes.syncschema", + "path": "SyncServices/Schemas/Notes.syncschema" + }, + { + "value": 12, + "name": "Palm.syncschema", + "path": "SyncServices/Schemas/Palm.syncschema" + } + ] + } + ] + }, + { + "value": 3156, + "name": "SystemConfiguration", + "path": "SystemConfiguration", + "children": [ + { + "value": 8, + "name": "ApplicationFirewallStartup.bundle", + "path": "SystemConfiguration/ApplicationFirewallStartup.bundle", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "SystemConfiguration/ApplicationFirewallStartup.bundle/Contents" + } + ] + }, + { + "value": 116, + "name": "EAPOLController.bundle", + "path": "SystemConfiguration/EAPOLController.bundle", + "children": [ + { + "value": 116, + "name": "Contents", + "path": "SystemConfiguration/EAPOLController.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "InterfaceNamer.bundle", + "path": "SystemConfiguration/InterfaceNamer.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "SystemConfiguration/InterfaceNamer.bundle/Contents" + } + ] + }, + { + "value": 132, + "name": "IPConfiguration.bundle", + "path": "SystemConfiguration/IPConfiguration.bundle", + "children": [ + { + "value": 132, + "name": "Contents", + "path": "SystemConfiguration/IPConfiguration.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "IPMonitor.bundle", + "path": "SystemConfiguration/IPMonitor.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "SystemConfiguration/IPMonitor.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "KernelEventMonitor.bundle", + "path": "SystemConfiguration/KernelEventMonitor.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "SystemConfiguration/KernelEventMonitor.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "LinkConfiguration.bundle", + "path": "SystemConfiguration/LinkConfiguration.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "SystemConfiguration/LinkConfiguration.bundle/Contents" + } + ] + }, + { + "value": 20, + "name": "Logger.bundle", + "path": "SystemConfiguration/Logger.bundle", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "SystemConfiguration/Logger.bundle/Contents" + } + ] + }, + { + "value": 2804, + "name": "PPPController.bundle", + "path": "SystemConfiguration/PPPController.bundle", + "children": [ + { + "value": 2804, + "name": "Contents", + "path": "SystemConfiguration/PPPController.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "PreferencesMonitor.bundle", + "path": "SystemConfiguration/PreferencesMonitor.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "SystemConfiguration/PreferencesMonitor.bundle/Contents" + } + ] + }, + { + "value": 76, + "name": "PrinterNotifications.bundle", + "path": "SystemConfiguration/PrinterNotifications.bundle", + "children": [ + { + "value": 76, + "name": "Contents", + "path": "SystemConfiguration/PrinterNotifications.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "SCNetworkReachability.bundle", + "path": "SystemConfiguration/SCNetworkReachability.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "SystemConfiguration/SCNetworkReachability.bundle/Contents" + } + ] + } + ] + }, + { + "value": 1520, + "name": "SystemProfiler", + "path": "SystemProfiler", + "children": [ + { + "value": 84, + "name": "SPAirPortReporter.spreporter", + "path": "SystemProfiler/SPAirPortReporter.spreporter", + "children": [ + { + "value": 84, + "name": "Contents", + "path": "SystemProfiler/SPAirPortReporter.spreporter/Contents" + } + ] + }, + { + "value": 8, + "name": "SPApplicationsReporter.spreporter", + "path": "SystemProfiler/SPApplicationsReporter.spreporter", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "SystemProfiler/SPApplicationsReporter.spreporter/Contents" + } + ] + }, + { + "value": 28, + "name": "SPAudioReporter.spreporter", + "path": "SystemProfiler/SPAudioReporter.spreporter", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "SystemProfiler/SPAudioReporter.spreporter/Contents" + } + ] + }, + { + "value": 16, + "name": "SPBluetoothReporter.spreporter", + "path": "SystemProfiler/SPBluetoothReporter.spreporter", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "SystemProfiler/SPBluetoothReporter.spreporter/Contents" + } + ] + }, + { + "value": 8, + "name": "SPCameraReporter.spreporter", + "path": "SystemProfiler/SPCameraReporter.spreporter", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "SystemProfiler/SPCameraReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPCardReaderReporter.spreporter", + "path": "SystemProfiler/SPCardReaderReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPCardReaderReporter.spreporter/Contents" + } + ] + }, + { + "value": 28, + "name": "SPComponentReporter.spreporter", + "path": "SystemProfiler/SPComponentReporter.spreporter", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "SystemProfiler/SPComponentReporter.spreporter/Contents" + } + ] + }, + { + "value": 28, + "name": "SPConfigurationProfileReporter.spreporter", + "path": "SystemProfiler/SPConfigurationProfileReporter.spreporter", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "SystemProfiler/SPConfigurationProfileReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPDeveloperToolsReporter.spreporter", + "path": "SystemProfiler/SPDeveloperToolsReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPDeveloperToolsReporter.spreporter/Contents" + } + ] + }, + { + "value": 16, + "name": "SPDiagnosticsReporter.spreporter", + "path": "SystemProfiler/SPDiagnosticsReporter.spreporter", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "SystemProfiler/SPDiagnosticsReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPDisabledApplicationsReporter.spreporter", + "path": "SystemProfiler/SPDisabledApplicationsReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPDisabledApplicationsReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPDiscBurningReporter.spreporter", + "path": "SystemProfiler/SPDiscBurningReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPDiscBurningReporter.spreporter/Contents" + } + ] + }, + { + "value": 284, + "name": "SPDisplaysReporter.spreporter", + "path": "SystemProfiler/SPDisplaysReporter.spreporter", + "children": [ + { + "value": 284, + "name": "Contents", + "path": "SystemProfiler/SPDisplaysReporter.spreporter/Contents" + } + ] + }, + { + "value": 16, + "name": "SPEthernetReporter.spreporter", + "path": "SystemProfiler/SPEthernetReporter.spreporter", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "SystemProfiler/SPEthernetReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPExtensionsReporter.spreporter", + "path": "SystemProfiler/SPExtensionsReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPExtensionsReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPFibreChannelReporter.spreporter", + "path": "SystemProfiler/SPFibreChannelReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPFibreChannelReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPFirewallReporter.spreporter", + "path": "SystemProfiler/SPFirewallReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPFirewallReporter.spreporter/Contents" + } + ] + }, + { + "value": 16, + "name": "SPFireWireReporter.spreporter", + "path": "SystemProfiler/SPFireWireReporter.spreporter", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "SystemProfiler/SPFireWireReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPFontReporter.spreporter", + "path": "SystemProfiler/SPFontReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPFontReporter.spreporter/Contents" + } + ] + }, + { + "value": 8, + "name": "SPFrameworksReporter.spreporter", + "path": "SystemProfiler/SPFrameworksReporter.spreporter", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "SystemProfiler/SPFrameworksReporter.spreporter/Contents" + } + ] + }, + { + "value": 16, + "name": "SPHardwareRAIDReporter.spreporter", + "path": "SystemProfiler/SPHardwareRAIDReporter.spreporter", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "SystemProfiler/SPHardwareRAIDReporter.spreporter/Contents" + } + ] + }, + { + "value": 8, + "name": "SPInstallHistoryReporter.spreporter", + "path": "SystemProfiler/SPInstallHistoryReporter.spreporter", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "SystemProfiler/SPInstallHistoryReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPLogsReporter.spreporter", + "path": "SystemProfiler/SPLogsReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPLogsReporter.spreporter/Contents" + } + ] + }, + { + "value": 16, + "name": "SPManagedClientReporter.spreporter", + "path": "SystemProfiler/SPManagedClientReporter.spreporter", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "SystemProfiler/SPManagedClientReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPMemoryReporter.spreporter", + "path": "SystemProfiler/SPMemoryReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPMemoryReporter.spreporter/Contents" + } + ] + }, + { + "value": 264, + "name": "SPNetworkLocationReporter.spreporter", + "path": "SystemProfiler/SPNetworkLocationReporter.spreporter", + "children": [ + { + "value": 264, + "name": "Contents", + "path": "SystemProfiler/SPNetworkLocationReporter.spreporter/Contents" + } + ] + }, + { + "value": 268, + "name": "SPNetworkReporter.spreporter", + "path": "SystemProfiler/SPNetworkReporter.spreporter", + "children": [ + { + "value": 268, + "name": "Contents", + "path": "SystemProfiler/SPNetworkReporter.spreporter/Contents" + } + ] + }, + { + "value": 8, + "name": "SPNetworkVolumeReporter.spreporter", + "path": "SystemProfiler/SPNetworkVolumeReporter.spreporter", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "SystemProfiler/SPNetworkVolumeReporter.spreporter/Contents" + } + ] + }, + { + "value": 8, + "name": "SPOSReporter.spreporter", + "path": "SystemProfiler/SPOSReporter.spreporter", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "SystemProfiler/SPOSReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPParallelATAReporter.spreporter", + "path": "SystemProfiler/SPParallelATAReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPParallelATAReporter.spreporter/Contents" + } + ] + }, + { + "value": 16, + "name": "SPParallelSCSIReporter.spreporter", + "path": "SystemProfiler/SPParallelSCSIReporter.spreporter", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "SystemProfiler/SPParallelSCSIReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPPCIReporter.spreporter", + "path": "SystemProfiler/SPPCIReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPPCIReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPPlatformReporter.spreporter", + "path": "SystemProfiler/SPPlatformReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPPlatformReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPPowerReporter.spreporter", + "path": "SystemProfiler/SPPowerReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPPowerReporter.spreporter/Contents" + } + ] + }, + { + "value": 8, + "name": "SPPrefPaneReporter.spreporter", + "path": "SystemProfiler/SPPrefPaneReporter.spreporter", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "SystemProfiler/SPPrefPaneReporter.spreporter/Contents" + } + ] + }, + { + "value": 16, + "name": "SPPrintersReporter.spreporter", + "path": "SystemProfiler/SPPrintersReporter.spreporter", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "SystemProfiler/SPPrintersReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPPrintersSoftwareReporter.spreporter", + "path": "SystemProfiler/SPPrintersSoftwareReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPPrintersSoftwareReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPSASReporter.spreporter", + "path": "SystemProfiler/SPSASReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPSASReporter.spreporter/Contents" + } + ] + }, + { + "value": 16, + "name": "SPSerialATAReporter.spreporter", + "path": "SystemProfiler/SPSerialATAReporter.spreporter", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "SystemProfiler/SPSerialATAReporter.spreporter/Contents" + } + ] + }, + { + "value": 8, + "name": "SPSPIReporter.spreporter", + "path": "SystemProfiler/SPSPIReporter.spreporter", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "SystemProfiler/SPSPIReporter.spreporter/Contents" + } + ] + }, + { + "value": 8, + "name": "SPStartupItemReporter.spreporter", + "path": "SystemProfiler/SPStartupItemReporter.spreporter", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "SystemProfiler/SPStartupItemReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPStorageReporter.spreporter", + "path": "SystemProfiler/SPStorageReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPStorageReporter.spreporter/Contents" + } + ] + }, + { + "value": 12, + "name": "SPSyncReporter.spreporter", + "path": "SystemProfiler/SPSyncReporter.spreporter", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "SystemProfiler/SPSyncReporter.spreporter/Contents" + } + ] + }, + { + "value": 28, + "name": "SPThunderboltReporter.spreporter", + "path": "SystemProfiler/SPThunderboltReporter.spreporter", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "SystemProfiler/SPThunderboltReporter.spreporter/Contents" + } + ] + }, + { + "value": 8, + "name": "SPUniversalAccessReporter.spreporter", + "path": "SystemProfiler/SPUniversalAccessReporter.spreporter", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "SystemProfiler/SPUniversalAccessReporter.spreporter/Contents" + } + ] + }, + { + "value": 40, + "name": "SPUSBReporter.spreporter", + "path": "SystemProfiler/SPUSBReporter.spreporter", + "children": [ + { + "value": 40, + "name": "Contents", + "path": "SystemProfiler/SPUSBReporter.spreporter/Contents" + } + ] + }, + { + "value": 28, + "name": "SPWWANReporter.spreporter", + "path": "SystemProfiler/SPWWANReporter.spreporter", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "SystemProfiler/SPWWANReporter.spreporter/Contents" + } + ] + } + ] + }, + { + "value": 9608, + "name": "Tcl", + "path": "Tcl", + "children": [ + { + "value": 3568, + "name": "8.4", + "path": "Tcl/8.4", + "children": [ + { + "value": 156, + "name": "expect5.45", + "path": "Tcl/8.4/expect5.45" + }, + { + "value": 28, + "name": "Ffidl0.6.1", + "path": "Tcl/8.4/Ffidl0.6.1" + }, + { + "value": 784, + "name": "Img1.4", + "path": "Tcl/8.4/Img1.4" + }, + { + "value": 88, + "name": "itcl3.4", + "path": "Tcl/8.4/itcl3.4" + }, + { + "value": 24, + "name": "itk3.4", + "path": "Tcl/8.4/itk3.4" + }, + { + "value": 28, + "name": "Memchan2.2.1", + "path": "Tcl/8.4/Memchan2.2.1" + }, + { + "value": 228, + "name": "Mk4tcl2.4.9.7", + "path": "Tcl/8.4/Mk4tcl2.4.9.7" + }, + { + "value": 96, + "name": "QuickTimeTcl3.2", + "path": "Tcl/8.4/QuickTimeTcl3.2" + }, + { + "value": 196, + "name": "snack2.2", + "path": "Tcl/8.4/snack2.2" + }, + { + "value": 24, + "name": "tbcload1.7", + "path": "Tcl/8.4/tbcload1.7" + }, + { + "value": 76, + "name": "tclAE2.0.5", + "path": "Tcl/8.4/tclAE2.0.5" + }, + { + "value": 20, + "name": "Tclapplescript1.0", + "path": "Tcl/8.4/Tclapplescript1.0" + }, + { + "value": 56, + "name": "Tcldom2.6", + "path": "Tcl/8.4/Tcldom2.6" + }, + { + "value": 56, + "name": "tcldomxml2.6", + "path": "Tcl/8.4/tcldomxml2.6" + }, + { + "value": 108, + "name": "Tclexpat2.6", + "path": "Tcl/8.4/Tclexpat2.6" + }, + { + "value": 16, + "name": "Tclresource1.1.2", + "path": "Tcl/8.4/Tclresource1.1.2" + }, + { + "value": 288, + "name": "tclx8.4", + "path": "Tcl/8.4/tclx8.4" + }, + { + "value": 60, + "name": "Tclxml2.6", + "path": "Tcl/8.4/Tclxml2.6" + }, + { + "value": 20, + "name": "Tclxslt2.6", + "path": "Tcl/8.4/Tclxslt2.6" + }, + { + "value": 396, + "name": "tdom0.8.3", + "path": "Tcl/8.4/tdom0.8.3" + }, + { + "value": 80, + "name": "thread2.6.6", + "path": "Tcl/8.4/thread2.6.6" + }, + { + "value": 68, + "name": "Tktable2.10", + "path": "Tcl/8.4/Tktable2.10" + }, + { + "value": 36, + "name": "tls1.6.1", + "path": "Tcl/8.4/tls1.6.1" + }, + { + "value": 32, + "name": "tnc0.3.0", + "path": "Tcl/8.4/tnc0.3.0" + }, + { + "value": 180, + "name": "treectrl2.2.10", + "path": "Tcl/8.4/treectrl2.2.10" + }, + { + "value": 120, + "name": "Trf2.1.4", + "path": "Tcl/8.4/Trf2.1.4" + }, + { + "value": 108, + "name": "vfs1.4.1", + "path": "Tcl/8.4/vfs1.4.1" + }, + { + "value": 196, + "name": "xotcl1.6.6", + "path": "Tcl/8.4/xotcl1.6.6" + } + ] + }, + { + "value": 3384, + "name": "8.5", + "path": "Tcl/8.5", + "children": [ + { + "value": 156, + "name": "expect5.45", + "path": "Tcl/8.5/expect5.45" + }, + { + "value": 32, + "name": "Ffidl0.6.1", + "path": "Tcl/8.5/Ffidl0.6.1" + }, + { + "value": 972, + "name": "Img1.4", + "path": "Tcl/8.5/Img1.4" + }, + { + "value": 88, + "name": "itcl3.4", + "path": "Tcl/8.5/itcl3.4" + }, + { + "value": 44, + "name": "itk3.4", + "path": "Tcl/8.5/itk3.4" + }, + { + "value": 32, + "name": "Memchan2.2.1", + "path": "Tcl/8.5/Memchan2.2.1" + }, + { + "value": 228, + "name": "Mk4tcl2.4.9.7", + "path": "Tcl/8.5/Mk4tcl2.4.9.7" + }, + { + "value": 24, + "name": "tbcload1.7", + "path": "Tcl/8.5/tbcload1.7" + }, + { + "value": 76, + "name": "tclAE2.0.5", + "path": "Tcl/8.5/tclAE2.0.5" + }, + { + "value": 56, + "name": "Tcldom2.6", + "path": "Tcl/8.5/Tcldom2.6" + }, + { + "value": 56, + "name": "tcldomxml2.6", + "path": "Tcl/8.5/tcldomxml2.6" + }, + { + "value": 108, + "name": "Tclexpat2.6", + "path": "Tcl/8.5/Tclexpat2.6" + }, + { + "value": 336, + "name": "tclx8.4", + "path": "Tcl/8.5/tclx8.4" + }, + { + "value": 60, + "name": "Tclxml2.6", + "path": "Tcl/8.5/Tclxml2.6" + }, + { + "value": 20, + "name": "Tclxslt2.6", + "path": "Tcl/8.5/Tclxslt2.6" + }, + { + "value": 400, + "name": "tdom0.8.3", + "path": "Tcl/8.5/tdom0.8.3" + }, + { + "value": 80, + "name": "thread2.6.6", + "path": "Tcl/8.5/thread2.6.6" + }, + { + "value": 124, + "name": "Tktable2.10", + "path": "Tcl/8.5/Tktable2.10" + }, + { + "value": 36, + "name": "tls1.6.1", + "path": "Tcl/8.5/tls1.6.1" + }, + { + "value": 32, + "name": "tnc0.3.0", + "path": "Tcl/8.5/tnc0.3.0" + }, + { + "value": 120, + "name": "Trf2.1.4", + "path": "Tcl/8.5/Trf2.1.4" + }, + { + "value": 108, + "name": "vfs1.4.1", + "path": "Tcl/8.5/vfs1.4.1" + }, + { + "value": 196, + "name": "xotcl1.6.6", + "path": "Tcl/8.5/xotcl1.6.6" + } + ] + }, + { + "value": 80, + "name": "bin", + "path": "Tcl/bin" + }, + { + "value": 224, + "name": "bwidget1.9.1", + "path": "Tcl/bwidget1.9.1", + "children": [ + { + "value": 100, + "name": "images", + "path": "Tcl/bwidget1.9.1/images" + }, + { + "value": 0, + "name": "lang", + "path": "Tcl/bwidget1.9.1/lang" + } + ] + }, + { + "value": 324, + "name": "iwidgets4.0.2", + "path": "Tcl/iwidgets4.0.2", + "children": [ + { + "value": 324, + "name": "scripts", + "path": "Tcl/iwidgets4.0.2/scripts" + } + ] + }, + { + "value": 40, + "name": "sqlite3", + "path": "Tcl/sqlite3" + }, + { + "value": 1456, + "name": "tcllib1.12", + "path": "Tcl/tcllib1.12", + "children": [ + { + "value": 8, + "name": "aes", + "path": "Tcl/tcllib1.12/aes" + }, + { + "value": 16, + "name": "amazon-s3", + "path": "Tcl/tcllib1.12/amazon-s3" + }, + { + "value": 12, + "name": "asn", + "path": "Tcl/tcllib1.12/asn" + }, + { + "value": 0, + "name": "base32", + "path": "Tcl/tcllib1.12/base32" + }, + { + "value": 0, + "name": "base64", + "path": "Tcl/tcllib1.12/base64" + }, + { + "value": 8, + "name": "bee", + "path": "Tcl/tcllib1.12/bee" + }, + { + "value": 16, + "name": "bench", + "path": "Tcl/tcllib1.12/bench" + }, + { + "value": 8, + "name": "bibtex", + "path": "Tcl/tcllib1.12/bibtex" + }, + { + "value": 12, + "name": "blowfish", + "path": "Tcl/tcllib1.12/blowfish" + }, + { + "value": 0, + "name": "cache", + "path": "Tcl/tcllib1.12/cache" + }, + { + "value": 8, + "name": "cmdline", + "path": "Tcl/tcllib1.12/cmdline" + }, + { + "value": 16, + "name": "comm", + "path": "Tcl/tcllib1.12/comm" + }, + { + "value": 0, + "name": "control", + "path": "Tcl/tcllib1.12/control" + }, + { + "value": 0, + "name": "coroutine", + "path": "Tcl/tcllib1.12/coroutine" + }, + { + "value": 12, + "name": "counter", + "path": "Tcl/tcllib1.12/counter" + }, + { + "value": 8, + "name": "crc", + "path": "Tcl/tcllib1.12/crc" + }, + { + "value": 8, + "name": "csv", + "path": "Tcl/tcllib1.12/csv" + }, + { + "value": 24, + "name": "des", + "path": "Tcl/tcllib1.12/des" + }, + { + "value": 36, + "name": "dns", + "path": "Tcl/tcllib1.12/dns" + }, + { + "value": 0, + "name": "docstrip", + "path": "Tcl/tcllib1.12/docstrip" + }, + { + "value": 44, + "name": "doctools", + "path": "Tcl/tcllib1.12/doctools" + }, + { + "value": 8, + "name": "doctools2base", + "path": "Tcl/tcllib1.12/doctools2base" + }, + { + "value": 12, + "name": "doctools2idx", + "path": "Tcl/tcllib1.12/doctools2idx" + }, + { + "value": 12, + "name": "doctools2toc", + "path": "Tcl/tcllib1.12/doctools2toc" + }, + { + "value": 36, + "name": "fileutil", + "path": "Tcl/tcllib1.12/fileutil" + }, + { + "value": 16, + "name": "ftp", + "path": "Tcl/tcllib1.12/ftp" + }, + { + "value": 16, + "name": "ftpd", + "path": "Tcl/tcllib1.12/ftpd" + }, + { + "value": 84, + "name": "fumagic", + "path": "Tcl/tcllib1.12/fumagic" + }, + { + "value": 0, + "name": "gpx", + "path": "Tcl/tcllib1.12/gpx" + }, + { + "value": 20, + "name": "grammar_fa", + "path": "Tcl/tcllib1.12/grammar_fa" + }, + { + "value": 8, + "name": "grammar_me", + "path": "Tcl/tcllib1.12/grammar_me" + }, + { + "value": 8, + "name": "grammar_peg", + "path": "Tcl/tcllib1.12/grammar_peg" + }, + { + "value": 12, + "name": "html", + "path": "Tcl/tcllib1.12/html" + }, + { + "value": 12, + "name": "htmlparse", + "path": "Tcl/tcllib1.12/htmlparse" + }, + { + "value": 8, + "name": "http", + "path": "Tcl/tcllib1.12/http" + }, + { + "value": 0, + "name": "ident", + "path": "Tcl/tcllib1.12/ident" + }, + { + "value": 12, + "name": "imap4", + "path": "Tcl/tcllib1.12/imap4" + }, + { + "value": 0, + "name": "inifile", + "path": "Tcl/tcllib1.12/inifile" + }, + { + "value": 0, + "name": "interp", + "path": "Tcl/tcllib1.12/interp" + }, + { + "value": 0, + "name": "irc", + "path": "Tcl/tcllib1.12/irc" + }, + { + "value": 0, + "name": "javascript", + "path": "Tcl/tcllib1.12/javascript" + }, + { + "value": 12, + "name": "jpeg", + "path": "Tcl/tcllib1.12/jpeg" + }, + { + "value": 0, + "name": "json", + "path": "Tcl/tcllib1.12/json" + }, + { + "value": 28, + "name": "ldap", + "path": "Tcl/tcllib1.12/ldap" + }, + { + "value": 20, + "name": "log", + "path": "Tcl/tcllib1.12/log" + }, + { + "value": 0, + "name": "map", + "path": "Tcl/tcllib1.12/map" + }, + { + "value": 12, + "name": "mapproj", + "path": "Tcl/tcllib1.12/mapproj" + }, + { + "value": 140, + "name": "math", + "path": "Tcl/tcllib1.12/math" + }, + { + "value": 8, + "name": "md4", + "path": "Tcl/tcllib1.12/md4" + }, + { + "value": 16, + "name": "md5", + "path": "Tcl/tcllib1.12/md5" + }, + { + "value": 0, + "name": "md5crypt", + "path": "Tcl/tcllib1.12/md5crypt" + }, + { + "value": 36, + "name": "mime", + "path": "Tcl/tcllib1.12/mime" + }, + { + "value": 0, + "name": "multiplexer", + "path": "Tcl/tcllib1.12/multiplexer" + }, + { + "value": 0, + "name": "namespacex", + "path": "Tcl/tcllib1.12/namespacex" + }, + { + "value": 12, + "name": "ncgi", + "path": "Tcl/tcllib1.12/ncgi" + }, + { + "value": 0, + "name": "nmea", + "path": "Tcl/tcllib1.12/nmea" + }, + { + "value": 8, + "name": "nns", + "path": "Tcl/tcllib1.12/nns" + }, + { + "value": 8, + "name": "nntp", + "path": "Tcl/tcllib1.12/nntp" + }, + { + "value": 0, + "name": "ntp", + "path": "Tcl/tcllib1.12/ntp" + }, + { + "value": 8, + "name": "otp", + "path": "Tcl/tcllib1.12/otp" + }, + { + "value": 48, + "name": "page", + "path": "Tcl/tcllib1.12/page" + }, + { + "value": 0, + "name": "pluginmgr", + "path": "Tcl/tcllib1.12/pluginmgr" + }, + { + "value": 0, + "name": "png", + "path": "Tcl/tcllib1.12/png" + }, + { + "value": 8, + "name": "pop3", + "path": "Tcl/tcllib1.12/pop3" + }, + { + "value": 8, + "name": "pop3d", + "path": "Tcl/tcllib1.12/pop3d" + }, + { + "value": 8, + "name": "profiler", + "path": "Tcl/tcllib1.12/profiler" + }, + { + "value": 72, + "name": "pt", + "path": "Tcl/tcllib1.12/pt" + }, + { + "value": 0, + "name": "rc4", + "path": "Tcl/tcllib1.12/rc4" + }, + { + "value": 0, + "name": "rcs", + "path": "Tcl/tcllib1.12/rcs" + }, + { + "value": 12, + "name": "report", + "path": "Tcl/tcllib1.12/report" + }, + { + "value": 8, + "name": "rest", + "path": "Tcl/tcllib1.12/rest" + }, + { + "value": 16, + "name": "ripemd", + "path": "Tcl/tcllib1.12/ripemd" + }, + { + "value": 8, + "name": "sasl", + "path": "Tcl/tcllib1.12/sasl" + }, + { + "value": 24, + "name": "sha1", + "path": "Tcl/tcllib1.12/sha1" + }, + { + "value": 0, + "name": "simulation", + "path": "Tcl/tcllib1.12/simulation" + }, + { + "value": 8, + "name": "smtpd", + "path": "Tcl/tcllib1.12/smtpd" + }, + { + "value": 84, + "name": "snit", + "path": "Tcl/tcllib1.12/snit" + }, + { + "value": 0, + "name": "soundex", + "path": "Tcl/tcllib1.12/soundex" + }, + { + "value": 12, + "name": "stooop", + "path": "Tcl/tcllib1.12/stooop" + }, + { + "value": 48, + "name": "stringprep", + "path": "Tcl/tcllib1.12/stringprep" + }, + { + "value": 156, + "name": "struct", + "path": "Tcl/tcllib1.12/struct" + }, + { + "value": 0, + "name": "tar", + "path": "Tcl/tcllib1.12/tar" + }, + { + "value": 24, + "name": "tepam", + "path": "Tcl/tcllib1.12/tepam" + }, + { + "value": 0, + "name": "term", + "path": "Tcl/tcllib1.12/term" + }, + { + "value": 52, + "name": "textutil", + "path": "Tcl/tcllib1.12/textutil" + }, + { + "value": 0, + "name": "tie", + "path": "Tcl/tcllib1.12/tie" + }, + { + "value": 8, + "name": "tiff", + "path": "Tcl/tcllib1.12/tiff" + }, + { + "value": 0, + "name": "transfer", + "path": "Tcl/tcllib1.12/transfer" + }, + { + "value": 0, + "name": "treeql", + "path": "Tcl/tcllib1.12/treeql" + }, + { + "value": 0, + "name": "uev", + "path": "Tcl/tcllib1.12/uev" + }, + { + "value": 8, + "name": "units", + "path": "Tcl/tcllib1.12/units" + }, + { + "value": 8, + "name": "uri", + "path": "Tcl/tcllib1.12/uri" + }, + { + "value": 0, + "name": "uuid", + "path": "Tcl/tcllib1.12/uuid" + }, + { + "value": 0, + "name": "virtchannel_base", + "path": "Tcl/tcllib1.12/virtchannel_base" + }, + { + "value": 0, + "name": "virtchannel_core", + "path": "Tcl/tcllib1.12/virtchannel_core" + }, + { + "value": 0, + "name": "virtchannel_transform", + "path": "Tcl/tcllib1.12/virtchannel_transform" + }, + { + "value": 16, + "name": "wip", + "path": "Tcl/tcllib1.12/wip" + }, + { + "value": 12, + "name": "yaml", + "path": "Tcl/tcllib1.12/yaml" + } + ] + }, + { + "value": 60, + "name": "tclsoap1.6.8", + "path": "Tcl/tclsoap1.6.8", + "children": [ + { + "value": 0, + "name": "interop", + "path": "Tcl/tclsoap1.6.8/interop" + } + ] + }, + { + "value": 56, + "name": "tkcon2.6", + "path": "Tcl/tkcon2.6" + }, + { + "value": 412, + "name": "tklib0.5", + "path": "Tcl/tklib0.5", + "children": [ + { + "value": 0, + "name": "autoscroll", + "path": "Tcl/tklib0.5/autoscroll" + }, + { + "value": 8, + "name": "canvas", + "path": "Tcl/tklib0.5/canvas" + }, + { + "value": 8, + "name": "chatwidget", + "path": "Tcl/tklib0.5/chatwidget" + }, + { + "value": 28, + "name": "controlwidget", + "path": "Tcl/tklib0.5/controlwidget" + }, + { + "value": 0, + "name": "crosshair", + "path": "Tcl/tklib0.5/crosshair" + }, + { + "value": 8, + "name": "ctext", + "path": "Tcl/tklib0.5/ctext" + }, + { + "value": 0, + "name": "cursor", + "path": "Tcl/tklib0.5/cursor" + }, + { + "value": 0, + "name": "datefield", + "path": "Tcl/tklib0.5/datefield" + }, + { + "value": 24, + "name": "diagrams", + "path": "Tcl/tklib0.5/diagrams" + }, + { + "value": 0, + "name": "getstring", + "path": "Tcl/tklib0.5/getstring" + }, + { + "value": 0, + "name": "history", + "path": "Tcl/tklib0.5/history" + }, + { + "value": 24, + "name": "ico", + "path": "Tcl/tklib0.5/ico" + }, + { + "value": 8, + "name": "ipentry", + "path": "Tcl/tklib0.5/ipentry" + }, + { + "value": 16, + "name": "khim", + "path": "Tcl/tklib0.5/khim" + }, + { + "value": 20, + "name": "menubar", + "path": "Tcl/tklib0.5/menubar" + }, + { + "value": 16, + "name": "ntext", + "path": "Tcl/tklib0.5/ntext" + }, + { + "value": 48, + "name": "plotchart", + "path": "Tcl/tklib0.5/plotchart" + }, + { + "value": 8, + "name": "style", + "path": "Tcl/tklib0.5/style" + }, + { + "value": 0, + "name": "swaplist", + "path": "Tcl/tklib0.5/swaplist" + }, + { + "value": 148, + "name": "tablelist", + "path": "Tcl/tklib0.5/tablelist" + }, + { + "value": 8, + "name": "tkpiechart", + "path": "Tcl/tklib0.5/tkpiechart" + }, + { + "value": 8, + "name": "tooltip", + "path": "Tcl/tklib0.5/tooltip" + }, + { + "value": 32, + "name": "widget", + "path": "Tcl/tklib0.5/widget" + } + ] + } + ] + }, + { + "value": 80, + "name": "TextEncodings", + "path": "TextEncodings", + "children": [ + { + "value": 0, + "name": "ArabicEncodings.bundle", + "path": "TextEncodings/ArabicEncodings.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "TextEncodings/ArabicEncodings.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "CentralEuropean Encodings.bundle", + "path": "TextEncodings/CentralEuropean Encodings.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "TextEncodings/CentralEuropean Encodings.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "ChineseEncodings Supplement.bundle", + "path": "TextEncodings/ChineseEncodings Supplement.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "TextEncodings/ChineseEncodings Supplement.bundle/Contents" + } + ] + }, + { + "value": 28, + "name": "ChineseEncodings.bundle", + "path": "TextEncodings/ChineseEncodings.bundle", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "TextEncodings/ChineseEncodings.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "CoreEncodings.bundle", + "path": "TextEncodings/CoreEncodings.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "TextEncodings/CoreEncodings.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "CyrillicEncodings.bundle", + "path": "TextEncodings/CyrillicEncodings.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "TextEncodings/CyrillicEncodings.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "GreekEncodings.bundle", + "path": "TextEncodings/GreekEncodings.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "TextEncodings/GreekEncodings.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "HebrewEncodings.bundle", + "path": "TextEncodings/HebrewEncodings.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "TextEncodings/HebrewEncodings.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "IndicEncodings.bundle", + "path": "TextEncodings/IndicEncodings.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "TextEncodings/IndicEncodings.bundle/Contents" + } + ] + }, + { + "value": 20, + "name": "JapaneseEncodings.bundle", + "path": "TextEncodings/JapaneseEncodings.bundle", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "TextEncodings/JapaneseEncodings.bundle/Contents" + } + ] + }, + { + "value": 16, + "name": "KoreanEncodings.bundle", + "path": "TextEncodings/KoreanEncodings.bundle", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "TextEncodings/KoreanEncodings.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "SymbolEncodings.bundle", + "path": "TextEncodings/SymbolEncodings.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "TextEncodings/SymbolEncodings.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "ThaiEncodings.bundle", + "path": "TextEncodings/ThaiEncodings.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "TextEncodings/ThaiEncodings.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "TurkishEncodings.bundle", + "path": "TextEncodings/TurkishEncodings.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "TextEncodings/TurkishEncodings.bundle/Contents" + } + ] + }, + { + "value": 16, + "name": "UnicodeEncodings.bundle", + "path": "TextEncodings/UnicodeEncodings.bundle", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "TextEncodings/UnicodeEncodings.bundle/Contents" + } + ] + }, + { + "value": 0, + "name": "WesternLanguage Encodings.bundle", + "path": "TextEncodings/WesternLanguage Encodings.bundle", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "TextEncodings/WesternLanguage Encodings.bundle/Contents" + } + ] + } + ] + }, + { + "value": 600, + "name": "UserEventPlugins", + "path": "UserEventPlugins", + "children": [ + { + "value": 60, + "name": "ACRRDaemon.plugin", + "path": "UserEventPlugins/ACRRDaemon.plugin", + "children": [ + { + "value": 60, + "name": "Contents", + "path": "UserEventPlugins/ACRRDaemon.plugin/Contents" + } + ] + }, + { + "value": 16, + "name": "AirPortUserAgent.plugin", + "path": "UserEventPlugins/AirPortUserAgent.plugin", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "UserEventPlugins/AirPortUserAgent.plugin/Contents" + } + ] + }, + { + "value": 0, + "name": "alfUIplugin.plugin", + "path": "UserEventPlugins/alfUIplugin.plugin", + "children": [ + { + "value": 0, + "name": "Contents", + "path": "UserEventPlugins/alfUIplugin.plugin/Contents" + } + ] + }, + { + "value": 12, + "name": "AppleHIDMouseAgent.plugin", + "path": "UserEventPlugins/AppleHIDMouseAgent.plugin", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "UserEventPlugins/AppleHIDMouseAgent.plugin/Contents" + } + ] + }, + { + "value": 12, + "name": "AssistantUEA.plugin", + "path": "UserEventPlugins/AssistantUEA.plugin", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "UserEventPlugins/AssistantUEA.plugin/Contents" + } + ] + }, + { + "value": 16, + "name": "AutoTimeZone.plugin", + "path": "UserEventPlugins/AutoTimeZone.plugin", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "UserEventPlugins/AutoTimeZone.plugin/Contents" + } + ] + }, + { + "value": 20, + "name": "BluetoothUserAgent-Plugin.plugin", + "path": "UserEventPlugins/BluetoothUserAgent-Plugin.plugin", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "UserEventPlugins/BluetoothUserAgent-Plugin.plugin/Contents" + } + ] + }, + { + "value": 12, + "name": "BonjourEvents.plugin", + "path": "UserEventPlugins/BonjourEvents.plugin", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "UserEventPlugins/BonjourEvents.plugin/Contents" + } + ] + }, + { + "value": 16, + "name": "BTMMPortInUseAgent.plugin", + "path": "UserEventPlugins/BTMMPortInUseAgent.plugin", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "UserEventPlugins/BTMMPortInUseAgent.plugin/Contents" + } + ] + }, + { + "value": 8, + "name": "CalendarMonitor.plugin", + "path": "UserEventPlugins/CalendarMonitor.plugin", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "UserEventPlugins/CalendarMonitor.plugin/Contents" + } + ] + }, + { + "value": 88, + "name": "CaptiveSystemAgent.plugin", + "path": "UserEventPlugins/CaptiveSystemAgent.plugin", + "children": [ + { + "value": 88, + "name": "Contents", + "path": "UserEventPlugins/CaptiveSystemAgent.plugin/Contents" + } + ] + }, + { + "value": 12, + "name": "CaptiveUserAgent.plugin", + "path": "UserEventPlugins/CaptiveUserAgent.plugin", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "UserEventPlugins/CaptiveUserAgent.plugin/Contents" + } + ] + }, + { + "value": 8, + "name": "com.apple.bonjour.plugin", + "path": "UserEventPlugins/com.apple.bonjour.plugin", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "UserEventPlugins/com.apple.bonjour.plugin/Contents" + } + ] + }, + { + "value": 8, + "name": "com.apple.cfnotification.plugin", + "path": "UserEventPlugins/com.apple.cfnotification.plugin", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "UserEventPlugins/com.apple.cfnotification.plugin/Contents" + } + ] + }, + { + "value": 8, + "name": "com.apple.diskarbitration.plugin", + "path": "UserEventPlugins/com.apple.diskarbitration.plugin", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "UserEventPlugins/com.apple.diskarbitration.plugin/Contents" + } + ] + }, + { + "value": 8, + "name": "com.apple.dispatch.vfs.plugin", + "path": "UserEventPlugins/com.apple.dispatch.vfs.plugin", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "UserEventPlugins/com.apple.dispatch.vfs.plugin/Contents" + } + ] + }, + { + "value": 12, + "name": "com.apple.fsevents.matching.plugin", + "path": "UserEventPlugins/com.apple.fsevents.matching.plugin", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "UserEventPlugins/com.apple.fsevents.matching.plugin/Contents" + } + ] + }, + { + "value": 8, + "name": "com.apple.iokit.matching.plugin", + "path": "UserEventPlugins/com.apple.iokit.matching.plugin", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "UserEventPlugins/com.apple.iokit.matching.plugin/Contents" + } + ] + }, + { + "value": 8, + "name": "com.apple.KeyStore.plugin", + "path": "UserEventPlugins/com.apple.KeyStore.plugin", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "UserEventPlugins/com.apple.KeyStore.plugin/Contents" + } + ] + }, + { + "value": 8, + "name": "com.apple.launchd.helper.plugin", + "path": "UserEventPlugins/com.apple.launchd.helper.plugin", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "UserEventPlugins/com.apple.launchd.helper.plugin/Contents" + } + ] + }, + { + "value": 8, + "name": "com.apple.locationd.events.plugin", + "path": "UserEventPlugins/com.apple.locationd.events.plugin", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "UserEventPlugins/com.apple.locationd.events.plugin/Contents" + } + ] + }, + { + "value": 8, + "name": "com.apple.notifyd.matching.plugin", + "path": "UserEventPlugins/com.apple.notifyd.matching.plugin", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "UserEventPlugins/com.apple.notifyd.matching.plugin/Contents" + } + ] + }, + { + "value": 8, + "name": "com.apple.opendirectory.matching.plugin", + "path": "UserEventPlugins/com.apple.opendirectory.matching.plugin", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "UserEventPlugins/com.apple.opendirectory.matching.plugin/Contents" + } + ] + }, + { + "value": 12, + "name": "com.apple.rcdevent.matching.plugin", + "path": "UserEventPlugins/com.apple.rcdevent.matching.plugin", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "UserEventPlugins/com.apple.rcdevent.matching.plugin/Contents" + } + ] + }, + { + "value": 8, + "name": "com.apple.reachability.plugin", + "path": "UserEventPlugins/com.apple.reachability.plugin", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "UserEventPlugins/com.apple.reachability.plugin/Contents" + } + ] + }, + { + "value": 8, + "name": "com.apple.systemconfiguration.plugin", + "path": "UserEventPlugins/com.apple.systemconfiguration.plugin", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "UserEventPlugins/com.apple.systemconfiguration.plugin/Contents" + } + ] + }, + { + "value": 44, + "name": "com.apple.telemetry.plugin", + "path": "UserEventPlugins/com.apple.telemetry.plugin", + "children": [ + { + "value": 44, + "name": "Contents", + "path": "UserEventPlugins/com.apple.telemetry.plugin/Contents" + } + ] + }, + { + "value": 24, + "name": "com.apple.time.plugin", + "path": "UserEventPlugins/com.apple.time.plugin", + "children": [ + { + "value": 24, + "name": "Contents", + "path": "UserEventPlugins/com.apple.time.plugin/Contents" + } + ] + }, + { + "value": 12, + "name": "com.apple.TimeMachine.plugin", + "path": "UserEventPlugins/com.apple.TimeMachine.plugin", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "UserEventPlugins/com.apple.TimeMachine.plugin/Contents" + } + ] + }, + { + "value": 20, + "name": "com.apple.TimeMachine.System.plugin", + "path": "UserEventPlugins/com.apple.TimeMachine.System.plugin", + "children": [ + { + "value": 20, + "name": "Contents", + "path": "UserEventPlugins/com.apple.TimeMachine.System.plugin/Contents" + } + ] + }, + { + "value": 12, + "name": "com.apple.universalaccess.events.plugin", + "path": "UserEventPlugins/com.apple.universalaccess.events.plugin", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "UserEventPlugins/com.apple.universalaccess.events.plugin/Contents" + } + ] + }, + { + "value": 8, + "name": "com.apple.usernotificationcenter.matching.plugin", + "path": "UserEventPlugins/com.apple.usernotificationcenter.matching.plugin", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "UserEventPlugins/com.apple.usernotificationcenter.matching.plugin/Contents" + } + ] + }, + { + "value": 12, + "name": "com.apple.WorkstationService.plugin", + "path": "UserEventPlugins/com.apple.WorkstationService.plugin", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "UserEventPlugins/com.apple.WorkstationService.plugin/Contents" + } + ] + }, + { + "value": 28, + "name": "EAPOLMonitor.plugin", + "path": "UserEventPlugins/EAPOLMonitor.plugin", + "children": [ + { + "value": 28, + "name": "Contents", + "path": "UserEventPlugins/EAPOLMonitor.plugin/Contents" + } + ] + }, + { + "value": 8, + "name": "GSSNotificationForwarder.plugin", + "path": "UserEventPlugins/GSSNotificationForwarder.plugin", + "children": [ + { + "value": 8, + "name": "Contents", + "path": "UserEventPlugins/GSSNotificationForwarder.plugin/Contents" + } + ] + }, + { + "value": 12, + "name": "LocationMenu.plugin", + "path": "UserEventPlugins/LocationMenu.plugin", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "UserEventPlugins/LocationMenu.plugin/Contents" + } + ] + }, + { + "value": 12, + "name": "PrinterMonitor.plugin", + "path": "UserEventPlugins/PrinterMonitor.plugin", + "children": [ + { + "value": 12, + "name": "Contents", + "path": "UserEventPlugins/PrinterMonitor.plugin/Contents" + } + ] + }, + { + "value": 16, + "name": "SCMonitor.plugin", + "path": "UserEventPlugins/SCMonitor.plugin", + "children": [ + { + "value": 16, + "name": "Contents", + "path": "UserEventPlugins/SCMonitor.plugin/Contents" + } + ] + } + ] + }, + { + "value": 536, + "name": "Video", + "path": "Video", + "children": [ + { + "value": 536, + "name": "Plug-Ins", + "path": "Video/Plug-Ins", + "children": [ + { + "value": 536, + "name": "AppleProResCodec.bundle", + "path": "Video/Plug-Ins/AppleProResCodec.bundle" + } + ] + } + ] + }, + { + "value": 272, + "name": "WidgetResources", + "path": "WidgetResources", + "children": [ + { + "value": 16, + "name": ".parsers", + "path": "WidgetResources/.parsers" + }, + { + "value": 172, + "name": "AppleClasses", + "path": "WidgetResources/AppleClasses", + "children": [ + { + "value": 156, + "name": "Images", + "path": "WidgetResources/AppleClasses/Images" + } + ] + }, + { + "value": 0, + "name": "AppleParser", + "path": "WidgetResources/AppleParser" + }, + { + "value": 48, + "name": "button", + "path": "WidgetResources/button" + }, + { + "value": 32, + "name": "ibutton", + "path": "WidgetResources/ibutton" + } + ] + } +] \ No newline at end of file diff --git a/test/fixtures/weibo.json b/test/fixtures/weibo.json new file mode 100644 index 000000000..dde830258 --- /dev/null +++ b/test/fixtures/weibo.json @@ -0,0 +1,17974 @@ +[ + [{ + "name": "", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "Camel3942", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "Camel3942", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "Christinez", + "symbolSize": 13, + "draggable": "False", + "value": 7, + "category": "Christinez", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "JoannaBlue", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "JoannaBlue", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "Michael-Cheung-", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "Michael-Cheung-", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "NKmilitaryStudies", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "NKmilitaryStudies", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "Syfannn", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "Syfannn", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "Tiger公子", + "symbolSize": 13, + "draggable": "False", + "value": 7, + "category": "Tiger公子", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "VeryE", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "VeryE", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "X_iao樓", + "symbolSize": 12, + "draggable": "False", + "value": 6, + "category": "X_iao樓", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "Xiao-斌杰", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "Xiao-斌杰", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "_nearly转1", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "_nearly转1", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "lfx160219", + "symbolSize": 14, + "draggable": "False", + "value": 8, + "category": "lfx160219", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "offfarmworkes2", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "offfarmworkes2", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "sazen", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "sazen", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "stephen1999c", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "stephen1999c", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "w新晴w", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "w新晴w", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "xHao晓灏", + "symbolSize": 8, + "draggable": "False", + "value": 2, + "category": "xHao晓灏", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "上局沪段_沪", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "上局沪段_沪", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "中出宪政柏拉图", + "symbolSize": 12, + "draggable": "False", + "value": 5, + "category": "中出宪政柏拉图", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "中华龙会", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "中华龙会", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "五十岚空芔", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "五十岚空芔", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "京城吃货日记", + "symbolSize": 14, + "draggable": "False", + "value": 9, + "category": "京城吃货日记", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "人形高达奈叶", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "人形高达奈叶", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "优质羊毛", + "symbolSize": 8, + "draggable": "False", + "value": 2, + "category": "优质羊毛", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "加菲杰克", + "symbolSize": 12, + "draggable": "False", + "value": 6, + "category": "加菲杰克", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "北京金戈戈", + "symbolSize": 11, + "draggable": "False", + "value": 4, + "category": "北京金戈戈", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "南迦巴瓦的晨曦", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "南迦巴瓦的晨曦", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "吉四六", + "symbolSize": 12, + "draggable": "False", + "value": 6, + "category": "吉四六", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "喷嚏网铂程", + "symbolSize": 16, + "draggable": "False", + "value": 15, + "category": "喷嚏网铂程", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "嗨哥苏大少", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "嗨哥苏大少", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "堕落熊猫001", + "symbolSize": 13, + "draggable": "False", + "value": 7, + "category": "堕落熊猫001", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "夏至蟲之音", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "夏至蟲之音", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "天天越野跑", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "天天越野跑", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "天水2院张医生", + "symbolSize": 9, + "draggable": "False", + "value": 3, + "category": "天水2院张医生", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "天津王麟", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "天津王麟", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "孟加拉虎的BLOG", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "孟加拉虎的BLOG", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "宋燕不v", + "symbolSize": 30, + "draggable": "False", + "value": 319, + "category": "宋燕不v", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "尧哥讲笑话", + "symbolSize": 9, + "draggable": "False", + "value": 3, + "category": "尧哥讲笑话", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "开老爷车的熊", + "symbolSize": 15, + "draggable": "False", + "value": 10, + "category": "开老爷车的熊", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "张晨初艺术空间", + "symbolSize": 30, + "draggable": "False", + "value": 312, + "category": "张晨初艺术空间", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "张欧亚", + "symbolSize": 30, + "draggable": "False", + "value": 318, + "category": "张欧亚", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "我们认识", + "symbolSize": 12, + "draggable": "False", + "value": 5, + "category": "我们认识", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "战争史研究WHS", + "symbolSize": 30, + "draggable": "False", + "value": 291, + "category": "战争史研究WHS", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "战争史研究WHS:图片评论 http", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "战争史研究WHS:图片评论 http", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "投行老人", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "投行老人", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "换个名字好累人", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "换个名字好累人", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "新浪体育", + "symbolSize": 35, + "draggable": "False", + "value": 875, + "category": "新浪体育", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "方便卫生起效慢", + "symbolSize": 15, + "draggable": "False", + "value": 11, + "category": "方便卫生起效慢", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "无心耳语08", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "无心耳语08", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "暗能量泡泡", + "symbolSize": 11, + "draggable": "False", + "value": 4, + "category": "暗能量泡泡", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "歌手亚东", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "歌手亚东", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "没籽的葡萄好吃", + "symbolSize": 11, + "draggable": "False", + "value": 4, + "category": "没籽的葡萄好吃", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "澳洲李市民", + "symbolSize": 8, + "draggable": "False", + "value": 2, + "category": "澳洲李市民", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "灰狼多样性", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "灰狼多样性", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "爱哟快乐", + "symbolSize": 9, + "draggable": "False", + "value": 3, + "category": "爱哟快乐", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "猫饭P", + "symbolSize": 8, + "draggable": "False", + "value": 2, + "category": "猫饭P", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "猿十三", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "猿十三", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "王唔悦", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "王唔悦", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "相忘于2222", + "symbolSize": 11, + "draggable": "False", + "value": 4, + "category": "相忘于2222", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "简木生--包丰瀛", + "symbolSize": 18, + "draggable": "False", + "value": 19, + "category": "简木生--包丰瀛", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "紫霄时雨_苍穹要塞难民", + "symbolSize": 9, + "draggable": "False", + "value": 3, + "category": "紫霄时雨_苍穹要塞难民", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "紹灝Lam", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "紹灝Lam", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "罗昌平", + "symbolSize": 22, + "draggable": "False", + "value": 58, + "category": "罗昌平", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "耳光赵荒唐", + "symbolSize": 15, + "draggable": "False", + "value": 11, + "category": "耳光赵荒唐", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "肉食者Play", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "肉食者Play", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "胖猪猪呼呼睡", + "symbolSize": 12, + "draggable": "False", + "value": 6, + "category": "胖猪猪呼呼睡", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "花卷沉湎", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "花卷沉湎", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "苗条的小实", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "苗条的小实", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "豆名扬", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "豆名扬", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "过去的老照片", + "symbolSize": 8, + "draggable": "False", + "value": 2, + "category": "过去的老照片", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "远古的刀", + "symbolSize": 8, + "draggable": "False", + "value": 2, + "category": "远古的刀", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "重工组长于彦舒", + "symbolSize": 31, + "draggable": "False", + "value": 378, + "category": "重工组长于彦舒", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "長滒", + "symbolSize": 12, + "draggable": "False", + "value": 5, + "category": "長滒", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "陇上优品-陶磊", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "陇上优品-陶磊", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "降夭除魔齐天大圣", + "symbolSize": 11, + "draggable": "False", + "value": 4, + "category": "降夭除魔齐天大圣", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "马周扬律师", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "马周扬律师", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "鬼面绣裁", + "symbolSize": 9, + "draggable": "False", + "value": 3, + "category": "鬼面绣裁", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "魔都310土匪", + "symbolSize": 5, + "draggable": "False", + "value": 1, + "category": "魔都310土匪", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "麻黑浮云", + "symbolSize": 19, + "draggable": "False", + "value": 29, + "category": "麻黑浮云", + "label": { + "normal": { + "show": "True" + } + } + }, + { + "name": "经济学原理0904", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "于余宇", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "落花满衣", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "耳光赵荒唐" + }, + { + "name": "破产伍伍陆", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "简木生--包丰瀛" + }, + { + "name": "iFandom", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "hai17", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "Gen余根", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "霁月难逢00", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "tingdianle88", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "buyueeeee", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "优质羊毛" + }, + { + "name": "7816呵呵", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "绵绵绵绵甜", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "假装仁波切糕", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "专卖好酒", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "鐵騎如水漫山關", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "头条股票", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "游鱼居士", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "耗社会主义股市羊毛", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "我想爬出去", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "月下桃花枝", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "鬼面绣裁" + }, + { + "name": "老盆", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "隔岸看风景2016", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "FullMetalLyle", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "POPOVISION", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "皓乙_纯", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "小纯是不穿板甲的狂战", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "成翔-同策咨询", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "X一块红布", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "七親萌貨", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "谷子地Dwane", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "Mitsuhide明智", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "风云路漫漫", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "中华龙会" + }, + { + "name": "镜花水月137", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "慈禧在坟墓里笑死", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张欧亚" + }, + { + "name": "人生录音", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "猫屎洞", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "宝蛋她娘", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "北京金戈戈" + }, + { + "name": "魏屹林", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "LAIZHONGYAO", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "酋长喊我回家吃饭", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "乔那个疯子", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "YM0518", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "一路并肩而行baby", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "静山观海", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "北京利生体育商厦", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "捆着发木ALT", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "只愿岁月不回头", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "撒旦尖角", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "Tiger公子" + }, + { + "name": "wu聊a", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "文武书书", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "大雄不太爱说话", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "卓裔人", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "过去的老照片" + }, + { + "name": "木_小呆是个死腐宅", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "简木生--包丰瀛" + }, + { + "name": "风雨天骄", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "斯坦家汪汪", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "上善若水_waterliker", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "水润嘉华", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "TerryYin_S", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "喷嚏网铂程" + }, + { + "name": "天高云淡vvv", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "喷嚏网铂程" + }, + { + "name": "减法生活女子减压生活会馆", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "" + }, + { + "name": "吃包子喝水", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "运交华盖2013", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "喷嚏网铂程" + }, + { + "name": "牵下水拍照", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "站在天桥数车灯儿", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Ranyuewan", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "钟颙sz", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "刘广赟卍", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "一支钥匙一把锁", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "霍斯勒阿瑟", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "沐之夏吉郎", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "冲浪板007", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "彪悍猫妈", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "小马_1623085", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "不读书的撸舔立", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "Strong明丶", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Jeff-Chang", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "灰狼多样性" + }, + { + "name": "兴盛泰", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "生活顺顺利利", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "零崎本心", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "NATUREexploring", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "yx希望", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "大伟MADSam", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "蓝天zjg", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "lfx160219" + }, + { + "name": "Daybreak_Canal", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "简木生--包丰瀛" + }, + { + "name": "来自TTY", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "喷嚏网铂程" + }, + { + "name": "冬马和纱厨", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "地质一郎", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "北大白马96613", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "lfx160219" + }, + { + "name": "登州笑笑生", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "铁成的幸福生活", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "耳光赵荒唐" + }, + { + "name": "CDJ37", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "湖南省西瓜甜瓜研究所团支部", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "股民资源QQ719554823", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "简木生--包丰瀛" + }, + { + "name": "我叫照日格图", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "满清十大酷刑", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "琉烟之烬", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "BooM_讽_刺_", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "agents博", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "NKmilitaryStudies" + }, + { + "name": "暮色柳塘", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "黄俄罗斯志愿兵", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "一百五十斤的维洛妮卡", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "厐宇峰", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "宅心似箭", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS:图片评论 http" + }, + { + "name": "____-------____________", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "甲壳咪殿下", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "edelman葛", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "stephen1999c" + }, + { + "name": "Mirko的blog", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "喷嚏网铂程" + }, + { + "name": "仇玲夕", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "柒vidy", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "中出宪政柏拉图" + }, + { + "name": "华府骏苑姜熙健", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "lfx160219" + }, + { + "name": "锦衣夜行452", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "seven_罗", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "九河下潲-天子渡口", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "bobbeido", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "开大招时会喵喵叫的friend", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "_nearly转1" + }, + { + "name": "止于涂", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "zds小懒", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "裸奔老者", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "Tiger公子" + }, + { + "name": "这个马叔不太冷", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "paxl", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "TeslaP100", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "鹿允近衛連隊的黑少领要当牛仔了", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "lfx160219" + }, + { + "name": "关乎牙齿更关心你", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "Wilson老张", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "花果山水帘洞齐天大圣0_0", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "猫团长没有咸鱼", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "MR-WANGRX", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "国术促进会吴彬", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "三里寻烟", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "东晓0117", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "简木生--包丰瀛" + }, + { + "name": "拉拉菲尔尼兹海格", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Howard_Qian", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "WANGJXseEr", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "诶呀妈呀吓我一跳", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "叫个咩faye", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "机智的大帅逼", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "山顶夫子", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "parenthesisZ", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "史小臭迷途中寻觅", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "氮气君NegativelyNorm", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "WJHLMM", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "福州摄影菌", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "bywang1", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "单位传达室老张", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "A优喂", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "廆仆", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "暖色调的海", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "郑顺天", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "硕爱1篮球阿阿", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "永强波家的", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "岁月哥特", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "好想骂你煞笔哦", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "洪涛观点", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "广陵古散", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "lfx160219" + }, + { + "name": "韩某89", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "MrBone", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "-胖小子-", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "激素少女陈一水", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "风和日丽1866", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "WeiGuan-Gworld", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "nevermind39", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "夜半幽灵", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "超级马力0", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "孙松AT", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "追风少年何大宝", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "huangky2013", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Tony老铁呀", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "澳洲李市民" + }, + { + "name": "Shawn_River", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "HexFireSea", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "浪剑痕_秋水尽洗天下劫", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "walbgt", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "耳光赵荒唐" + }, + { + "name": "陈_八怪_", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "WOCHIHUN", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "叶拂衣_", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "鬼面绣裁" + }, + { + "name": "醉生梦死的猫食", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "最近很无聊---", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "BluePadge", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "飛過萬水千山", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "jasonma284", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "坚菓青少年俱乐部", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "剡溪山君", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "千与千寻丶隐", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "头喵的妈吃一身", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "原始超越者2016", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "北辰慢慢跑", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "绿绿绿绿绿到发亮", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "蓝风2019", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "David爱美食", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "通古鬼斯", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "来自熊堡", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "北京_彬爷", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "花卷沉湎" + }, + { + "name": "噗噜噗噜轰隆隆隆", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "傅生-若梦", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "格瓦拉切糕", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "南部炮兵潘", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "财罗湖", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "北京金戈戈" + }, + { + "name": "笑看来者", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "w新晴w" + }, + { + "name": "用户6101624258", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "孤单一个人去返工II", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "刘志鲲", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "阿瑟queen", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "耳光赵荒唐" + }, + { + "name": "黄一米八二", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "軟Sir你病得不輕為啥還放棄治療", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "捣蛋少年2016", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "lfx160219" + }, + { + "name": "watermanlee", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "吉四六" + }, + { + "name": "谢龙1洋", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "幸福就是毛毛雪", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "团子桃子的麻麻", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "鋒瘋子", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "没事瞎扑腾_勇敢的乱飞_197", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "降夭除魔齐天大圣" + }, + { + "name": "九州纹龙", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "武人影像", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "飛升法皇嬴曌堃", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "隐隐灵音", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "Michael-Cheung-" + }, + { + "name": "Petter大俠", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "清者自來", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "Aresous", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "金城白菜斋", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "烈酒清茶", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "喷嚏网铂程" + }, + { + "name": "青蛙王子199905", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "NouWl", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "信近言复", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "今天你FGO咸鱼了么", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "和平与蛋黄酱", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "桃子老爹", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Beijingold4", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "D8表情帝", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "换个名字好累人" + }, + { + "name": "james7band", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "投行老人" + }, + { + "name": "triglyceridecreed", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "东168168168", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "不是宏推大宏推", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "白胖浪浪", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "美丽居曹亮", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "鳯逑凰", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "邓先渝", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "农行小桂圆", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "周伯通说话", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "小弟震", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "饽饽瘦了", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "喷嚏网铂程" + }, + { + "name": "西班牙荣", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "卅石矷", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "心若善至", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "stlxmsl", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "原子CaoYuan", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "BiBlBa", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "师律伟王", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "冬风吹不走雾", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "李小宝gg", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "yaozo", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "泥四步撒", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "风清熙", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "旺达不锈钢管道设备", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "小LIU仔", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "古俐特", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "带鸡的少侠a", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "暴君T-233", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "人形高达奈叶" + }, + { + "name": "MADAO兽-UP", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "汪俊玲_悦宸", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "坠-绝命大番茄", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "WVA亿境战队李嘉炜", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "LP呆啊呆", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "未文侯", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "我们认识" + }, + { + "name": "黄鹤2016", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "终南金刚", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "CCCCRAZYCAT", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "三尺之上有神明", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "避难所小子爱喝核子可乐", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "慈悲为槐", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "Red-or-Black", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "村头蹲点小流氓", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "秋风旅人", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "蒋某people", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "Xiao-斌杰" + }, + { + "name": "于贺_", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "bmjj777", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "HS_Hanson", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "叫我驴驴就好了", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "UNIMET", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "罗叉叉", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "方便卫生起效慢" + }, + { + "name": "后仓松鼠", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "activegeneral", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "筑城小铃铛", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "功夫查理", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "名字这么难听", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "浪客不行", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "床保社", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "米拉库露", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "换名字也不行", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "监视狂魔沈夜", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "HCHZ2011", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "0ne丶PunCh", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "曜冰", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "千年王国2012", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "dgxbill", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "xbftslh", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "那个叫做光的男人真他妈可爱", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "霹雳球球", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "嬉皮笑脸者说", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "耳光赵荒唐" + }, + { + "name": "Justice_Sum", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "吉四六" + }, + { + "name": "王大大大安", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "光明家具刘志军", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "洪七公--36", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "不记得今天是礼拜几", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "墨子墨子墨子", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "古城_tma", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "王小硕的小马甲", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Pengtzuchieh", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "就是内个少年", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "瑞新新新新", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "来了来了了了", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "喷嚏网铂程" + }, + { + "name": "老海91816", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "清清美美", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "bsr1983", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "澳洲李市民" + }, + { + "name": "陪你疯到天涯海角", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "耳光赵荒唐" + }, + { + "name": "冷炜", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "饕餮海", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "相忘于2222" + }, + { + "name": "RyanTsa0", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "X_iao樓" + }, + { + "name": "平生最怕起名字", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "说你酷", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "中出宪政柏拉图" + }, + { + "name": "鏡妖星影", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "文话中国", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "短昵称-", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "实用格斗", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "oldharry", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "HBG_喵", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "知白守黑stock", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "醇淨氺", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "铁笛惊龙", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "北京金戈戈" + }, + { + "name": "想去看看世界的小猴子", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "风_凌羽", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "喷嚏网铂程" + }, + { + "name": "snowpanzer", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "传说中滴临时工", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "喷嚏网铂程" + }, + { + "name": "香暗盈袖", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "Gabriel-VN", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "直布罗陀_", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "木子东冉", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "麓林山人", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "大烧饼学炒股", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "架梁公", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "_月亮六便士", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "Anson余生", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "光辉岁月0927", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "飞廉窝在小院子里养老", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "我的牛呢", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "阝东更鑫鑫向荣", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "步行者001", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "艾露恩之光", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "-梦魂舞晶-", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "赵不着调调儿", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "耳光赵荒唐" + }, + { + "name": "小德银鳞胸甲", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "薄荷够凉", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "那山杜鹃bj", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "真正的桐柏英雄", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "耳光赵荒唐" + }, + { + "name": "秋天的完美生活", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "熬浆糊99", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "李狗嗨ing", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "我与鱼儿", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "章海波", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "雨点儿yang", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "九翼龙皇", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "三口一瓶奶", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "Christinez" + }, + { + "name": "呆毛哼", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Augusttin", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "ERLIANGJO", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "160么么哒", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "王师北定FK", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "电击鱼", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "胖得有气质", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "茗品呀茗品", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "tang花_fh7", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "魔蟹0080", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "说说我的丑", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "huaxiawolf", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "aeo000000", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "吴宇森影迷", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "风起来停不下来", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "Syfannn" + }, + { + "name": "李曼青sattvaUranus", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "简单感-悟", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "北京金戈戈" + }, + { + "name": "拜访者查子", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "伤心云雨8", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Michael刘磊", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "饕餮无厌-半部屠龙之术", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "门后的风铃", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "不動的大圖書館Q", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "在一起的围脖", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "妙我居士", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "米衫儿", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "plud2005", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "JeremyKevin", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "天天越野跑" + }, + { + "name": "无穷的探索", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "爱学习的绿叶子", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "tuzixuexi", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "chariotwx", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "取舍时空", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "姚磊-三过七院而不入", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "派大星爱吃锅包肉", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "不如一朵", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "没有烟了", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "入云伤", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "黄禾谷", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "平凡746", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "一头土猪", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "mogu丫头", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "直抵黄龙府与诸君痛饮尔", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "木兰007", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "Tiger公子" + }, + { + "name": "大连地果", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "八度鱼77", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "流云涛影的空间", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "BOSS大泡泡", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "MTbuff", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "五只fffff菌", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "降夭除魔齐天大圣" + }, + { + "name": "Cindy是我的", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "九門道", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "DaDaDaDaDaDa灰狼", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "努力的萨摩", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "VC火星人", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "奔驰配件只售原厂全新", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "孤独的卧龙", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "MYS_Parker", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "真同你友缘", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "要酒还是要故事", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "飞云乱度_unntopia", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "拖拉机再垃圾也能拖垃圾H", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "ARS_锋线今天补齐了么", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "约伯少木", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "江心洲的石头", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "信仰铮", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "踏古悠悠", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "关东十二郎", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "龍叔論勢", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "小齐与玫瑰", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "阳光的小青年123", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "lionshuang", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "剑雨风竹wzp", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "leo快跑_", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "霄緰鳴", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "清宇建材", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "IHSAKAH", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "景页的彭", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "子非鱼非子vit", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "萨特5243280580", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Unique斯通", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "信仰之魂之根", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "手自栽", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "霞客遗风", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "天心-月圆", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "小凯最爱羊羊", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "穿长靴的柴郡猫", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "看客二两七", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "王小签", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "自古秃顶多薄命", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "陇南老代", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "HERO-熊", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "手机用户2011685586", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "披着虎皮的羊", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "竹林之闲七", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "坦帕湾魔鬼鱼", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "某气又方又圆", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "walmazon", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "RX-78-8", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "balcktomato", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "简木生--包丰瀛" + }, + { + "name": "TroubleKid是MADAO", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "爆炸神教唯我独尊", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "一个立派又迷人的营销号手机用户", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "春分大寒", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "上局沪段_沪" + }, + { + "name": "曾经依然46", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "柳恒卓", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "适中求对", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "流星弦月", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "黑岛结菜厨", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "鬼男三世", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "牧羽尽人", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "北斗之南V", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "自由知新", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "吉四六" + }, + { + "name": "也曾相识0906", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "小鱼妖贤", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "怀风的小号", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "路痴Lee", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "望霆止渴", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "Tiger公子" + }, + { + "name": "海獭小元帅", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "梦里自在", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "人总要变僵尸", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "做题做到傻星人", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "不会结网的蜘蛛", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "艾特胖叔叔", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "michelle0706", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "中二有治", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "renaissance325", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "山行者不爬山", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "一只饼干熊", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "Double润-JR", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "海布利的机关枪", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "fhqskwwx", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "虚地天高海底行", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "杨术灵的公司是在香港注册的", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "吉四六" + }, + { + "name": "快刀博士", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "阿腿-人活着就是为了式姐", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "李哈喽年抓虫子", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "entaro", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "新型的农村人", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "远古的刀" + }, + { + "name": "吴地老高", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "京城吃货日记" + }, + { + "name": "只愿华丽一次", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "丁库北", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "猿十三" + }, + { + "name": "2x2eyes着装变身", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "小钱钱飞来招财进宝", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "Tiger公子" + }, + { + "name": "乐_扬", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "三分音符V", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "喷嚏网铂程" + }, + { + "name": "神之佩恩", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "小超-唐新", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "雷焰萌虎", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "五十岚空芔" + }, + { + "name": "蓝天白云5888", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "大虾本尊", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "CJ一个微博", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "阿里海牙科维奇", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "中出宪政柏拉图" + }, + { + "name": "清古正华", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "八一魄力", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "worisi_na3", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "耳光赵荒唐" + }, + { + "name": "用户5989473265", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "沙漠王子82", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "BJ卫东围脖", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "大叔与流浪猫", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "单刀126", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "赵伯安", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "all-time-low", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "凌舒韵", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "笨不傻", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "超昂闪存", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "甲古的时代", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "孙润琦最近有点胖啊", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "会瘦的兔子", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "非典型精彩", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "上海曹凡", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "爱哟快乐" + }, + { + "name": "小木木-H", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "曾经日在校园", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "呛呛枪", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "ZY真人吉光片羽", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "M菊花的小GI", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "钟涓之", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "weibuloser", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "潘恩豪啊潘恩豪", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "天枢道", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "穆sir---", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "剑吹白雪喵喵酱", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "淘气的小福儿", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "lfx160219" + }, + { + "name": "惊梦时从来不报社", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "成都大河", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "琉璃厂人", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "江巴瓜poi", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "猫饭P" + }, + { + "name": "偶尔有点帅1988", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "安庆爱慕摄影师阿文", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "破晓劲风", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "EL-bazinga", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "OP牛牛real", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "田字格大人", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Yoga_雪", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "王唔悦" + }, + { + "name": "牛大腕和羊羔肉", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "一路上有你LXING", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "小闫---闫宇航2_167", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "书客的马甲", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "廿五廿六", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "嗷嘚儿刘", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "月想夜雫", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "猫饭P" + }, + { + "name": "人生装修中的王白薯", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "老哥哥农农", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "山城球长", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "愚忠不中", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "豆名扬" + }, + { + "name": "搞一手", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "用户3639916871", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "杨培军ypj", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "天津王麟" + }, + { + "name": "命名馆的故事", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "动物凶猛吗", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "拖大林的斯拉机", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Wcqsoil奇", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "喷嚏网铂程" + }, + { + "name": "-隔壁尛王", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "中出宪政柏拉图" + }, + { + "name": "jinguokai", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "樱花突击队", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "笑嘻嘻不是孬东西", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "明月照清疯", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "philosophic_philo", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "-_---17---_-", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "于小文很跋扈", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "更木千秋", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "看你妹夫斯基", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "各路英雄我是炮灰", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Panda加速度", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "变态的小幸福", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "京城吃货日记" + }, + { + "name": "云信321312747", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "见习魔王", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "山魈屠魔", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "smthpickboy", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "读心术宋_Ssir226", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "糖丶King", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "深圳-0755", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "吹風左", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "霖希默语", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "34X5A7", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "蝶升思26812", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Tony悟空孙", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "山里的孩子去砍柴", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "XTG29", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "血红暴鲤魚", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "傲血困意", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "简木生--包丰瀛" + }, + { + "name": "只道是寻常草履虫", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "李家老三是藕霸", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "苍天的渔民饥饿的猫", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "宁紫晗f", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "陇上优品-陶磊" + }, + { + "name": "Biu--------------", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "ROCK在民大", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "wwwwwww_W", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "黑羽太太薄爷爷", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "sazen" + }, + { + "name": "焖猪脚", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "九又十三分之一", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "耳光赵荒唐" + }, + { + "name": "dengliang100", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "慢慢买4j", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "ORANGE_TULIP_2015__盾构工程", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "女汉子只是多了一那份坚强錟", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "赵翼菲", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "balestra", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "西瓜大将", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "毛巾在飞翔", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "青鸟tw", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "卖蟑螂的小男孩XD", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "盖世英雄_i", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "相忘于2222" + }, + { + "name": "找北的时光", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "天水2院张医生" + }, + { + "name": "片桂hoho嘎", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "雨小农和獭祭鱼", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "子-都", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "哥是厦大的", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "买不起早点的门房郑大爷", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "MrFopenheart", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "梦佳红人", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "JustForFunDude", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "徐冲dy", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "王霸丑", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "已过期的凤梨罐头", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "果果的妈妈", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "lfx160219" + }, + { + "name": "被阳光点燃的小雏菊", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "SOLOWINGROCKY", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "不吃萝卜的野生鱼", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "Urnotprepared", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "北大十五", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "大漠孤烟平凉", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "messenger16", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "-逐梦令-", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "寒木9740", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "冯某钊", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "大眼李", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "吉四六" + }, + { + "name": "阿特兰蒂斯的飞鸟", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "无心耳语08" + }, + { + "name": "顺手牵杨扬", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "Hu_子叔叔", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "67年生人的记忆碎片", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "苗条的小实" + }, + { + "name": "千手捉鸡_", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "降夭除魔齐天大圣" + }, + { + "name": "pmzqld", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "喷嚏网铂程" + }, + { + "name": "我可以咬一口耶", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "浪里秤砣", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "SofayW", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "Very流浪的小拖鞋", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "LSX_N欣", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "降夭除魔齐天大圣" + }, + { + "name": "偏不见就叫偏不见", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "castle84", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "IceE_U", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "燃满愿", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "风花雪月去", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "开拓者3569", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "一小撮别有用心的小猪在跳舞", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "简木生--包丰瀛" + }, + { + "name": "波灵谷", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "饱饱的酸菜君", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "Tiger公子" + }, + { + "name": "关洪导演", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "相忘于2222" + }, + { + "name": "人一定要靠自己", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "老师教案的宝宝", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "中出宪政柏拉图" + }, + { + "name": "毛i台钧", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "时间苍窮", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "刘海哲", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "君王板甲胡屠户", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "富怡-宝盈-盈瑞恒", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "嗨哥苏大少" + }, + { + "name": "周氏豆沙", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "远古的刀" + }, + { + "name": "赵毫毛", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "刺猬-的生活", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Digital蚊子", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "简木生--包丰瀛" + }, + { + "name": "烈日下的森岛", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "鋈圆", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "纪岚挺", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "ParPar2011", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "谁执流素舞青月", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "七绪平门", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "苏乄小溪", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "flowtime", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "丿胡丶半仙", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "Cal_liu", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "玉米皮多多", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "二只只", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "長滒" + }, + { + "name": "坚心耐苦", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "金粉洒家", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "吉原嗷子手中一碗张屏的面", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "大风起兮谣言飞", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "上下天光一碧万顷", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "弗温居士", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "小小真菌", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "万言不值一杯酒", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "雷电看风云", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "喷嚏网铂程" + }, + { + "name": "江南岸1217", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "柳培卿", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "马里亚纳的沟", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "DR-pepper大魔王", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "奔跑在路上的小猪哥哥", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "于明乐81489", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "肉食者Play" + }, + { + "name": "吃鲸_满脑子打牌", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "流竜馬", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "心雨3266917092", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "歌手亚东" + }, + { + "name": "铁的男", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "顺势旺", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "若渝与若耶", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "栖凤山D", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "给美希庆生的P_卡卡", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "鱼丸粗面", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "谢乘月", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "鬼面绣裁" + }, + { + "name": "Tachikoma1990", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "吉四六" + }, + { + "name": "东瓜_DONGGUA", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "秃秃小嘎", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "曲儿wq", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "云自在_安平太", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "萧月御诸", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "茜akane茜", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "南迦巴瓦的晨曦" + }, + { + "name": "丘八帮高级会员", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "刘大来律师", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "马周扬律师" + }, + { + "name": "李白起", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "zzz洋仔", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "竹园纤圆", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "FLAX_圩田经济学安心种地", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "人民舆论V", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "佬俚伺", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "孟加拉虎的BLOG" + }, + { + "name": "freeeeekick", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "healt", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "猪头三小队长", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "喷嚏网铂程" + }, + { + "name": "小骉007", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "曾经莱克今星敦", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "my686", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "sekino", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "幽径不再悲剧", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "zine692008991", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "JoKer__x1", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "艹丶LOVE丨霸道灬88", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "WS_WBZ", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "MKIII_TROMBE", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "ABCDEFGWA", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "markxhuang", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "何鑫JO", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "可爱卫东", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Sher-Conan", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "简木生--包丰瀛" + }, + { + "name": "TreeHole2017", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "深度脸盲症", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "苍玖染月", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "魔都310土匪" + }, + { + "name": "saxon-90", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "苍狼小幻_", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "低碳George", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "一任年华度如禅", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "屯里NNRT", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "黑贝的米兔", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "小葱花饼香辣子", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "JoannaBlue" + }, + { + "name": "鑦赟驜鶴", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "罗比巴吉奥", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "耳光赵荒唐" + }, + { + "name": "Mr-LeeZL", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "村长一路走好cl", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "阿根廷人小马", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "魔都百姓海幽", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "竹林风雨来了", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "肺想说话", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "AFC-ARS-FANS", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "風痕2017", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "红藕香残玉簟秋allaboutyou", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Eye2eyes", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "重工组长于彦舒" + }, + { + "name": "英雄爱听故事", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "起士林不是我开的", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "麻黑浮云" + }, + { + "name": "hk2008abc", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "张晨初艺术空间" + }, + { + "name": "2017-5serieS", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "showdfg", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "Camel3942" + }, + { + "name": "o0勇敢的心0o", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "我是伍味子", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "熊宝-咪", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "简木生--包丰瀛" + }, + { + "name": "花贰街", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "Infi2015", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "garfield007", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "爱家庭教师爱篮球爱科比", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "赵家周报", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "罗昌平" + }, + { + "name": "海中的小白鲨", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "恩里克", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "西单骆驼", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "Tiger公子" + }, + { + "name": "强强187", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "战争史研究WHS" + }, + { + "name": "我的威海", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "过去的老照片" + }, + { + "name": "吴足道-alaya", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + }, + { + "name": "喜欢YY的城墙鸡", + "symbolSize": 5, + "draggable": "False", + "value": 0, + "category": "新浪体育" + } + ], + [{ + "source": "新浪体育", + "target": "阿根廷人小马" + }, + { + "source": "新浪体育", + "target": "Beijingold4" + }, + { + "source": "麻黑浮云", + "target": "X一块红布" + }, + { + "source": "胖猪猪呼呼睡", + "target": "麻黑浮云" + }, + { + "source": "麻黑浮云", + "target": "胖猪猪呼呼睡" + }, + { + "source": "新浪体育", + "target": "麻黑浮云" + }, + { + "source": "战争史研究WHS", + "target": "小齐与玫瑰" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "陇南老代" + }, + { + "source": "新浪体育", + "target": "triglyceridecreed" + }, + { + "source": "战争史研究WHS", + "target": "孤独的卧龙" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "赵翼菲" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "蓝风2019" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "ABCDEFGWA" + }, + { + "source": "澳洲李市民", + "target": "Tony老铁呀" + }, + { + "source": "战争史研究WHS", + "target": "澳洲李市民" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "中出宪政柏拉图", + "target": "老师教案的宝宝" + }, + { + "source": "加菲杰克", + "target": "中出宪政柏拉图" + }, + { + "source": "堕落熊猫001", + "target": "加菲杰克" + }, + { + "source": "张晨初艺术空间", + "target": "堕落熊猫001" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "冬风吹不走雾" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "山行者不爬山" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "栖凤山D" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "孤独的卧龙" + }, + { + "source": "吉四六", + "target": "watermanlee" + }, + { + "source": "战争史研究WHS", + "target": "吉四六" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "那山杜鹃bj" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "陇上优品-陶磊", + "target": "宁紫晗f" + }, + { + "source": "天水2院张医生", + "target": "陇上优品-陶磊" + }, + { + "source": "暗能量泡泡", + "target": "天水2院张医生" + }, + { + "source": "X_iao樓", + "target": "暗能量泡泡" + }, + { + "source": "新浪体育", + "target": "X_iao樓" + }, + { + "source": "新浪体育", + "target": "只愿岁月不回头" + }, + { + "source": "喷嚏网铂程", + "target": "天高云淡vvv" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "罗昌平", + "target": "tingdianle88" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "中华龙会", + "target": "风云路漫漫" + }, + { + "source": "新浪体育", + "target": "中华龙会" + }, + { + "source": "罗昌平", + "target": "专卖好酒" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "X_iao樓", + "target": "RyanTsa0" + }, + { + "source": "新浪体育", + "target": "X_iao樓" + }, + { + "source": "新浪体育", + "target": "小木木-H" + }, + { + "source": "战争史研究WHS", + "target": "鐵騎如水漫山關" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "BluePadge" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "曲儿wq" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "风和日丽1866" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "w新晴w", + "target": "笑看来者" + }, + { + "source": "xHao晓灏", + "target": "w新晴w" + }, + { + "source": "战争史研究WHS", + "target": "xHao晓灏" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "山行者不爬山" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "南部炮兵潘" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "千年王国2012" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "新浪体育", + "target": "中华龙会" + }, + { + "source": "战争史研究WHS", + "target": "旺达不锈钢管道设备" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "降夭除魔齐天大圣", + "target": "LSX_N欣" + }, + { + "source": "新浪体育", + "target": "降夭除魔齐天大圣" + }, + { + "source": "新浪体育", + "target": "蓝天白云5888" + }, + { + "source": "战争史研究WHS", + "target": "玉米皮多多" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "小鱼妖贤" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "markxhuang" + }, + { + "source": "新浪体育", + "target": "这个马叔不太冷" + }, + { + "source": "新浪体育", + "target": "David爱美食" + }, + { + "source": "新浪体育", + "target": "柳培卿" + }, + { + "source": "新浪体育", + "target": "地质一郎" + }, + { + "source": "耳光赵荒唐", + "target": "worisi_na3" + }, + { + "source": "战争史研究WHS", + "target": "耳光赵荒唐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "philosophic_philo" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "饕餮无厌-半部屠龙之术" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "jasonma284" + }, + { + "source": "战争史研究WHS", + "target": "fhqskwwx" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "王大大大安" + }, + { + "source": "天水2院张医生", + "target": "陇上优品-陶磊" + }, + { + "source": "暗能量泡泡", + "target": "天水2院张医生" + }, + { + "source": "X_iao樓", + "target": "暗能量泡泡" + }, + { + "source": "新浪体育", + "target": "X_iao樓" + }, + { + "source": "新浪体育", + "target": "直布罗陀_" + }, + { + "source": "战争史研究WHS", + "target": "虚地天高海底行" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "曾经日在校园" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "新浪体育", + "target": "messenger16" + }, + { + "source": "耳光赵荒唐", + "target": "铁成的幸福生活" + }, + { + "source": "战争史研究WHS", + "target": "耳光赵荒唐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "Biu--------------" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "冲浪板007" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "罗昌平", + "target": "心若善至" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "NKmilitaryStudies", + "target": "agents博" + }, + { + "source": "战争史研究WHS", + "target": "NKmilitaryStudies" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "风花雪月去" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "小LIU仔" + }, + { + "source": "投行老人", + "target": "james7band" + }, + { + "source": "新浪体育", + "target": "投行老人" + }, + { + "source": "喷嚏网铂程", + "target": "pmzqld" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "步行者001" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "降夭除魔齐天大圣", + "target": "千手捉鸡_" + }, + { + "source": "新浪体育", + "target": "降夭除魔齐天大圣" + }, + { + "source": "Tiger公子", + "target": "撒旦尖角" + }, + { + "source": "简木生--包丰瀛", + "target": "Tiger公子" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "新浪体育", + "target": "浪客不行" + }, + { + "source": "新浪体育", + "target": "Unique斯通" + }, + { + "source": "新浪体育", + "target": "岁月哥特" + }, + { + "source": "新浪体育", + "target": "呆毛哼" + }, + { + "source": "新浪体育", + "target": "史小臭迷途中寻觅" + }, + { + "source": "战争史研究WHS", + "target": "entaro" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "xbftslh" + }, + { + "source": "战争史研究WHS", + "target": "洪七公--36" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "约伯少木" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "吉四六", + "target": "自由知新" + }, + { + "source": "战争史研究WHS", + "target": "吉四六" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "红藕香残玉簟秋allaboutyou" + }, + { + "source": "麻黑浮云", + "target": "邓先渝" + }, + { + "source": "京城吃货日记", + "target": "麻黑浮云" + }, + { + "source": "方便卫生起效慢", + "target": "京城吃货日记" + }, + { + "source": "战争史研究WHS", + "target": "方便卫生起效慢" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "麻黑浮云", + "target": "邓先渝" + }, + { + "source": "胖猪猪呼呼睡", + "target": "麻黑浮云" + }, + { + "source": "麻黑浮云", + "target": "胖猪猪呼呼睡" + }, + { + "source": "新浪体育", + "target": "麻黑浮云" + }, + { + "source": "张晨初艺术空间", + "target": "我与鱼儿" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "耳光赵荒唐", + "target": "陪你疯到天涯海角" + }, + { + "source": "战争史研究WHS", + "target": "耳光赵荒唐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "秋天的完美生活" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "村长一路走好cl" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "今天你FGO咸鱼了么" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "北大十五" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "-胖小子-" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "Tiger公子", + "target": "小钱钱飞来招财进宝" + }, + { + "source": "简木生--包丰瀛", + "target": "Tiger公子" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "战争史研究WHS", + "target": "见习魔王" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "农行小桂圆" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "马周扬律师", + "target": "刘大来律师" + }, + { + "source": "新浪体育", + "target": "马周扬律师" + }, + { + "source": "战争史研究WHS", + "target": "邓先渝" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "国术促进会吴彬" + }, + { + "source": "新浪体育", + "target": "一个立派又迷人的营销号手机用户" + }, + { + "source": "战争史研究WHS", + "target": "霄緰鳴" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "parenthesisZ" + }, + { + "source": "新浪体育", + "target": "POPOVISION" + }, + { + "source": "新浪体育", + "target": "快刀博士" + }, + { + "source": "喷嚏网铂程", + "target": "猪头三小队长" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "bobbeido" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "战争史研究WHS", + "target": "oldharry" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "罗昌平", + "target": "江心洲的石头" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "吉四六", + "target": "Tachikoma1990" + }, + { + "source": "战争史研究WHS", + "target": "吉四六" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "木子东冉" + }, + { + "source": "战争史研究WHS", + "target": "Infi2015" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "lfx160219", + "target": "北大白马96613" + }, + { + "source": "开老爷车的熊", + "target": "lfx160219" + }, + { + "source": "新浪体育", + "target": "开老爷车的熊" + }, + { + "source": "", + "target": "减法生活女子减压生活会馆" + }, + { + "source": "新浪体育", + "target": "" + }, + { + "source": "战争史研究WHS", + "target": "大雄不太爱说话" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "关乎牙齿更关心你" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "降夭除魔齐天大圣", + "target": "没事瞎扑腾_勇敢的乱飞_197" + }, + { + "source": "新浪体育", + "target": "降夭除魔齐天大圣" + }, + { + "source": "新浪体育", + "target": "通古鬼斯" + }, + { + "source": "天水2院张医生", + "target": "找北的时光" + }, + { + "source": "暗能量泡泡", + "target": "天水2院张医生" + }, + { + "source": "X_iao樓", + "target": "暗能量泡泡" + }, + { + "source": "新浪体育", + "target": "X_iao樓" + }, + { + "source": "罗昌平", + "target": "坚心耐苦" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "HS_Hanson" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "降夭除魔齐天大圣", + "target": "五只fffff菌" + }, + { + "source": "新浪体育", + "target": "降夭除魔齐天大圣" + }, + { + "source": "张晨初艺术空间", + "target": "登州笑笑生" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "北斗之南V" + }, + { + "source": "吉四六", + "target": "大眼李" + }, + { + "source": "战争史研究WHS", + "target": "吉四六" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "吉四六", + "target": "杨术灵的公司是在香港注册的" + }, + { + "source": "战争史研究WHS", + "target": "吉四六" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "Petter大俠" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "新浪体育", + "target": "用户6101624258" + }, + { + "source": "战争史研究WHS", + "target": "BOSS大泡泡" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "降夭除魔齐天大圣" + }, + { + "source": "战争史研究WHS", + "target": "michelle0706" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "止于涂" + }, + { + "source": "战争史研究WHS", + "target": "已过期的凤梨罐头" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "吉四六", + "target": "Justice_Sum" + }, + { + "source": "战争史研究WHS", + "target": "吉四六" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "麻黑浮云", + "target": "流云涛影的空间" + }, + { + "source": "战争史研究WHS", + "target": "麻黑浮云" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "和平与蛋黄酱" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "赵家周报" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "NKmilitaryStudies" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "偏不见就叫偏不见" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "新浪体育", + "target": "軟Sir你病得不輕為啥還放棄治療" + }, + { + "source": "张晨初艺术空间", + "target": "一路上有你LXING" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "萨特5243280580" + }, + { + "source": "战争史研究WHS", + "target": "吉四六" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "避难所小子爱喝核子可乐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "在一起的围脖" + }, + { + "source": "战争史研究WHS", + "target": "夜半幽灵" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "会瘦的兔子" + }, + { + "source": "新浪体育", + "target": "Tony悟空孙" + }, + { + "source": "罗昌平", + "target": "2017-5serieS" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "新浪体育", + "target": "zds小懒" + }, + { + "source": "耳光赵荒唐", + "target": "九又十三分之一" + }, + { + "source": "战争史研究WHS", + "target": "耳光赵荒唐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "喷嚏网铂程", + "target": "运交华盖2013" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "西瓜大将" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "无心耳语08", + "target": "阿特兰蒂斯的飞鸟" + }, + { + "source": "战争史研究WHS", + "target": "无心耳语08" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "歌手亚东", + "target": "心雨3266917092" + }, + { + "source": "新浪体育", + "target": "歌手亚东" + }, + { + "source": "Tiger公子", + "target": "饱饱的酸菜君" + }, + { + "source": "简木生--包丰瀛", + "target": "Tiger公子" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "战争史研究WHS", + "target": "阿特兰蒂斯的飞鸟" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "曾经莱克今星敦" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "Camel3942", + "target": "showdfg" + }, + { + "source": "战争史研究WHS", + "target": "Camel3942" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "孟加拉虎的BLOG", + "target": "佬俚伺" + }, + { + "source": "新浪体育", + "target": "孟加拉虎的BLOG" + }, + { + "source": "相忘于2222", + "target": "盖世英雄_i" + }, + { + "source": "新浪体育", + "target": "相忘于2222" + }, + { + "source": "新浪体育", + "target": "坦帕湾魔鬼鱼" + }, + { + "source": "新浪体育", + "target": "Strong明丶" + }, + { + "source": "战争史研究WHS", + "target": "TreeHole2017" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "dgxbill" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "重工组长于彦舒", + "target": "王霸丑" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "甲古的时代" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "huangky2013" + }, + { + "source": "战争史研究WHS", + "target": "于小文很跋扈" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "LAIZHONGYAO" + }, + { + "source": "战争史研究WHS", + "target": "大连地果" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "暮色柳塘" + }, + { + "source": "上局沪段_沪", + "target": "春分大寒" + }, + { + "source": "战争史研究WHS", + "target": "上局沪段_沪" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "猫饭P", + "target": "月想夜雫" + }, + { + "source": "重工组长于彦舒", + "target": "猫饭P" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "醇淨氺" + }, + { + "source": "战争史研究WHS", + "target": "李白起" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "北京金戈戈", + "target": "财罗湖" + }, + { + "source": "新浪体育", + "target": "北京金戈戈" + }, + { + "source": "新浪体育", + "target": "兴盛泰" + }, + { + "source": "张晨初艺术空间", + "target": "金粉洒家" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "光辉岁月0927" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "张晨初艺术空间", + "target": "大烧饼学炒股" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "喷嚏网铂程", + "target": "Wcqsoil奇" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "新浪体育", + "target": "站在天桥数车灯儿" + }, + { + "source": "战争史研究WHS", + "target": "RX-78-8" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "喷嚏网铂程", + "target": "来自TTY" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "新浪体育", + "target": "终南金刚" + }, + { + "source": "战争史研究WHS", + "target": "烈日下的森岛" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "一任年华度如禅" + }, + { + "source": "战争史研究WHS", + "target": "鑦赟驜鶴" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "片桂hoho嘎" + }, + { + "source": "新浪体育", + "target": "各路英雄我是炮灰" + }, + { + "source": "战争史研究WHS", + "target": "阿腿-人活着就是为了式姐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "my686" + }, + { + "source": "重工组长于彦舒", + "target": "乔那个疯子" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "Very流浪的小拖鞋" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "鬼面绣裁", + "target": "叶拂衣_" + }, + { + "source": "战争史研究WHS", + "target": "鬼面绣裁" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "阿腿-人活着就是为了式姐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "北京利生体育商厦" + }, + { + "source": "相忘于2222", + "target": "饕餮海" + }, + { + "source": "新浪体育", + "target": "相忘于2222" + }, + { + "source": "新浪体育", + "target": "锦衣夜行452" + }, + { + "source": "战争史研究WHS", + "target": "ARS_锋线今天补齐了么" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "新浪体育", + "target": "宋燕不v" + }, + { + "source": "麻黑浮云", + "target": "呛呛枪" + }, + { + "source": "胖猪猪呼呼睡", + "target": "麻黑浮云" + }, + { + "source": "麻黑浮云", + "target": "胖猪猪呼呼睡" + }, + { + "source": "新浪体育", + "target": "麻黑浮云" + }, + { + "source": "战争史研究WHS", + "target": "架梁公" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "绵绵绵绵甜" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "麻黑浮云", + "target": "TroubleKid是MADAO" + }, + { + "source": "战争史研究WHS", + "target": "麻黑浮云" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "新浪体育", + "target": "冷炜" + }, + { + "source": "战争史研究WHS", + "target": "信近言复" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "武人影像" + }, + { + "source": "战争史研究WHS", + "target": "ZY真人吉光片羽" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "ROCK在民大" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "钟涓之" + }, + { + "source": "重工组长于彦舒", + "target": "DR-pepper大魔王" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "剡溪山君" + }, + { + "source": "张晨初艺术空间", + "target": "顺势旺" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "优质羊毛", + "target": "buyueeeee" + }, + { + "source": "紫霄时雨_苍穹要塞难民", + "target": "优质羊毛" + }, + { + "source": "長滒", + "target": "紫霄时雨_苍穹要塞难民" + }, + { + "source": "新浪体育", + "target": "長滒" + }, + { + "source": "新浪体育", + "target": "喜欢YY的城墙鸡" + }, + { + "source": "鬼面绣裁", + "target": "月下桃花枝" + }, + { + "source": "战争史研究WHS", + "target": "鬼面绣裁" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "师律伟王" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "新浪体育", + "target": "郑顺天" + }, + { + "source": "新浪体育", + "target": "路痴Lee" + }, + { + "source": "罗昌平", + "target": "小小真菌" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "Xiao-斌杰", + "target": "蒋某people" + }, + { + "source": "战争史研究WHS", + "target": "Xiao-斌杰" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "ParPar2011" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "北京金戈戈", + "target": "简单感-悟" + }, + { + "source": "新浪体育", + "target": "北京金戈戈" + }, + { + "source": "战争史研究WHS", + "target": "aeo000000" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "优质羊毛", + "target": "buyueeeee" + }, + { + "source": "紫霄时雨_苍穹要塞难民", + "target": "优质羊毛" + }, + { + "source": "長滒", + "target": "紫霄时雨_苍穹要塞难民" + }, + { + "source": "新浪体育", + "target": "長滒" + }, + { + "source": "暗能量泡泡", + "target": "天水2院张医生" + }, + { + "source": "X_iao樓", + "target": "暗能量泡泡" + }, + { + "source": "新浪体育", + "target": "X_iao樓" + }, + { + "source": "苗条的小实", + "target": "67年生人的记忆碎片" + }, + { + "source": "新浪体育", + "target": "苗条的小实" + }, + { + "source": "战争史研究WHS", + "target": "苏乄小溪" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "黄俄罗斯志愿兵" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "WeiGuan-Gworld" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "阳光的小青年123" + }, + { + "source": "喷嚏网铂程", + "target": "TerryYin_S" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "新浪体育", + "target": "某气又方又圆" + }, + { + "source": "北京金戈戈", + "target": "宝蛋她娘" + }, + { + "source": "新浪体育", + "target": "北京金戈戈" + }, + { + "source": "新浪体育", + "target": "WS_WBZ" + }, + { + "source": "战争史研究WHS", + "target": "鳯逑凰" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "刘海哲" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "纪岚挺" + }, + { + "source": "Syfannn", + "target": "风起来停不下来" + }, + { + "source": "罗昌平", + "target": "Syfannn" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "耳光赵荒唐", + "target": "赵不着调调儿" + }, + { + "source": "战争史研究WHS", + "target": "耳光赵荒唐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "麻黑浮云", + "target": "满清十大酷刑" + }, + { + "source": "战争史研究WHS", + "target": "麻黑浮云" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "东168168168" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "_nearly转1", + "target": "开大招时会喵喵叫的friend" + }, + { + "source": "麻黑浮云", + "target": "_nearly转1" + }, + { + "source": "战争史研究WHS", + "target": "麻黑浮云" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "VC火星人" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "换名字也不行" + }, + { + "source": "战争史研究WHS", + "target": "流星弦月" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "Howard_Qian" + }, + { + "source": "紹灝Lam", + "target": "流星弦月" + }, + { + "source": "新浪体育", + "target": "紹灝Lam" + }, + { + "source": "战争史研究WHS", + "target": "成都大河" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "大漠孤烟平凉" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "新浪体育", + "target": "原始超越者2016" + }, + { + "source": "罗昌平", + "target": "人生录音" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "中出宪政柏拉图", + "target": "柒vidy" + }, + { + "source": "加菲杰克", + "target": "中出宪政柏拉图" + }, + { + "source": "堕落熊猫001", + "target": "加菲杰克" + }, + { + "source": "张晨初艺术空间", + "target": "堕落熊猫001" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "硕爱1篮球阿阿" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "新浪体育", + "target": "马周扬律师" + }, + { + "source": "耳光赵荒唐", + "target": "嬉皮笑脸者说" + }, + { + "source": "战争史研究WHS", + "target": "耳光赵荒唐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "三尺之上有神明" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "谁执流素舞青月" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "耳光赵荒唐", + "target": "落花满衣" + }, + { + "source": "战争史研究WHS", + "target": "耳光赵荒唐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "手机用户2011685586" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "乐_扬" + }, + { + "source": "麻黑浮云", + "target": "用户5989473265" + }, + { + "source": "战争史研究WHS", + "target": "麻黑浮云" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "Aresous" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "清者自來" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "霁月难逢00" + }, + { + "source": "人形高达奈叶", + "target": "暴君T-233" + }, + { + "source": "新浪体育", + "target": "人形高达奈叶" + }, + { + "source": "新浪体育", + "target": "姚磊-三过七院而不入" + }, + { + "source": "战争史研究WHS", + "target": "yx希望" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "喷嚏网铂程", + "target": "烈酒清茶" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "魔都百姓海幽" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "伤心云雨8" + }, + { + "source": "张晨初艺术空间", + "target": "清清美美" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "老海91816" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "不是宏推大宏推" + }, + { + "source": "战争史研究WHS", + "target": "Gabriel-VN" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "飞廉窝在小院子里养老" + }, + { + "source": "喷嚏网铂程", + "target": "雷电看风云" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "重工组长于彦舒", + "target": "苍天的渔民饥饿的猫" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "天心-月圆" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "麻黑浮云", + "target": "起士林不是我开的" + }, + { + "source": "战争史研究WHS", + "target": "麻黑浮云" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "雨小农和獭祭鱼" + }, + { + "source": "战争史研究WHS", + "target": "搞一手" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "水润嘉华" + }, + { + "source": "新浪体育", + "target": "彪悍猫妈" + }, + { + "source": "战争史研究WHS", + "target": "海獭小元帅" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "老盆" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "万言不值一杯酒" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "-逐梦令-" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "踏古悠悠" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "笨不傻" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "我的牛呢" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "关东十二郎" + }, + { + "source": "喷嚏网铂程", + "target": "来了来了了了" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "嗨哥苏大少", + "target": "富怡-宝盈-盈瑞恒" + }, + { + "source": "新浪体育", + "target": "嗨哥苏大少" + }, + { + "source": "罗昌平", + "target": "于余宇" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "监视狂魔沈夜" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "MrBone" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "麻黑浮云", + "target": "好想骂你煞笔哦" + }, + { + "source": "京城吃货日记", + "target": "麻黑浮云" + }, + { + "source": "方便卫生起效慢", + "target": "京城吃货日记" + }, + { + "source": "战争史研究WHS", + "target": "方便卫生起效慢" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "新浪体育", + "target": "命名馆的故事" + }, + { + "source": "张晨初艺术空间", + "target": "黄鹤2016" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "韩某89" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "谢龙1洋" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "屯里NNRT" + }, + { + "source": "战争史研究WHS", + "target": "OP牛牛real" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "喷嚏网铂程", + "target": "Mirko的blog" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "stephen1999c", + "target": "edelman葛" + }, + { + "source": "战争史研究WHS", + "target": "stephen1999c" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "重工组长于彦舒", + "target": "艾露恩之光" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "上局沪段_沪" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "小德银鳞胸甲" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "格瓦拉切糕" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "JoannaBlue", + "target": "小葱花饼香辣子" + }, + { + "source": "新浪体育", + "target": "JoannaBlue" + }, + { + "source": "sazen", + "target": "黑羽太太薄爷爷" + }, + { + "source": "新浪体育", + "target": "sazen" + }, + { + "source": "新浪体育", + "target": "鋒瘋子" + }, + { + "source": "战争史研究WHS", + "target": "氮气君NegativelyNorm" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "YM0518" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "喷嚏网铂程", + "target": "风_凌羽" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "新浪体育", + "target": "JustForFunDude" + }, + { + "source": "南迦巴瓦的晨曦", + "target": "茜akane茜" + }, + { + "source": "新浪体育", + "target": "南迦巴瓦的晨曦" + }, + { + "source": "新浪体育", + "target": "WOCHIHUN" + }, + { + "source": "战争史研究WHS", + "target": "手自栽" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "大风起兮谣言飞" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "豆名扬", + "target": "愚忠不中" + }, + { + "source": "罗昌平", + "target": "豆名扬" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "M菊花的小GI" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "北京金戈戈", + "target": "铁笛惊龙" + }, + { + "source": "新浪体育", + "target": "北京金戈戈" + }, + { + "source": "新浪体育", + "target": "功夫查理" + }, + { + "source": "战争史研究WHS", + "target": "努力的萨摩" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "相忘于2222", + "target": "关洪导演" + }, + { + "source": "新浪体育", + "target": "相忘于2222" + }, + { + "source": "中出宪政柏拉图", + "target": "-隔壁尛王" + }, + { + "source": "加菲杰克", + "target": "中出宪政柏拉图" + }, + { + "source": "堕落熊猫001", + "target": "加菲杰克" + }, + { + "source": "张晨初艺术空间", + "target": "堕落熊猫001" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "沙漠王子82" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "麻黑浮云", + "target": "经济学原理0904" + }, + { + "source": "胖猪猪呼呼睡", + "target": "麻黑浮云" + }, + { + "source": "麻黑浮云", + "target": "胖猪猪呼呼睡" + }, + { + "source": "新浪体育", + "target": "麻黑浮云" + }, + { + "source": "罗昌平", + "target": "Syfannn" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "喷嚏网铂程", + "target": "传说中滴临时工" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "风雨天骄" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "喷嚏网铂程", + "target": "饽饽瘦了" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "新浪体育", + "target": "三里寻烟" + }, + { + "source": "战争史研究WHS", + "target": "更木千秋" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "战争史研究WHS", + "target": "魔蟹0080" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "X_iao樓", + "target": "暗能量泡泡" + }, + { + "source": "新浪体育", + "target": "X_iao樓" + }, + { + "source": "战争史研究WHS", + "target": "鏡妖星影" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "用户3639916871" + }, + { + "source": "战争史研究WHS", + "target": "带鸡的少侠a" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "竹林风雨来了" + }, + { + "source": "罗昌平", + "target": "山魈屠魔" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "魔都310土匪", + "target": "苍玖染月" + }, + { + "source": "战争史研究WHS", + "target": "魔都310土匪" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "开老爷车的熊", + "target": "暗能量泡泡" + }, + { + "source": "新浪体育", + "target": "开老爷车的熊" + }, + { + "source": "麻黑浮云", + "target": "_nearly转1" + }, + { + "source": "战争史研究WHS", + "target": "麻黑浮云" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "zine692008991" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "Tiger公子", + "target": "木兰007" + }, + { + "source": "简木生--包丰瀛", + "target": "Tiger公子" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "战争史研究WHS", + "target": "snowpanzer" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "吹風左" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "小弟震" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "耳光赵荒唐", + "target": "walbgt" + }, + { + "source": "战争史研究WHS", + "target": "耳光赵荒唐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "MTbuff" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "曾经依然46" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "huaxiawolf" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "天津王麟", + "target": "杨培军ypj" + }, + { + "source": "战争史研究WHS", + "target": "天津王麟" + }, + { + "source": "张欧亚", + "target": "战争史研究WHS" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "成翔-同策咨询" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "新浪体育", + "target": "宋燕不v" + }, + { + "source": "张晨初艺术空间", + "target": "hk2008abc" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "HCHZ2011" + }, + { + "source": "战争史研究WHS", + "target": "Xiao-斌杰" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "田字格大人" + }, + { + "source": "中出宪政柏拉图", + "target": "说你酷" + }, + { + "source": "加菲杰克", + "target": "中出宪政柏拉图" + }, + { + "source": "堕落熊猫001", + "target": "加菲杰克" + }, + { + "source": "张晨初艺术空间", + "target": "堕落熊猫001" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "蝶升思26812" + }, + { + "source": "战争史研究WHS", + "target": "剑吹白雪喵喵酱" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "换个名字好累人", + "target": "D8表情帝" + }, + { + "source": "新浪体育", + "target": "换个名字好累人" + }, + { + "source": "战争史研究WHS", + "target": "_月亮六便士" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "适中求对" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "dengliang100" + }, + { + "source": "战争史研究WHS", + "target": "徐冲dy" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "喷嚏网铂程", + "target": "三分音符V" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "潘恩豪啊潘恩豪" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "被阳光点燃的小雏菊" + }, + { + "source": "新浪体育", + "target": "投行老人" + }, + { + "source": "战争史研究WHS", + "target": "WJHLMM" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "孟加拉虎的BLOG" + }, + { + "source": "战争史研究WHS", + "target": "chariotwx" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "人一定要靠自己" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "简木生--包丰瀛", + "target": "东晓0117" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "耳光赵荒唐", + "target": "罗比巴吉奥" + }, + { + "source": "战争史研究WHS", + "target": "耳光赵荒唐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "说说我的丑" + }, + { + "source": "战争史研究WHS", + "target": "卖蟑螂的小男孩XD" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "喷嚏网铂程" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "新浪体育", + "target": "桃子老爹" + }, + { + "source": "战争史研究WHS", + "target": "幸福就是毛毛雪" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "绿绿绿绿绿到发亮" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "金城白菜斋" + }, + { + "source": "鬼面绣裁", + "target": "谢乘月" + }, + { + "source": "战争史研究WHS", + "target": "鬼面绣裁" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "披着虎皮的羊" + }, + { + "source": "战争史研究WHS", + "target": "薄荷够凉" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "战争史研究WHS", + "target": "飛升法皇嬴曌堃" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "魏屹林" + }, + { + "source": "五十岚空芔", + "target": "雷焰萌虎" + }, + { + "source": "战争史研究WHS", + "target": "五十岚空芔" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "叫我驴驴就好了" + }, + { + "source": "战争史研究WHS", + "target": "爆炸神教唯我独尊" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "雨点儿yang" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "lionshuang" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "李小宝gg" + }, + { + "source": "中出宪政柏拉图", + "target": "阿里海牙科维奇" + }, + { + "source": "加菲杰克", + "target": "中出宪政柏拉图" + }, + { + "source": "堕落熊猫001", + "target": "加菲杰克" + }, + { + "source": "张晨初艺术空间", + "target": "堕落熊猫001" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "activegeneral" + }, + { + "source": "战争史研究WHS", + "target": "UNIMET" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "超级马力0" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "Tiger公子", + "target": "西单骆驼" + }, + { + "source": "简木生--包丰瀛", + "target": "Tiger公子" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "加菲杰克", + "target": "中出宪政柏拉图" + }, + { + "source": "堕落熊猫001", + "target": "加菲杰克" + }, + { + "source": "张晨初艺术空间", + "target": "堕落熊猫001" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "山城球长" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "新浪体育", + "target": "人民舆论V" + }, + { + "source": "战争史研究WHS", + "target": "风清熙" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "诶呀妈呀吓我一跳" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "也曾相识0906" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "魔都310土匪" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "smthpickboy" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "耳光赵荒唐", + "target": "阿瑟queen" + }, + { + "source": "战争史研究WHS", + "target": "耳光赵荒唐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "九州纹龙" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "重工组长于彦舒", + "target": "仇玲夕" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "云自在_安平太" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "tuzixuexi" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "耳光赵荒唐", + "target": "真正的桐柏英雄" + }, + { + "source": "战争史研究WHS", + "target": "耳光赵荒唐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "青鸟tw" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "方便卫生起效慢", + "target": "罗叉叉" + }, + { + "source": "战争史研究WHS", + "target": "方便卫生起效慢" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "信仰之魂之根" + }, + { + "source": "战争史研究WHS", + "target": "WANGJXseEr" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "冬马和纱厨" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "取舍时空" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "香暗盈袖" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "歌手亚东" + }, + { + "source": "战争史研究WHS", + "target": "肺想说话" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "人形高达奈叶" + }, + { + "source": "麻黑浮云", + "target": "书客的马甲" + }, + { + "source": "战争史研究WHS", + "target": "麻黑浮云" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "战争史研究WHS", + "target": "弗温居士" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "IHSAKAH" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "哥是厦大的" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "凌舒韵" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "景页的彭" + }, + { + "source": "战争史研究WHS", + "target": "paxl" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "澳洲李市民", + "target": "bsr1983" + }, + { + "source": "战争史研究WHS", + "target": "澳洲李市民" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "孙润琦最近有点胖啊" + }, + { + "source": "麻黑浮云", + "target": "一头土猪" + }, + { + "source": "新浪体育", + "target": "麻黑浮云" + }, + { + "source": "麻黑浮云", + "target": "若渝与若耶" + }, + { + "source": "京城吃货日记", + "target": "麻黑浮云" + }, + { + "source": "方便卫生起效慢", + "target": "京城吃货日记" + }, + { + "source": "战争史研究WHS", + "target": "方便卫生起效慢" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "新浪体育", + "target": "zzz洋仔" + }, + { + "source": "战争史研究WHS", + "target": "耳光赵荒唐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "牛大腕和羊羔肉" + }, + { + "source": "远古的刀", + "target": "新型的农村人" + }, + { + "source": "张欧亚", + "target": "远古的刀" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "京城吃货日记", + "target": "哥是厦大的" + }, + { + "source": "方便卫生起效慢", + "target": "京城吃货日记" + }, + { + "source": "战争史研究WHS", + "target": "方便卫生起效慢" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "廿五廿六" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "隔岸看风景2016" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "天枢道" + }, + { + "source": "战争史研究WHS", + "target": "Augusttin" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS:图片评论 http", + "target": "宅心似箭" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS:图片评论 http" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "wwwwwww_W" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "毛巾在飞翔" + }, + { + "source": "麻黑浮云", + "target": "WVA亿境战队李嘉炜" + }, + { + "source": "京城吃货日记", + "target": "麻黑浮云" + }, + { + "source": "方便卫生起效慢", + "target": "京城吃货日记" + }, + { + "source": "战争史研究WHS", + "target": "方便卫生起效慢" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "战争史研究WHS", + "target": "钟颙sz" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "長滒", + "target": "二只只" + }, + { + "source": "新浪体育", + "target": "長滒" + }, + { + "source": "罗昌平", + "target": "飛過萬水千山" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "张晨初艺术空间", + "target": "破晓劲风" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "相忘于2222", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "相忘于2222" + }, + { + "source": "战争史研究WHS", + "target": "竹园纤圆" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "古俐特" + }, + { + "source": "新浪体育", + "target": "古城_tma" + }, + { + "source": "新浪体育", + "target": "拖大林的斯拉机" + }, + { + "source": "战争史研究WHS", + "target": "浪里秤砣" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "堕落熊猫001", + "target": "加菲杰克" + }, + { + "source": "张晨初艺术空间", + "target": "堕落熊猫001" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "秋风旅人" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "CDJ37" + }, + { + "source": "新浪体育", + "target": "低碳George" + }, + { + "source": "Tiger公子", + "target": "望霆止渴" + }, + { + "source": "简木生--包丰瀛", + "target": "Tiger公子" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "新浪体育", + "target": "mogu丫头" + }, + { + "source": "麻黑浮云", + "target": "游鱼居士" + }, + { + "source": "胖猪猪呼呼睡", + "target": "麻黑浮云" + }, + { + "source": "麻黑浮云", + "target": "胖猪猪呼呼睡" + }, + { + "source": "新浪体育", + "target": "麻黑浮云" + }, + { + "source": "罗昌平", + "target": "yaozo" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "新浪体育", + "target": "plud2005" + }, + { + "source": "战争史研究WHS", + "target": "李家老三是藕霸" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "上下天光一碧万顷" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "肉食者Play", + "target": "于明乐81489" + }, + { + "source": "新浪体育", + "target": "肉食者Play" + }, + { + "source": "麻黑浮云", + "target": "电击鱼" + }, + { + "source": "京城吃货日记", + "target": "麻黑浮云" + }, + { + "source": "方便卫生起效慢", + "target": "京城吃货日记" + }, + { + "source": "战争史研究WHS", + "target": "方便卫生起效慢" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "新浪体育", + "target": "于贺_" + }, + { + "source": "战争史研究WHS", + "target": "Wilson老张" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "重工组长于彦舒", + "target": "张晨初艺术空间" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "胖猪猪呼呼睡", + "target": "麻黑浮云" + }, + { + "source": "麻黑浮云", + "target": "胖猪猪呼呼睡" + }, + { + "source": "新浪体育", + "target": "麻黑浮云" + }, + { + "source": "战争史研究WHS", + "target": "顺手牵杨扬" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "garfield007" + }, + { + "source": "麻黑浮云", + "target": "单位传达室老张" + }, + { + "source": "新浪体育", + "target": "麻黑浮云" + }, + { + "source": "张晨初艺术空间", + "target": "毛i台钧" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "黄一米八二" + }, + { + "source": "战争史研究WHS", + "target": "穿长靴的柴郡猫" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "子-都" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "南迦巴瓦的晨曦" + }, + { + "source": "新浪体育", + "target": "八一魄力" + }, + { + "source": "罗昌平", + "target": "卅石矷" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "王唔悦", + "target": "Yoga_雪" + }, + { + "source": "新浪体育", + "target": "王唔悦" + }, + { + "source": "战争史研究WHS", + "target": "黑岛结菜厨" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "肉食者Play" + }, + { + "source": "战争史研究WHS", + "target": "風痕2017" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "Tiger公子", + "target": "裸奔老者" + }, + { + "source": "简木生--包丰瀛", + "target": "Tiger公子" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "罗昌平", + "target": "hai17" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "京城吃货日记", + "target": "麻黑浮云" + }, + { + "source": "方便卫生起效慢", + "target": "京城吃货日记" + }, + { + "source": "战争史研究WHS", + "target": "方便卫生起效慢" + }, + { + "source": "新浪体育", + "target": "战争史研究WHS" + }, + { + "source": "新浪体育", + "target": "0ne丶PunCh" + }, + { + "source": "新浪体育", + "target": "AFC-ARS-FANS" + }, + { + "source": "新浪体育", + "target": "嗨哥苏大少" + }, + { + "source": "简木生--包丰瀛", + "target": "Tiger公子" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "战争史研究WHS", + "target": "XTG29" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "BJ卫东围脖" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "TeslaP100" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "千与千寻丶隐" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "知白守黑stock" + }, + { + "source": "新浪体育", + "target": "爱学习的绿叶子" + }, + { + "source": "战争史研究WHS", + "target": "一只饼干熊" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "京城吃货日记", + "target": "变态的小幸福" + }, + { + "source": "方便卫生起效慢", + "target": "京城吃货日记" + }, + { + "source": "战争史研究WHS", + "target": "方便卫生起效慢" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "丘八帮高级会员" + }, + { + "source": "远古的刀", + "target": "周氏豆沙" + }, + { + "source": "张欧亚", + "target": "远古的刀" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "花果山水帘洞齐天大圣0_0" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "福州摄影菌" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "醉生梦死的猫食" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "刘广赟卍" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "offfarmworkes2", + "target": "offfarmworkes2" + }, + { + "source": "战争史研究WHS", + "target": "offfarmworkes2" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "墨子墨子墨子" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "琉璃厂人" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "DaDaDaDaDaDa灰狼" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "麓林山人" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "叫个咩faye" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "麻黑浮云", + "target": "healt" + }, + { + "source": "战争史研究WHS", + "target": "麻黑浮云" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "麻黑浮云", + "target": "山里的孩子去砍柴" + }, + { + "source": "战争史研究WHS", + "target": "麻黑浮云" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "DaDaDaDaDaDa灰狼" + }, + { + "source": "新浪体育", + "target": "我可以咬一口耶" + }, + { + "source": "战争史研究WHS", + "target": "Shawn_River" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "7816呵呵" + }, + { + "source": "张晨初艺术空间", + "target": "平生最怕起名字" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "柳恒卓" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "京城吃货日记", + "target": "吴地老高" + }, + { + "source": "方便卫生起效慢", + "target": "京城吃货日记" + }, + { + "source": "战争史研究WHS", + "target": "方便卫生起效慢" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "买不起早点的门房郑大爷" + }, + { + "source": "罗昌平", + "target": "不吃萝卜的野生鱼" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "xHao晓灏", + "target": "w新晴w" + }, + { + "source": "战争史研究WHS", + "target": "xHao晓灏" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "SofayW" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "燃满愿" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "怀风的小号" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "龍叔論勢" + }, + { + "source": "战争史研究WHS", + "target": "offfarmworkes2" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "天津王麟" + }, + { + "source": "张欧亚", + "target": "战争史研究WHS" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "酋长喊我回家吃饭" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "麻黑浮云", + "target": "英雄爱听故事" + }, + { + "source": "战争史研究WHS", + "target": "麻黑浮云" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "showdfg" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "可爱卫东" + }, + { + "source": "新浪体育", + "target": "文话中国" + }, + { + "source": "战争史研究WHS", + "target": "暖色调的海" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "nevermind39" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "小凯最爱羊羊" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "不读书的撸舔立" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "seven_罗" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "强强187" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "铁的男" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "balestra" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "吴宇森影迷" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "阝东更鑫鑫向荣" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "吃包子喝水" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "方便卫生起效慢", + "target": "京城吃货日记" + }, + { + "source": "战争史研究WHS", + "target": "方便卫生起效慢" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "ORANGE_TULIP_2015__盾构工程" + }, + { + "source": "罗昌平", + "target": "NATUREexploring" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "鋈圆" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "澳洲李市民" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "灰狼多样性", + "target": "Jeff-Chang" + }, + { + "source": "新浪体育", + "target": "灰狼多样性" + }, + { + "source": "战争史研究WHS", + "target": "leo快跑_" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "慈悲为槐" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "王师北定FK" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "JoKer__x1" + }, + { + "source": "战争史研究WHS", + "target": "冯某钊" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "猫团长没有咸鱼" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "wu聊a" + }, + { + "source": "罗昌平", + "target": "豆名扬" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "DaDaDaDaDaDa灰狼" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "北京金戈戈" + }, + { + "source": "战争史研究WHS", + "target": "清古正华" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "Anson余生" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "战争史研究WHS", + "target": "Pengtzuchieh" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "麻黑浮云" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "stephen1999c" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "无穷的探索" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "xHao晓灏" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "renaissance325" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "陈_八怪_" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "惊梦时从来不报社" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "茗品呀茗品" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "马里亚纳的沟" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "方便卫生起效慢" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "做题做到傻星人" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "罗昌平", + "target": "我是伍味子" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "新浪体育", + "target": "流竜馬" + }, + { + "source": "新浪体育", + "target": "海布利的机关枪" + }, + { + "source": "战争史研究WHS", + "target": "五十岚空芔" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "深度脸盲症" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "永强波家的" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "湖南省西瓜甜瓜研究所团支部" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "胖得有气质" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "过去的老照片", + "target": "卓裔人" + }, + { + "source": "尧哥讲笑话", + "target": "过去的老照片" + }, + { + "source": "没籽的葡萄好吃", + "target": "尧哥讲笑话" + }, + { + "source": "新浪体育", + "target": "没籽的葡萄好吃" + }, + { + "source": "战争史研究WHS", + "target": "-_---17---_-" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "tang花_fh7" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "血红暴鲤魚" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "女汉子只是多了一那份坚强錟" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "村头蹲点小流氓" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "飞云乱度_unntopia" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "bmjj777" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "walmazon" + }, + { + "source": "战争史研究WHS", + "target": "来自熊堡" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "假装仁波切糕" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "罗昌平" + }, + { + "source": "新浪体育", + "target": "我想爬出去" + }, + { + "source": "张晨初艺术空间", + "target": "周伯通说话" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "九門道" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "重工组长于彦舒", + "target": "猫屎洞" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "战争史研究WHS", + "target": "毛i台钧" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "CCCCRAZYCAT" + }, + { + "source": "战争史研究WHS", + "target": "米拉库露" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "战争史研究WHS" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "stlxmsl" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "深圳-0755" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "老哥哥农农" + }, + { + "source": "新浪体育", + "target": "筑城小铃铛" + }, + { + "source": "张晨初艺术空间", + "target": "Red-or-Black" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "坚菓青少年俱乐部" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "追风少年何大宝" + }, + { + "source": "新浪体育", + "target": "派大星爱吃锅包肉" + }, + { + "source": "重工组长于彦舒", + "target": "大叔与流浪猫" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "SOLOWINGROCKY" + }, + { + "source": "张晨初艺术空间", + "target": "weibuloser" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张晨初艺术空间", + "target": "汪俊玲_悦宸" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "傅生-若梦" + }, + { + "source": "我们认识", + "target": "未文侯" + }, + { + "source": "Christinez", + "target": "我们认识" + }, + { + "source": "新浪体育", + "target": "Christinez" + }, + { + "source": "重工组长于彦舒", + "target": "秃秃小嘎" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "灰狼多样性" + }, + { + "source": "重工组长于彦舒", + "target": "艾特胖叔叔" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张欧亚", + "target": "张晨初艺术空间" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "白胖浪浪" + }, + { + "source": "新浪体育", + "target": "厐宇峰" + }, + { + "source": "重工组长于彦舒", + "target": "Gen余根" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "梦佳红人" + }, + { + "source": "简木生--包丰瀛", + "target": "一小撮别有用心的小猪在跳舞" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "新浪体育", + "target": "原子CaoYuan" + }, + { + "source": "新浪体育", + "target": "机智的大帅逼" + }, + { + "source": "新浪体育", + "target": "李曼青sattvaUranus" + }, + { + "source": "新浪体育", + "target": "何鑫JO" + }, + { + "source": "lfx160219", + "target": "果果的妈妈" + }, + { + "source": "开老爷车的熊", + "target": "lfx160219" + }, + { + "source": "新浪体育", + "target": "开老爷车的熊" + }, + { + "source": "新浪体育", + "target": "吴足道-alaya" + }, + { + "source": "新浪体育", + "target": "Urnotprepared" + }, + { + "source": "新浪体育", + "target": "糖丶King" + }, + { + "source": "重工组长于彦舒", + "target": "苍狼小幻_" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "静山观海" + }, + { + "source": "新浪体育", + "target": "七親萌貨" + }, + { + "source": "猫饭P", + "target": "江巴瓜poi" + }, + { + "source": "重工组长于彦舒", + "target": "猫饭P" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "静山观海" + }, + { + "source": "新浪体育", + "target": "A优喂" + }, + { + "source": "新浪体育", + "target": "清宇建材" + }, + { + "source": "重工组长于彦舒", + "target": "泥四步撒" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张欧亚", + "target": "远古的刀" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "猿十三", + "target": "丁库北" + }, + { + "source": "重工组长于彦舒", + "target": "猿十三" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "江南岸1217" + }, + { + "source": "重工组长于彦舒", + "target": "看你妹夫斯基" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "廆仆" + }, + { + "source": "重工组长于彦舒", + "target": "160么么哒" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "洪涛观点" + }, + { + "source": "重工组长于彦舒", + "target": "曜冰" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "张欧亚", + "target": "慈禧在坟墓里笑死" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "宋燕不v", + "target": "张欧亚" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "平凡746" + }, + { + "source": "新浪体育", + "target": "嗷嘚儿刘" + }, + { + "source": "简木生--包丰瀛", + "target": "Sher-Conan" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "重工组长于彦舒", + "target": "BiBlBa" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "jinguokai" + }, + { + "source": "新浪体育", + "target": "九河下潲-天子渡口" + }, + { + "source": "新浪体育", + "target": "霍斯勒阿瑟" + }, + { + "source": "重工组长于彦舒", + "target": "噗噜噗噜轰隆隆隆" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "重工组长于彦舒", + "target": "小闫---闫宇航2_167" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "拉拉菲尔尼兹海格" + }, + { + "source": "重工组长于彦舒", + "target": "萧月御诸" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "黑贝的米兔" + }, + { + "source": "新浪体育", + "target": "西班牙荣" + }, + { + "source": "新浪体育", + "target": "那个叫做光的男人真他妈可爱" + }, + { + "source": "新浪体育", + "target": "Panda加速度" + }, + { + "source": "新浪体育", + "target": "慢慢买4j" + }, + { + "source": "重工组长于彦舒", + "target": "坠-绝命大番茄" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "重工组长于彦舒", + "target": "鬼男三世" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "castle84" + }, + { + "source": "紫霄时雨_苍穹要塞难民", + "target": "优质羊毛" + }, + { + "source": "長滒", + "target": "紫霄时雨_苍穹要塞难民" + }, + { + "source": "新浪体育", + "target": "長滒" + }, + { + "source": "新浪体育", + "target": "saxon-90" + }, + { + "source": "新浪体育", + "target": "大虾本尊" + }, + { + "source": "新浪体育", + "target": "拜访者查子" + }, + { + "source": "新浪体育", + "target": "赵毫毛" + }, + { + "source": "新浪体育", + "target": "单刀126" + }, + { + "source": "新浪体育", + "target": "霖希默语" + }, + { + "source": "新浪体育", + "target": "艹丶LOVE丨霸道灬88" + }, + { + "source": "新浪体育", + "target": "爱家庭教师爱篮球爱科比" + }, + { + "source": "新浪体育", + "target": "小骉007" + }, + { + "source": "lfx160219", + "target": "蓝天zjg" + }, + { + "source": "开老爷车的熊", + "target": "lfx160219" + }, + { + "source": "新浪体育", + "target": "开老爷车的熊" + }, + { + "source": "新浪体育", + "target": "青蛙王子199905" + }, + { + "source": "新浪体育", + "target": "生活顺顺利利" + }, + { + "source": "重工组长于彦舒", + "target": "2x2eyes着装变身" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "____-------____________" + }, + { + "source": "新浪体育", + "target": "信仰铮" + }, + { + "source": "新浪体育", + "target": "sekino" + }, + { + "source": "新浪体育", + "target": "HexFireSea" + }, + { + "source": "重工组长于彦舒", + "target": "猫饭P" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "简木生--包丰瀛", + "target": "Digital蚊子" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "重工组长于彦舒", + "target": "神之佩恩" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "重工组长于彦舒", + "target": "宋燕不v" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "Double润-JR" + }, + { + "source": "新浪体育", + "target": "NouWl" + }, + { + "source": "新浪体育", + "target": "IceE_U" + }, + { + "source": "新浪体育", + "target": "一支钥匙一把锁" + }, + { + "source": "新浪体育", + "target": "浪剑痕_秋水尽洗天下劫" + }, + { + "source": "重工组长于彦舒", + "target": "甲壳咪殿下" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "牧羽尽人" + }, + { + "source": "新浪体育", + "target": "米衫儿" + }, + { + "source": "花卷沉湎", + "target": "北京_彬爷" + }, + { + "source": "新浪体育", + "target": "花卷沉湎" + }, + { + "source": "新浪体育", + "target": "MYS_Parker" + }, + { + "source": "新浪体育", + "target": "直抵黄龙府与诸君痛饮尔" + }, + { + "source": "新浪体育", + "target": "名字这么难听" + }, + { + "source": "重工组长于彦舒", + "target": "MKIII_TROMBE" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "重工组长于彦舒", + "target": "吃鲸_满脑子打牌" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "重工组长于彦舒", + "target": "李哈喽年抓虫子" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "重工组长于彦舒", + "target": "吉原嗷子手中一碗张屏的面" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "不会结网的蜘蛛" + }, + { + "source": "新浪体育", + "target": "小超-唐新" + }, + { + "source": "新浪体育", + "target": "CJ一个微博" + }, + { + "source": "lfx160219", + "target": "华府骏苑姜熙健" + }, + { + "source": "开老爷车的熊", + "target": "lfx160219" + }, + { + "source": "新浪体育", + "target": "开老爷车的熊" + }, + { + "source": "新浪体育", + "target": "剑雨风竹wzp" + }, + { + "source": "新浪体育", + "target": "刺猬-的生活" + }, + { + "source": "新浪体育", + "target": "EL-bazinga" + }, + { + "source": "Michael-Cheung-", + "target": "隐隐灵音" + }, + { + "source": "新浪体育", + "target": "Michael-Cheung-" + }, + { + "source": "lfx160219", + "target": "捣蛋少年2016" + }, + { + "source": "开老爷车的熊", + "target": "lfx160219" + }, + { + "source": "新浪体育", + "target": "开老爷车的熊" + }, + { + "source": "重工组长于彦舒", + "target": "琉烟之烬" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "头条股票" + }, + { + "source": "新浪体育", + "target": "八度鱼77" + }, + { + "source": "新浪体育", + "target": "bywang1" + }, + { + "source": "新浪体育", + "target": "寒木9740" + }, + { + "source": "新浪体育", + "target": "不如一朵" + }, + { + "source": "新浪体育", + "target": "牵下水拍照" + }, + { + "source": "新浪体育", + "target": "实用格斗" + }, + { + "source": "新浪体育", + "target": "焖猪脚" + }, + { + "source": "新浪体育", + "target": "奔驰配件只售原厂全新" + }, + { + "source": "重工组长于彦舒", + "target": "七绪平门" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "动物凶猛吗" + }, + { + "source": "重工组长于彦舒", + "target": "皓乙_纯" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "lfx160219", + "target": "鹿允近衛連隊的黑少领要当牛仔了" + }, + { + "source": "开老爷车的熊", + "target": "lfx160219" + }, + { + "source": "新浪体育", + "target": "开老爷车的熊" + }, + { + "source": "新浪体育", + "target": "真同你友缘" + }, + { + "source": "新浪体育", + "target": "黄禾谷" + }, + { + "source": "新浪体育", + "target": "刘志鲲" + }, + { + "source": "lfx160219", + "target": "淘气的小福儿" + }, + { + "source": "开老爷车的熊", + "target": "lfx160219" + }, + { + "source": "新浪体育", + "target": "开老爷车的熊" + }, + { + "source": "爱哟快乐", + "target": "上海曹凡" + }, + { + "source": "我们认识", + "target": "爱哟快乐" + }, + { + "source": "Christinez", + "target": "我们认识" + }, + { + "source": "新浪体育", + "target": "Christinez" + }, + { + "source": "新浪体育", + "target": "云信321312747" + }, + { + "source": "新浪体育", + "target": "樱花突击队" + }, + { + "source": "夏至蟲之音", + "target": "原始超越者2016" + }, + { + "source": "重工组长于彦舒", + "target": "夏至蟲之音" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "長滒", + "target": "紫霄时雨_苍穹要塞难民" + }, + { + "source": "新浪体育", + "target": "長滒" + }, + { + "source": "新浪体育", + "target": "iFandom" + }, + { + "source": "新浪体育", + "target": "自古秃顶多薄命" + }, + { + "source": "VeryE", + "target": "上海曹凡" + }, + { + "source": "爱哟快乐", + "target": "VeryE" + }, + { + "source": "我们认识", + "target": "爱哟快乐" + }, + { + "source": "Christinez", + "target": "我们认识" + }, + { + "source": "新浪体育", + "target": "Christinez" + }, + { + "source": "简木生--包丰瀛", + "target": "木_小呆是个死腐宅" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "重工组长于彦舒", + "target": "小马_1623085" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "读心术宋_Ssir226" + }, + { + "source": "lfx160219", + "target": "广陵古散" + }, + { + "source": "开老爷车的熊", + "target": "lfx160219" + }, + { + "source": "新浪体育", + "target": "开老爷车的熊" + }, + { + "source": "新浪体育", + "target": "赵伯安" + }, + { + "source": "新浪体育", + "target": "非典型精彩" + }, + { + "source": "新浪体育", + "target": "沐之夏吉郎" + }, + { + "source": "新浪体育", + "target": "-梦魂舞晶-" + }, + { + "source": "新浪体育", + "target": "子非鱼非子vit" + }, + { + "source": "过去的老照片", + "target": "我的威海" + }, + { + "source": "尧哥讲笑话", + "target": "过去的老照片" + }, + { + "source": "没籽的葡萄好吃", + "target": "尧哥讲笑话" + }, + { + "source": "新浪体育", + "target": "没籽的葡萄好吃" + }, + { + "source": "新浪体育", + "target": "要酒还是要故事" + }, + { + "source": "开老爷车的熊", + "target": "lfx160219" + }, + { + "source": "新浪体育", + "target": "开老爷车的熊" + }, + { + "source": "新浪体育", + "target": "FullMetalLyle" + }, + { + "source": "新浪体育", + "target": "开拓者3569" + }, + { + "source": "新浪体育", + "target": "斯坦家汪汪" + }, + { + "source": "重工组长于彦舒", + "target": "丿胡丶半仙" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "简木生--包丰瀛", + "target": "破产伍伍陆" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "爱哟快乐", + "target": "VeryE" + }, + { + "source": "我们认识", + "target": "爱哟快乐" + }, + { + "source": "Christinez", + "target": "我们认识" + }, + { + "source": "新浪体育", + "target": "Christinez" + }, + { + "source": "新浪体育", + "target": "一路并肩而行baby" + }, + { + "source": "我们认识", + "target": "爱哟快乐" + }, + { + "source": "Christinez", + "target": "我们认识" + }, + { + "source": "新浪体育", + "target": "Christinez" + }, + { + "source": "重工组长于彦舒", + "target": "短昵称-" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "JoannaBlue" + }, + { + "source": "新浪体育", + "target": "o0勇敢的心0o" + }, + { + "source": "新浪体育", + "target": "没有烟了" + }, + { + "source": "简木生--包丰瀛", + "target": "傲血困意" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "新浪体育", + "target": "人生装修中的王白薯" + }, + { + "source": "新浪体育", + "target": "妙我居士" + }, + { + "source": "新浪体育", + "target": "freeeeekick" + }, + { + "source": "新浪体育", + "target": "不動的大圖書館Q" + }, + { + "source": "新浪体育", + "target": "瑞新新新新" + }, + { + "source": "新浪体育", + "target": "霹雳球球" + }, + { + "source": "新浪体育", + "target": "山顶夫子" + }, + { + "source": "新浪体育", + "target": "長滒" + }, + { + "source": "新浪体育", + "target": "九翼龙皇" + }, + { + "source": "Christinez", + "target": "我们认识" + }, + { + "source": "新浪体育", + "target": "Christinez" + }, + { + "source": "新浪体育", + "target": "就是内个少年" + }, + { + "source": "新浪体育", + "target": "MrFopenheart" + }, + { + "source": "新浪体育", + "target": "梦里自在" + }, + { + "source": "新浪体育", + "target": "文武书书" + }, + { + "source": "天天越野跑", + "target": "JeremyKevin" + }, + { + "source": "新浪体育", + "target": "天天越野跑" + }, + { + "source": "新浪体育", + "target": "看客二两七" + }, + { + "source": "尧哥讲笑话", + "target": "过去的老照片" + }, + { + "source": "没籽的葡萄好吃", + "target": "尧哥讲笑话" + }, + { + "source": "新浪体育", + "target": "没籽的葡萄好吃" + }, + { + "source": "新浪体育", + "target": "笑嘻嘻不是孬东西" + }, + { + "source": "新浪体育", + "target": "奔跑在路上的小猪哥哥" + }, + { + "source": "新浪体育", + "target": "明月照清疯" + }, + { + "source": "新浪体育", + "target": "波灵谷" + }, + { + "source": "重工组长于彦舒", + "target": "零崎本心" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "人总要变僵尸" + }, + { + "source": "简木生--包丰瀛", + "target": "股民资源QQ719554823" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "新浪体育", + "target": "海中的小白鲨" + }, + { + "source": "新浪体育", + "target": "小纯是不穿板甲的狂战" + }, + { + "source": "新浪体育", + "target": "孙松AT" + }, + { + "source": "重工组长于彦舒", + "target": "猿十三" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "重工组长于彦舒", + "target": "中二有治" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "幽径不再悲剧" + }, + { + "source": "简木生--包丰瀛", + "target": "Daybreak_Canal" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "新浪体育", + "target": "门后的风铃" + }, + { + "source": "重工组长于彦舒", + "target": "头喵的妈吃一身" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "花卷沉湎" + }, + { + "source": "新浪体育", + "target": "flowtime" + }, + { + "source": "没籽的葡萄好吃", + "target": "尧哥讲笑话" + }, + { + "source": "新浪体育", + "target": "没籽的葡萄好吃" + }, + { + "source": "新浪体育", + "target": "我叫照日格图" + }, + { + "source": "新浪体育", + "target": "穆sir---" + }, + { + "source": "新浪体育", + "target": "竹林之闲七" + }, + { + "source": "新浪体育", + "target": "想去看看世界的小猴子" + }, + { + "source": "新浪体育", + "target": "时间苍窮" + }, + { + "source": "新浪体育", + "target": "入云伤" + }, + { + "source": "新浪体育", + "target": "Ranyuewan" + }, + { + "source": "新浪体育", + "target": "只愿华丽一次" + }, + { + "source": "新浪体育", + "target": "一百五十斤的维洛妮卡" + }, + { + "source": "简木生--包丰瀛", + "target": "熊宝-咪" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "重工组长于彦舒", + "target": "夏至蟲之音" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "鱼丸粗面" + }, + { + "source": "重工组长于彦舒", + "target": "团子桃子的麻麻" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "简木生--包丰瀛", + "target": "balcktomato" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "新浪体育", + "target": "熬浆糊99" + }, + { + "source": "新浪体育", + "target": "安庆爱慕摄影师阿文" + }, + { + "source": "新浪体育", + "target": "章海波" + }, + { + "source": "新浪体育", + "target": "熬浆糊99" + }, + { + "source": "新浪体育", + "target": "霞客遗风" + }, + { + "source": "新浪体育", + "target": "34X5A7" + }, + { + "source": "新浪体育", + "target": "简木生--包丰瀛" + }, + { + "source": "新浪体育", + "target": "花贰街" + }, + { + "source": "新浪体育", + "target": "孤单一个人去返工II" + }, + { + "source": "新浪体育", + "target": "Cindy是我的" + }, + { + "source": "新浪体育", + "target": "Hu_子叔叔" + }, + { + "source": "重工组长于彦舒", + "target": "东瓜_DONGGUA" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "BooM_讽_刺_" + }, + { + "source": "新浪体育", + "target": "all-time-low" + }, + { + "source": "重工组长于彦舒", + "target": "LP呆啊呆" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "Michael刘磊" + }, + { + "source": "新浪体育", + "target": "君王板甲胡屠户" + }, + { + "source": "新浪体育", + "target": "光明家具刘志军" + }, + { + "source": "重工组长于彦舒", + "target": "MADAO兽-UP" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "重工组长于彦舒", + "target": "Cal_liu" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "重工组长于彦舒", + "target": "镜花水月137" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "上善若水_waterliker" + }, + { + "source": "重工组长于彦舒", + "target": "FLAX_圩田经济学安心种地" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "重工组长于彦舒", + "target": "王小签" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "MR-WANGRX" + }, + { + "source": "新浪体育", + "target": "美丽居曹亮" + }, + { + "source": "新浪体育", + "target": "拖拉机再垃圾也能拖垃圾H" + }, + { + "source": "新浪体育", + "target": "只道是寻常草履虫" + }, + { + "source": "新浪体育", + "target": "最近很无聊---" + }, + { + "source": "新浪体育", + "target": "HERO-熊" + }, + { + "source": "新浪体育", + "target": "床保社" + }, + { + "source": "重工组长于彦舒", + "target": "超昂闪存" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "天天越野跑" + }, + { + "source": "新浪体育", + "target": "大伟MADSam" + }, + { + "source": "重工组长于彦舒", + "target": "谷子地Dwane" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "王小硕的小马甲" + }, + { + "source": "Christinez", + "target": "三口一瓶奶" + }, + { + "source": "新浪体育", + "target": "Christinez" + }, + { + "source": "重工组长于彦舒", + "target": "HBG_喵" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "李狗嗨ing" + }, + { + "source": "重工组长于彦舒", + "target": "Eye2eyes" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "后仓松鼠" + }, + { + "source": "重工组长于彦舒", + "target": "ERLIANGJO" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "捆着发木ALT" + }, + { + "source": "重工组长于彦舒", + "target": "激素少女陈一水" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + }, + { + "source": "新浪体育", + "target": "恩里克" + }, + { + "source": "新浪体育", + "target": "没籽的葡萄好吃" + }, + { + "source": "新浪体育", + "target": "偶尔有点帅1988" + }, + { + "source": "新浪体育", + "target": "开老爷车的熊" + }, + { + "source": "新浪体育", + "target": "北辰慢慢跑" + }, + { + "source": "新浪体育", + "target": "Mitsuhide明智" + }, + { + "source": "新浪体育", + "target": "不记得今天是礼拜几" + }, + { + "source": "新浪体育", + "target": "耗社会主义股市羊毛" + }, + { + "source": "新浪体育", + "target": "Christinez" + }, + { + "source": "新浪体育", + "target": "Mr-LeeZL" + }, + { + "source": "新浪体育", + "target": "给美希庆生的P_卡卡" + }, + { + "source": "新浪体育", + "target": "重工组长于彦舒" + } + ], + [{ + "name": "" + }, + { + "name": "Camel3942" + }, + { + "name": "Christinez" + }, + { + "name": "JoannaBlue" + }, + { + "name": "Michael-Cheung-" + }, + { + "name": "NKmilitaryStudies" + }, + { + "name": "Syfannn" + }, + { + "name": "Tiger公子" + }, + { + "name": "VeryE" + }, + { + "name": "X_iao樓" + }, + { + "name": "Xiao-斌杰" + }, + { + "name": "_nearly转1" + }, + { + "name": "lfx160219" + }, + { + "name": "offfarmworkes2" + }, + { + "name": "sazen" + }, + { + "name": "stephen1999c" + }, + { + "name": "w新晴w" + }, + { + "name": "xHao晓灏" + }, + { + "name": "上局沪段_沪" + }, + { + "name": "中出宪政柏拉图" + }, + { + "name": "中华龙会" + }, + { + "name": "五十岚空芔" + }, + { + "name": "京城吃货日记" + }, + { + "name": "人形高达奈叶" + }, + { + "name": "优质羊毛" + }, + { + "name": "加菲杰克" + }, + { + "name": "北京金戈戈" + }, + { + "name": "南迦巴瓦的晨曦" + }, + { + "name": "吉四六" + }, + { + "name": "喷嚏网铂程" + }, + { + "name": "嗨哥苏大少" + }, + { + "name": "堕落熊猫001" + }, + { + "name": "夏至蟲之音" + }, + { + "name": "天天越野跑" + }, + { + "name": "天水2院张医生" + }, + { + "name": "天津王麟" + }, + { + "name": "孟加拉虎的BLOG" + }, + { + "name": "宋燕不v" + }, + { + "name": "尧哥讲笑话" + }, + { + "name": "开老爷车的熊" + }, + { + "name": "张晨初艺术空间" + }, + { + "name": "张欧亚" + }, + { + "name": "我们认识" + }, + { + "name": "战争史研究WHS" + }, + { + "name": "战争史研究WHS:图片评论 http" + }, + { + "name": "投行老人" + }, + { + "name": "换个名字好累人" + }, + { + "name": "新浪体育" + }, + { + "name": "方便卫生起效慢" + }, + { + "name": "无心耳语08" + }, + { + "name": "暗能量泡泡" + }, + { + "name": "歌手亚东" + }, + { + "name": "没籽的葡萄好吃" + }, + { + "name": "澳洲李市民" + }, + { + "name": "灰狼多样性" + }, + { + "name": "爱哟快乐" + }, + { + "name": "猫饭P" + }, + { + "name": "猿十三" + }, + { + "name": "王唔悦" + }, + { + "name": "相忘于2222" + }, + { + "name": "简木生--包丰瀛" + }, + { + "name": "紫霄时雨_苍穹要塞难民" + }, + { + "name": "紹灝Lam" + }, + { + "name": "罗昌平" + }, + { + "name": "耳光赵荒唐" + }, + { + "name": "肉食者Play" + }, + { + "name": "胖猪猪呼呼睡" + }, + { + "name": "花卷沉湎" + }, + { + "name": "苗条的小实" + }, + { + "name": "豆名扬" + }, + { + "name": "过去的老照片" + }, + { + "name": "远古的刀" + }, + { + "name": "重工组长于彦舒" + }, + { + "name": "長滒" + }, + { + "name": "陇上优品-陶磊" + }, + { + "name": "降夭除魔齐天大圣" + }, + { + "name": "马周扬律师" + }, + { + "name": "鬼面绣裁" + }, + { + "name": "魔都310土匪" + }, + { + "name": "麻黑浮云" + } + ], + "#搏击VS太极# 近日武林不是很太平,争论也很多[思考]有网友翻出前全运会武术冠军、著名演员@李连杰 接受杨澜专访时说的话,李连杰认为武术套路就是花架子——“当然\n了”,不是杀人的功夫。因为现在不再需要真功夫了,所谓的真功夫就是杀人最快的方法。 http://t.cn/RXgIUxg . ​", + "4102228300324979", + "新浪体育" +] \ No newline at end of file diff --git a/test/requirements.txt b/test/requirements.txt new file mode 100644 index 000000000..563f81bee --- /dev/null +++ b/test/requirements.txt @@ -0,0 +1,11 @@ +nose +codecov +coverage +pandas +numpy +jupyter +flake8 +mock;python_version<"3" +echarts-countries-pypkg +echarts-china-cities-pypkg +echarts-china-provinces-pypkg diff --git a/test/test.py b/test/test.py deleted file mode 100644 index e5a4b14f5..000000000 --- a/test/test.py +++ /dev/null @@ -1,15 +0,0 @@ - -from .test_bar import test_bar -from .test_effectscatter import test_effectscatter -from .test_funnel import test_funnel -from .test_gauge import test_gague -from .test_geo import test_geo -from .test_graph import test_graph -from .test_line import test_line -from .test_map import test_map -from .test_parallel import test_parallel -from .test_pie import test_pie -from .test_polar import test_polar -from .test_radar import test_radar -from .test_scatter import test_scatter -from .test_wordcloud import test_wordcloud diff --git a/test/test_bar.py b/test/test_bar.py index d996f2020..cd6d68c5c 100644 --- a/test/test_bar.py +++ b/test/test_bar.py @@ -1,16 +1,111 @@ -from pyecharts import Bar, Line - -def test_bar(): - attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] - v1 = [5, 20, 36, 10, 75, 90] - v2 = [10, 25, 8, 60, 20, 80] - v3 = [first + second + 35 for first, second in zip(v1, v2)] - - bar = Bar("TITLE", "SUBTITLE") - bar.add("B", attr, v2, isstack=True) - bar.add("A", attr, v1, label_text_size=20, isstack=True) - line = Line() - line.add("C", attr, v3, label_text_size=20) - bar.custom(line.get_series()) - bar.show_config() - bar.render("e:/xx.html") +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals + +import random + +from pyecharts import Bar +from test.constants import CLOTHES + +clothes_v1 = [5, 20, 36, 10, 75, 90] +clothes_v2 = [10, 25, 8, 60, 20, 80] + + +def test_bar_stack(): + bar = Bar("柱状图数据堆叠示例") + bar.add("商家A", CLOTHES, clothes_v1, is_stack=True) + bar.add("商家B", CLOTHES, clothes_v2, is_stack=True) + bar.chart_id = 'id_chart_id' + html_content = bar._repr_html_() + assert 'id_chart_id' == bar.chart_id + assert "dataZoom" not in html_content + assert "stack_" in html_content + + +def test_bar_marks(): + bar = Bar("标记线和标记点示例") + bar.add("商家A", CLOTHES, clothes_v1, mark_point=["average"]) + bar.add("商家B", CLOTHES, clothes_v2, mark_line=["min", "max"]) + assert '"average"' in bar._repr_html_() + + +def test_bar_convert_xy_axis(): + bar = Bar("x 轴和 y 轴交换") + bar.add("商家A", CLOTHES, clothes_v1) + bar.add("商家B", CLOTHES, clothes_v2, is_convert=True) + assert "average" not in bar._repr_html_() + + +def test_bar_histogram(): + bar = Bar("直方图示例") + bar.add("", CLOTHES * 2, clothes_v1 + clothes_v2, bar_category_gap=0) + bar.render() + + +def test_bar_rotate_label(): + days = ["{}天".format(i) for i in range(20)] + days_v1 = [random.randint(1, 20) for _ in range(20)] + bar = Bar("坐标轴标签旋转示例") + bar.add("", days, days_v1, xaxis_interval=0, xaxis_rotate=30, + yaxis_rotate=30) + assert "stack_" not in bar._repr_html_() + + +def test_bar_waterfall(): + months = ["{}月".format(i) for i in range(1, 8)] + months_v1 = [0, 100, 200, 300, 400, 220, 250] + months_v2 = [1000, 800, 600, 500, 450, 400, 300] + bar = Bar("瀑布图示例") + bar.add("", months, months_v1, label_color=['rgba(0,0,0,0)'], + is_stack=True) + bar.add("月份", months, months_v2, is_label_show=True, is_stack=True, + label_pos='inside') + bar.render() + + +def test_bar_datazoom_undefined(): + days = ["{}天".format(i) for i in range(30)] + days_v1 = [random.randint(1, 30) for _ in range(30)] + bar = Bar("Bar - datazoom 默认 示例") + bar.add("", days, days_v1, is_label_show=True, is_datazoom_show=True) + html_content = bar._repr_html_() + assert "dataZoom" in html_content + assert ': "slider"' in html_content + assert ': "inside"' not in html_content + + +def test_bar_datazoom_slider(): + days = ["{}天".format(i) for i in range(30)] + days_v1 = [random.randint(1, 30) for _ in range(30)] + bar = Bar("Bar - datazoom 示例") + bar.add("", days, days_v1, is_datazoom_show=True, + datazoom_type='slider', datazoom_range=[10, 25]) + html_content = bar._repr_html_() + assert "dataZoom" in html_content + assert ': "slider"' in html_content + assert ': "inside"' not in html_content + + +def test_bar_datazoom_inside(): + days = ["{}天".format(i) for i in range(30)] + days_v1 = [random.randint(1, 30) for _ in range(30)] + bar = Bar("Bar - datazoom - inside 示例") + bar.add("", days, days_v1, is_datazoom_show=True, + datazoom_type='inside', datazoom_range=[10, 25]) + html_content = bar._repr_html_() + assert "dataZoom" in html_content + assert ': "inside"' in html_content + assert ': "slider"' not in html_content + + +def test_bar_datazoom_both(): + days = ["{}天".format(i) for i in range(30)] + days_v1 = [random.randint(1, 30) for _ in range(30)] + bar = Bar("Bar - datazoom - both 示例") + bar.add("", days, days_v1, is_datazoom_show=True, + datazoom_type='both', datazoom_range=[10, 25], + is_toolbox_show=False) + html_content = bar._repr_html_() + assert "dataZoom" in html_content + assert ': "inside"' in html_content + assert ': "slider"' in html_content diff --git a/test/test_bar3D.py b/test/test_bar3D.py new file mode 100644 index 000000000..7e3e88ce3 --- /dev/null +++ b/test/test_bar3D.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals + +from pyecharts import Bar3D +from nose.tools import eq_ +from test.constants import RANGE_COLOR, X_TIME, Y_WEEK + + +data = [ + [0, 0, 5], [0, 1, 1], [0, 2, 0], [0, 3, 0], [0, 4, 0], [0, 5, 0], + [0, 6, 0], [0, 7, 0], [0, 8, 0], [0, 9, 0], [0, 10, 0], [0, 11, 2], + [0, 12, 4], [0, 13, 1], [0, 14, 1], [0, 15, 3], [0, 16, 4], [0, 17, 6], + [0, 18, 4], [0, 19, 4], [0, 20, 3], [0, 21, 3], [0, 22, 2], [0, 23, 5], + [1, 0, 7], [1, 1, 0], [1, 2, 0], [1, 3, 0], [1, 4, 0], [1, 5, 0], + [1, 6, 0], [1, 7, 0], [1, 8, 0], [1, 9, 0], [1, 10, 5], [1, 11, 2], + [1, 12, 2], [1, 13, 6], [1, 14, 9], [1, 15, 11], [1, 16, 6], [1, 17, 7], + [1, 18, 8], [1, 19, 12], [1, 20, 5], [1, 21, 5], [1, 22, 7], [1, 23, 2], + [2, 0, 1], [2, 1, 1], [2, 2, 0], [2, 3, 0], [2, 4, 0], [2, 5, 0], + [2, 6, 0], [2, 7, 0], [2, 8, 0], [2, 9, 0], [2, 10, 3], [2, 11, 2], + [2, 12, 1], [2, 13, 9], [2, 14, 8], [2, 15, 10], [2, 16, 6], [2, 17, 5], + [2, 18, 5], [2, 19, 5], [2, 20, 7], [2, 21, 4], [2, 22, 2], [2, 23, 4], + [3, 0, 7], [3, 1, 3], [3, 2, 0], [3, 3, 0], [3, 4, 0], [3, 5, 0], + [3, 6, 0], [3, 7, 0], [3, 8, 1], [3, 9, 0], [3, 10, 5], [3, 11, 4], + [3, 12, 7], [3, 13, 14], [3, 14, 13], [3, 15, 12], [3, 16, 9], [3, 17, 5], + [3, 18, 5], [3, 19, 10], [3, 20, 6], [3, 21, 4], [3, 22, 4], [3, 23, 1], + [4, 0, 1], [4, 1, 3], [4, 2, 0], [4, 3, 0], [4, 4, 0], [4, 5, 1], + [4, 6, 0], [4, 7, 0], [4, 8, 0], [4, 9, 2], [4, 10, 4], [4, 11, 4], + [4, 12, 2], [4, 13, 4], [4, 14, 4], [4, 15, 14], [4, 16, 12], [4, 17, 1], + [4, 18, 8], [4, 19, 5], [4, 20, 3], [4, 21, 7], [4, 22, 3], [4, 23, 0], + [5, 0, 2], [5, 1, 1], [5, 2, 0], [5, 3, 3], [5, 4, 0], [5, 5, 0], + [5, 6, 0], [5, 7, 0], [5, 8, 2], [5, 9, 0], [5, 10, 4], [5, 11, 1], + [5, 12, 5], [5, 13, 10], [5, 14, 5], [5, 15, 7], [5, 16, 11], [5, 17, 6], + [5, 18, 0], [5, 19, 5], [5, 20, 3], [5, 21, 4], [5, 22, 2], [5, 23, 0], + [6, 0, 1], [6, 1, 0], [6, 2, 0], [6, 3, 0], [6, 4, 0], [6, 5, 0], + [6, 6, 0], [6, 7, 0], [6, 8, 0], [6, 9, 0], [6, 10, 1], [6, 11, 0], + [6, 12, 2], [6, 13, 1], [6, 14, 3], [6, 15, 4], [6, 16, 0], [6, 17, 0], + [6, 18, 0], [6, 19, 0], [6, 20, 1], [6, 21, 2], [6, 22, 2], [6, 23, 6] +] + + +def test_bar3d_default(): + bar3d = Bar3D("3D 柱状图示例", width=1200, height=600) + bar3d.add("", X_TIME, Y_WEEK, [[d[1], d[0], d[2]] for d in data], + is_visualmap=True, visual_range=[0, 20], + visual_range_color=RANGE_COLOR, + grid3d_width=200, grid3d_depth=80) + assert "lambert" not in bar3d._repr_html_() + + +def test_bar3d_shading_lambert(): + bar3d = Bar3D("3D 柱状图示例", width=1200, height=600) + bar3d.add("", X_TIME, Y_WEEK, [[d[1], d[0], d[2]] for d in data], + is_visualmap=True, visual_range=[0, 20], + visual_range_color=RANGE_COLOR, grid3d_width=200, + grid3d_depth=80, grid3d_shading='lambert') + assert "lambert" in bar3d._repr_html_() + + +def test_bar3d_rotate_automatically(): + bar3d = Bar3D("3D 柱状图示例", width=1200, height=600) + bar3d.add("", X_TIME, Y_WEEK, [[d[1], d[0], d[2]] for d in data], + is_visualmap=True, visual_range=[0, 20], + visual_range_color=RANGE_COLOR, grid3d_width=200, + grid3d_depth=80, is_grid3d_rotate=True) + bar3d.render() + + +def test_bar3d_rotate_automatically_speedup(): + bar3d = Bar3D("3D 柱状图示例", width=1200, height=600) + bar3d.add("", X_TIME, Y_WEEK, [[d[1], d[0], d[2]] for d in data], + is_visualmap=True, visual_range=[0, 20], + visual_range_color=RANGE_COLOR, grid3d_width=200, + grid3d_depth=80, is_grid3d_rotate=True, + grid3d_rotate_speed=180) + bar3d.render() + + +def test_bar3d_must_use_canvas(): + bar3d = Bar3D("3D 柱状图示例", width=1200, height=600) + eq_(bar3d.renderer, 'canvas') diff --git a/test/test_base.py b/test/test_base.py new file mode 100644 index 000000000..ff6b52297 --- /dev/null +++ b/test/test_base.py @@ -0,0 +1,137 @@ +# coding=utf-8 +from __future__ import unicode_literals + +import os +import sys +import json + +import pandas as pd +import numpy as np + +from nose.tools import eq_ +from pyecharts import Bar, Map +from test.constants import CLOTHES +from test.utils import get_default_rendering_file_content + +TITLE = "柱状图数据堆叠示例" + + +def create_a_bar(title, renderer='canvas'): + v1 = [5, 20, 36, 10, 75, 90] + v2 = [10, 25, 8, 60, 20, 80] + bar = Bar(title, renderer=renderer) + bar.add("商家A", CLOTHES, v1, is_stack=True) + bar.add("商家B", CLOTHES, v2, is_stack=True) + return bar + + +def test_svg_option(): + bar = create_a_bar(TITLE, renderer='svg') + html = bar.render_embed() + assert "{renderer: 'svg'}" in html + + +def test_svg_option_in_note_book(): + bar = create_a_bar(TITLE, renderer='svg') + html = bar._repr_html_() + assert "{renderer: 'svg'}" in html + + +def test_canvas_option(): + bar = create_a_bar(TITLE) + html = bar.render_embed() + assert "{renderer: 'canvas'}" in html + + +def test_canvas_option_in_notebook(): + bar = create_a_bar(TITLE) + html = bar._repr_html_() + assert "{renderer: 'canvas'}" in html + + +def test_embed_option(): + bar = create_a_bar(TITLE) + html = bar.render_embed() + json_encoded_title = json.dumps(TITLE) + assert json_encoded_title in html + assert "" not in html + assert "" not in html + + +def test_base_get_js_dependencies(): + bar = create_a_bar(TITLE) + dependencies = bar.get_js_dependencies() + expected = ['echarts.min'] + eq_(dependencies, expected) + + +def test_numpy_array(): + v1 = np.array([5, 20, 36, 10, 75, 90]) + bar = Bar(TITLE) + bar.add("商家A", CLOTHES, v1, is_stack=True) + html = bar.render_embed() + json_encoded_title = json.dumps(TITLE) + assert json_encoded_title in html + + +def test_pandas_dataframe(): + title = 'bar chart' + index = pd.date_range('3/8/2017', periods=6, freq='M') + df1 = pd.DataFrame(np.random.randn(6), index=index) + df2 = pd.DataFrame(np.random.randn(6), index=index) + + dtvalue1 = [i[0] for i in df1.values] + dtvalue2 = [i[0] for i in df2.values] + _index = [i for i in df1.index.format()] + + bar = Bar(title, 'Profit and loss situation') + bar.add('profit', _index, dtvalue1) + bar.add('loss', _index, dtvalue2) + html = bar.render_embed() + assert title in html + + +def test_echarts_position_in_render_html(): + value = [20, 190, 253, 77, 65] + attr = ['汕头市', '汕尾市', '揭阳市', '阳江市', '肇庆市'] + map = Map("广东地图示例", width=1200, height=600, page_title=TITLE) + map.add("", attr, value, maptype='广东', + is_visualmap=True, visual_text_color='#000') + map.render() + actual_content = get_default_rendering_file_content() + assert TITLE in actual_content + + +def test_show_config(): + stdout_ = sys.stdout + captured_stdout = 'stdout.txt' + try: + with open(captured_stdout, 'w') as f: + sys.stdout = f + bar = create_a_bar("new") + bar.print_echarts_options() + except Exception as e: + # whatever happens, continue and restore stdout + print(e) + sys.stdout = stdout_ + with open(captured_stdout, 'r') as f: + content = f.read() + assert 'None' not in content + assert 'null' in content + assert 'false' in content + assert 'False' not in content + os.unlink(captured_stdout) + + +def test_base_cast_records(): + records = [{"key": 1}, {"value": 2}] + keys, values = Bar.cast(records) + eq_(keys, ["key", "value"]) + eq_(values, [1, 2]) + + +def test_base_cast_dict(): + adict = {"key": 1, "value": 2} + keys, values = Bar.cast(adict) + eq_(keys, ["key", "value"]) + eq_(values, [1, 2]) diff --git a/test/test_boxplot.py b/test/test_boxplot.py new file mode 100644 index 000000000..dccdadeb6 --- /dev/null +++ b/test/test_boxplot.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals + +from pyecharts import Boxplot + + +def test_boxplot_one_legend(): + boxplot = Boxplot("箱形图") + x_axis = ['expr1', 'expr2', 'expr3', 'expr4', 'expr5'] + y_axis = [ + [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, + 1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960], + [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, + 830, 790, 810, 880, 880, 830, 800, 790, 760, 800], + [880, 880, 880, 860, 720, 720, 620, 860, 970, 950, + 880, 910, 850, 870, 840, 840, 850, 840, 840, 840], + [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, + 910, 920, 890, 860, 880, 720, 840, 850, 850, 780], + [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, + 870, 870, 810, 740, 810, 940, 950, 800, 810, 870] + ] + _yaxis = boxplot.prepare_data(y_axis) + boxplot.add("boxplot", x_axis, _yaxis) + boxplot.render() + + +def test_boxplot_two_legend(): + boxplot = Boxplot("箱形图") + x_axis = ['expr1', 'expr2'] + y_axis1 = [ + [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, + 1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960], + [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, + 830, 790, 810, 880, 880, 830, 800, 790, 760, 800], + ] + y_axis2 = [ + [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, + 910, 920, 890, 860, 880, 720, 840, 850, 850, 780], + [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, + 870, 870, 810, 740, 810, 940, 950, 800, 810, 870] + ] + boxplot.add("category1", x_axis, boxplot.prepare_data(y_axis1)) + boxplot.add("category2", x_axis, boxplot.prepare_data(y_axis2)) + html_content = boxplot._repr_html_() + assert "category1" in html_content + assert "category2" in html_content diff --git a/test/test_chart_properties.py b/test/test_chart_properties.py new file mode 100644 index 000000000..04952367b --- /dev/null +++ b/test/test_chart_properties.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# coding=utf-8 + +from __future__ import unicode_literals + +from pyecharts.base import Base +from pyecharts import Bar, Line, Grid +from test.constants import CLOTHES, WEEK +from nose.tools import eq_ + +UUID_HEX_LENGTH = 32 + + +def test_base_properties(): + b = Base() + eq_(len(b.chart_id), UUID_HEX_LENGTH) + eq_(b.width, 800) + eq_(b.height, 400) + eq_(len(b.options), 0) # empty + assert ('echarts' in b.js_dependencies) or \ + ('echarts.min' in b.js_dependencies) + + +def test_chart_properties(): + v1 = [5, 20, 36, 10, 75, 90] + v2 = [10, 25, 8, 60, 20, 80] + bar = Bar("柱状图-数据堆叠示例", width=900, height=500) + bar.add("商家A", CLOTHES, v1, is_stack=True) + bar.add("商家B", CLOTHES, v2, is_stack=True) + + eq_(len(bar.chart_id), UUID_HEX_LENGTH) + eq_(bar.width, 900) + eq_(bar.height, 500) + assert ('echarts' in bar.js_dependencies) or \ + ('echarts.min' in bar.js_dependencies) + + +def test_grid_properties(): + v1 = [5, 20, 36, 10, 75, 90] + v2 = [10, 25, 8, 60, 20, 80] + bar = Bar("柱状图示例", height=720) + bar.add("商家A", CLOTHES, v1, is_stack=True) + bar.add("商家B", CLOTHES, v2, is_stack=True) + line = Line("折线图示例", title_top="50%") + line.add("最高气温", WEEK, [11, 11, 15, 13, 12, 13, 10], + mark_point=["max", "min"], mark_line=["average"]) + line.add("最低气温", WEEK, [1, -2, 2, 5, 3, 2, 0], + mark_point=["max", "min"], mark_line=["average"], + legend_top="50%") + + grid = Grid(width=1024, height=768) + grid.add(bar, grid_bottom="60%") + grid.add(line, grid_top="60%") + eq_(grid.width, 1024) + eq_(grid.height, 768) + assert ('echarts' in bar.js_dependencies) or \ + ('echarts.min' in bar.js_dependencies) diff --git a/test/test_conf.py b/test/test_conf.py new file mode 100644 index 000000000..473d38f32 --- /dev/null +++ b/test/test_conf.py @@ -0,0 +1,59 @@ +# coding=utf8 +""" +Test Cases for jshost. +Input:a PyEchartsConfg object with cusom jshost and force_embed flag by user. +Test Target: js_embed (should render ') == 2 + assert html.count('') == 3 + assert html.count("require.config") == html.count("function(echarts)") == 1 + # Test some chart attributes + json_encoded_title = json.dumps(TITLE) + assert json_encoded_title in html + assert "nbextensions/echarts" in html # default jshost + assert html.count("height:400px") == 3 + assert html.count('width:600px') == 1 + assert html.count("width:800px") == 2 + assert html.count("id_my_cell_line") == 6 + + +def test_online_feature(): + online() + bar = create_a_bar(TITLE) + html = bar._repr_html_() + expected_jshost = 'https://pyecharts.github.io/jupyter-echarts/echarts' + assert expected_jshost in html + + +def test_online_with_custom_jshost(): + online(host='https://my-site.com/js') + bar = create_a_bar(TITLE) + html = bar._repr_html_() + expected_jshost = 'https://my-site.com/js' + assert expected_jshost in html diff --git a/test/test_overlap.py b/test/test_overlap.py new file mode 100644 index 000000000..d58f4f1e8 --- /dev/null +++ b/test/test_overlap.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals + +from pyecharts import Bar, Line, Scatter, EffectScatter, Kline +from pyecharts import Overlap +from test.constants import CLOTHES + + +def test_overlap_bar_line(): + attr = ['A', 'B', 'C', 'D', 'E', 'F'] + v1 = [10, 20, 30, 40, 50, 60] + v2 = [38, 28, 58, 48, 78, 68] + bar = Bar("Line-Bar 示例") + bar.add("bar", attr, v1) + line = Line() + line.add("line", attr, v2) + + overlap = Overlap() + overlap.add(bar) + overlap.add(line) + overlap.render() + + +def test_overlap_es_scatter(): + v1 = [10, 20, 30, 40, 50, 60] + v2 = [30, 30, 30, 30, 30, 30] + v3 = [50, 50, 50, 50, 50, 50] + v4 = [10, 10, 10, 10, 10, 10] + es = EffectScatter("Scatter-EffectScatter 示例") + es.add("es", v1, v2) + scatter = Scatter() + scatter.add("scatter", v1, v3) + es_1 = EffectScatter() + es_1.add("es_1", v1, v4, symbol='pin', effect_scale=5) + + overlap = Overlap() + overlap.add(es) + overlap.add(scatter) + overlap.add(es_1) + overlap.render() + + +def test_overlap_kline_line(): + import random + v1 = [[2320.26, 2320.26, 2287.3, 2362.94], + [2300, 2291.3, 2288.26, 2308.38], + [2295.35, 2346.5, 2295.35, 2345.92], + [2347.22, 2358.98, 2337.35, 2363.8], + [2360.75, 2382.48, 2347.89, 2383.76], + [2383.43, 2385.42, 2371.23, 2391.82], + [2377.41, 2419.02, 2369.57, 2421.15], + [2425.92, 2428.15, 2417.58, 2440.38], + [2411, 2433.13, 2403.3, 2437.42], + [2432.68, 2334.48, 2427.7, 2441.73], + [2430.69, 2418.53, 2394.22, 2433.89], + [2416.62, 2432.4, 2414.4, 2443.03], + [2441.91, 2421.56, 2418.43, 2444.8], + [2420.26, 2382.91, 2373.53, 2427.07], + [2383.49, 2397.18, 2370.61, 2397.94], + [2378.82, 2325.95, 2309.17, 2378.82], + [2322.94, 2314.16, 2308.76, 2330.88], + [2320.62, 2325.82, 2315.01, 2338.78], + [2313.74, 2293.34, 2289.89, 2340.71], + [2297.77, 2313.22, 2292.03, 2324.63], + [2322.32, 2365.59, 2308.92, 2366.16], + [2364.54, 2359.51, 2330.86, 2369.65], + [2332.08, 2273.4, 2259.25, 2333.54], + [2274.81, 2326.31, 2270.1, 2328.14], + [2333.61, 2347.18, 2321.6, 2351.44], + [2340.44, 2324.29, 2304.27, 2352.02], + [2326.42, 2318.61, 2314.59, 2333.67], + [2314.68, 2310.59, 2296.58, 2320.96], + [2309.16, 2286.6, 2264.83, 2333.29], + [2282.17, 2263.97, 2253.25, 2286.33], + [2255.77, 2270.28, 2253.31, 2276.22]] + attr = ["2017/7/{}".format(i + 1) for i in range(31)] + kline = Kline("Kline-Line 示例") + kline.add("日K", attr, v1) + line_1 = Line() + line_1.add("line-1", attr, [random.randint(2400, 2500) for _ in range(31)]) + line_2 = Line() + line_2.add("line-2", attr, [random.randint(2400, 2500) for _ in range(31)]) + + overlap = Overlap() + overlap.add(kline) + overlap.add(line_1) + overlap.add(line_2) + overlap.render() + + +def test_overlap_two_yaxis(): + attr = ["{}月".format(i) for i in range(1, 13)] + v1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3] + v2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3] + v3 = [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2] + + bar = Bar(width=1200, height=600) + bar.add("蒸发量", attr, v1) + bar.add("降水量", attr, v2, yaxis_formatter=" ml", yaxis_max=250) + + line = Line() + line.add("平均温度", attr, v3, yaxis_formatter=" °C") + + overlap = Overlap() + overlap.add(bar) + overlap.add(line, yaxis_index=1, is_add_yaxis=True) + overlap.render() + + +def test_line_es(): + v1 = [5, 20, 36, 10, 10, 100] + line = Line("line-EffectScatter 示例") + line.add("", CLOTHES, v1, is_random=True) + es = EffectScatter() + es.add("", CLOTHES, v1, effect_scale=8) + + overlap = Overlap() + overlap.add(line) + overlap.add(es) + overlap.render() diff --git a/test/test_page.py b/test/test_page.py new file mode 100644 index 000000000..139650441 --- /dev/null +++ b/test/test_page.py @@ -0,0 +1,201 @@ +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals + +import json +import codecs +from test.constants import RANGE_COLOR, CLOTHES, WEEK +from pyecharts import ( + Bar, Scatter3D, Line, Pie, Map, + Kline, Radar, WordCloud, Liquid) +from pyecharts import Page +from nose.tools import eq_ + +TEST_PAGE_TITLE = "my awesome chart" + + +def create_three(): + page = Page(page_title=TEST_PAGE_TITLE) + + # bar + v1 = [5, 20, 36, 10, 75, 90] + v2 = [10, 25, 8, 60, 20, 80] + bar = Bar("柱状图数据堆叠示例") + bar.add("商家A", CLOTHES, v1, is_stack=True) + bar.add("商家B", CLOTHES, v2, is_stack=True) + page.add(bar) + + # scatter3D + import random + data = [ + [random.randint(0, 100), + random.randint(0, 100), + random.randint(0, 100)] for _ in range(80) + ] + scatter3d = Scatter3D("3D 散点图示例", width=1200, height=600) + scatter3d.add("", data, is_visualmap=True, visual_range_color=RANGE_COLOR) + page.add(scatter3d) + + # guangdong + value = [20, 190, 253, 77, 65] + attr = ['汕头市', '汕尾市', '揭阳市', '阳江市', '肇庆市'] + map = Map("广东地图示例", width=1200, height=600) + map.add("", attr, value, maptype='广东', is_visualmap=True, + visual_text_color='#000') + page.add(map) + + return page + + +def test_two_bars(): + page = create_three() + page.render() + with codecs.open('render.html', 'r', 'utf-8') as f: + actual_content = f.read() + assert json.dumps("柱状图数据堆叠示例") in actual_content + assert "" in actual_content + assert TEST_PAGE_TITLE in actual_content + # test the optimization + assert "registerMap('china'," not in actual_content + assert "registerMap('world'," not in actual_content + echarts_position = actual_content.find('exports.echarts') + guangdong_position = actual_content.find(json.dumps('广东')) + assert echarts_position < guangdong_position + + +def test_page_get_js_dependencies(): + page = create_three() + dependencies = page.get_js_dependencies() + eq_(dependencies[0], 'echarts.min') + assert 'guangdong' in dependencies + assert 'echarts-gl.min' in dependencies + eq_(len(dependencies), 3) + + +def test_page_embed(): + page = create_three() + html = page.render_embed() + assert '' not in html + assert json.dumps("柱状图数据堆叠示例") in html + + +def test_page_in_notebook(): + page = create_three() + html = page._repr_html_() + + assert 'echartsgl' in html + assert 'echarts' in html + assert 'guangdong' in html + # find the appearing postion of echarts.min in html + echarts_position = html.find('echarts.min') + # find the appearing postion of guangdong in html + guangdong_position = html.find('guangdong') + assert echarts_position < guangdong_position + + +def test_more(): + page = Page() + + # line + line = Line("折线图示例") + line.add("最高气温", WEEK, [11, 11, 15, 13, 12, 13, 10], + mark_point=["max", "min"], mark_line=["average"]) + line.add("最低气温", WEEK, [1, -2, 2, 5, 3, 2, 0], + mark_point=["max", "min"], mark_line=["average"]) + + # pie + v1 = [11, 12, 13, 10, 10, 10] + pie = Pie("饼图-圆环图示例", title_pos='center') + pie.add("", CLOTHES, v1, radius=[40, 75], label_text_color=None, + is_label_show=True, legend_orient='vertical', legend_pos='left') + + page.add([line, pie]) + + # kline + v1 = [[2320.26, 2320.26, 2287.3, 2362.94], + [2300, 2291.3, 2288.26, 2308.38], + [2295.35, 2346.5, 2295.35, 2345.92], + [2347.22, 2358.98, 2337.35, 2363.8], + [2360.75, 2382.48, 2347.89, 2383.76], + [2383.43, 2385.42, 2371.23, 2391.82], + [2377.41, 2419.02, 2369.57, 2421.15], + [2425.92, 2428.15, 2417.58, 2440.38], + [2411, 2433.13, 2403.3, 2437.42], + [2432.68, 2334.48, 2427.7, 2441.73], + [2430.69, 2418.53, 2394.22, 2433.89], + [2416.62, 2432.4, 2414.4, 2443.03], + [2441.91, 2421.56, 2418.43, 2444.8], + [2420.26, 2382.91, 2373.53, 2427.07], + [2383.49, 2397.18, 2370.61, 2397.94], + [2378.82, 2325.95, 2309.17, 2378.82], + [2322.94, 2314.16, 2308.76, 2330.88], + [2320.62, 2325.82, 2315.01, 2338.78], + [2313.74, 2293.34, 2289.89, 2340.71], + [2297.77, 2313.22, 2292.03, 2324.63], + [2322.32, 2365.59, 2308.92, 2366.16], + [2364.54, 2359.51, 2330.86, 2369.65], + [2332.08, 2273.4, 2259.25, 2333.54], + [2274.81, 2326.31, 2270.1, 2328.14], + [2333.61, 2347.18, 2321.6, 2351.44], + [2340.44, 2324.29, 2304.27, 2352.02], + [2326.42, 2318.61, 2314.59, 2333.67], + [2314.68, 2310.59, 2296.58, 2320.96], + [2309.16, 2286.6, 2264.83, 2333.29], + [2282.17, 2263.97, 2253.25, 2286.33], + [2255.77, 2270.28, 2253.31, 2276.22]] + kline = Kline("K 线图示例") + kline.add("日K", ["2017/7/{}".format(i + 1) for i in range(31)], + v1, is_datazoom_show=True) + page.add(kline) + + # radar + schema = [ + ("销售", 6500), ("管理", 16000), ("信息技术", 30000), + ("客服", 38000), ("研发", 52000), ("市场", 25000) + ] + v1 = [[4300, 10000, 28000, 35000, 50000, 19000]] + v2 = [[5000, 14000, 28000, 31000, 42000, 21000]] + radar = Radar("雷达图示例") + radar.config(schema) + radar.add("预算分配", v1, is_splitline=True, is_axisline_show=True) + radar.add("实际开销", v2, label_color=["#4e79a7"], is_area_show=False, + legend_selectedmode='single') + page.add(radar) + + # scatter3d + import random + data = [ + [random.randint(0, 100), + random.randint(0, 100), + random.randint(0, 100)] for _ in range(80) + ] + scatter3D = Scatter3D("3D 散点图示例", width=1200, height=600) + scatter3D.add("", data, is_visualmap=True, visual_range_color=RANGE_COLOR) + page.add(scatter3D) + + # wordcloud + name = [ + 'Sam S Club', 'Macys', 'Amy Schumer', 'Jurassic World', + 'Charter Communications', 'Chick Fil A', 'Planet Fitness', + 'Pitch Perfect', 'Express', 'Home', 'Johnny Depp', 'Lena Dunham', + 'Lewis Hamilton', 'KXAN', 'Mary Ellen Mark', 'Farrah Abraham', + 'Rita Ora', 'Serena Williams', 'NCAA baseball tournament', + 'Point Break' + ] + value = [ + 10000, 6181, 4386, 4055, 2467, 2244, 1898, 1484, 1112, + 965, 847, 582, 555, 550, 462, 366, 360, 282, 273, 265 + ] + wordcloud = WordCloud(width=1300, height=620) + wordcloud.add("", name, value, word_size_range=[30, 100], rotate_step=66) + page.add(wordcloud) + + # liquid + liquid = Liquid("水球图示例") + liquid.add("Liquid", [0.6]) + page.add(liquid) + assert len(page) == 7 + assert isinstance(page[0], Line) + assert (('echarts' in page.js_dependencies) or + ('echarts.min' in page.js_dependencies)) + page.render() diff --git a/test/test_parallel.py b/test/test_parallel.py index 58482e9c7..63f91e949 100644 --- a/test/test_parallel.py +++ b/test/test_parallel.py @@ -1,7 +1,32 @@ +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals + from pyecharts import Parallel -def test_parallel(): - schema = ["data", "AQI", "PM2.5", "PM10", "CO", "NO2", "SO2", "等级"] + +def test_parallel_default(): + schema = ["data", "AQI", "PM2.5", "PM10", "CO", "NO2"] + data = [ + [1, 91, 45, 125, 0.82, 34], + [2, 65, 27, 78, 0.86, 45, ], + [3, 83, 60, 84, 1.09, 73], + [4, 109, 81, 121, 1.28, 68], + [5, 106, 77, 114, 1.07, 55], + [6, 109, 81, 121, 1.28, 68], + [7, 106, 77, 114, 1.07, 55], + [8, 89, 65, 78, 0.86, 51, 26], + [9, 53, 33, 47, 0.64, 50, 17], + [10, 80, 55, 80, 1.01, 75, 24], + [11, 117, 81, 124, 1.03, 45] + ] + parallel = Parallel("平行坐标系-默认指示器") + parallel.config(schema) + parallel.add("parallel", data, is_random=True) + parallel.render() + + +def test_parallel_user_define(): c_schema = [ {"dim": 0, "name": "data"}, {"dim": 1, "name": "AQI"}, @@ -10,7 +35,9 @@ def test_parallel(): {"dim": 4, "name": "CO"}, {"dim": 5, "name": "NO2"}, {"dim": 6, "name": "CO2"}, - {"dim": 7, "name": "等级", "type": "category", "data": ['优', '良', '轻度污染', '中度污染', '重度污染', '严重污染']}, + {"dim": 7, "name": "等级", + "type": "category", + "data": ['优', '良', '轻度污染', '中度污染', '重度污染', '严重污染']} ] data = [ [1, 91, 45, 125, 0.82, 34, 23, "良"], @@ -27,11 +54,21 @@ def test_parallel(): [12, 99, 71, 142, 1.1, 62, 42, "良"], [13, 95, 69, 130, 1.28, 74, 50, "良"], [14, 116, 87, 131, 1.47, 84, 40, "轻度污染"] - ] - parallel = Parallel("平行坐标系") - # parallel.config(schema) + parallel = Parallel("平行坐标系-用户自定义指示器") parallel.config(c_schema=c_schema) parallel.add("parallel", data) - parallel.show_config() - parallel.render() \ No newline at end of file + parallel.render() + + +def test_parallel_line_style(): + schema = ["data", "AQI", "PM2.5", "PM10", "CO", "NO2"] + data = [ + [1, 91, 45, 125, 0.82, 34], + ] + parallel = Parallel() + parallel.config(schema) + parallel.add("parallel", data, line_width=20, line_opacity=0.5) + html_content = parallel._repr_html_() + assert '"width": 20' in html_content + assert '"opacity": 0.5' in html_content diff --git a/test/test_pie.py b/test/test_pie.py index 840702b11..5d84afd70 100644 --- a/test/test_pie.py +++ b/test/test_pie.py @@ -1,12 +1,89 @@ -from pyecharts import Pie +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals -def test_pie(): - attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] +from pyecharts import Pie, Style +from test.constants import CLOTHES + + +def test_pie_default(): + v1 = [11, 12, 13, 10, 10, 10] + pie = Pie("饼图示例") + pie.add("", CLOTHES, v1, is_label_show=True) + pie.render() + + +def test_pie_legend(): + v1 = [11, 12, 13, 10, 10, 10] + pie = Pie("饼图-圆环图示例", title_pos='center') + pie.add("", CLOTHES, v1, radius=[40, 75], label_text_color=None, + is_label_show=True, legend_orient='vertical', legend_pos='left') + pie.render() + + +def test_pie_type_rose(): v1 = [11, 12, 13, 10, 10, 10] v2 = [19, 21, 32, 20, 20, 33] + pie = Pie("饼图-玫瑰图示例", title_pos='center', width=900) + pie.add("商品A", CLOTHES, v1, center=[25, 50], is_random=True, + radius=[30, 75], rosetype='radius') + pie.add("商品B", CLOTHES, v2, center=[75, 50], is_random=True, + radius=[30, 75], rosetype='area', + is_legend_show=False, is_label_show=True) + pie.render() + + +def test_pie_type_radius(): + pie = Pie("饼图示例", title_pos='center', width=1000, height=600) + pie.add("", ['A', 'B', 'C', 'D', 'E', 'F'], [335, 321, 234, 135, 251, 148], + radius=[40, 55], is_label_show=True) + pie.add("", ['H', 'I', 'J'], [335, 679, 204], radius=[0, 30], + legend_orient='vertical', legend_pos='left') + pie.render() + + +def test_pie_multiple(): + import random + attr = ['A', 'B', 'C', 'D', 'E', 'F'] + pie = Pie("饼图示例", width=1000, height=600) + pie.add("", attr, [random.randint(0, 100) for _ in range(6)], + radius=[50, 55], center=[25, 50], is_random=True) + pie.add("", attr, [random.randint(20, 100) for _ in range(6)], + radius=[0, 45], center=[25, 50], rosetype='area') + pie.add("", attr, [random.randint(0, 100) for _ in range(6)], + radius=[50, 55], center=[65, 50], is_random=True) + pie.add("", attr, [random.randint(20, 100) for _ in range(6)], + radius=[0, 45], center=[65, 50], rosetype='radius') + pie.render() + + +def test_pie_multiple_movie(): + pie = Pie('各类电影中"好片"所占的比例', "数据来着豆瓣", title_pos='center') + style = Style() + pie_style = style.add( + label_pos="center", + is_label_show=True, + label_text_color=None + ) - pie = Pie() - # pie.add("商品A", attr, v1, center=[25, 50], is_random=True, radius=[30, 75], rosetype=True, is_label_show=True) - pie.add("商品B", attr, v2, center=[75, 50], is_random=True, radius=[30, 75], rosetype=True, is_legend_show=False) - pie.show_config() - pie.render() \ No newline at end of file + pie.add("", ["剧情", ""], [25, 75], center=[10, 30], + radius=[18, 24], **pie_style) + pie.add("", ["奇幻", ""], [24, 76], center=[30, 30], + radius=[18, 24], **pie_style) + pie.add("", ["爱情", ""], [14, 86], center=[50, 30], + radius=[18, 24], **pie_style) + pie.add("", ["惊悚", ""], [11, 89], center=[70, 30], + radius=[18, 24], **pie_style) + pie.add("", ["冒险", ""], [27, 73], center=[90, 30], + radius=[18, 24], **pie_style) + pie.add("", ["动作", ""], [15, 85], center=[10, 70], + radius=[18, 24], **pie_style) + pie.add("", ["喜剧", ""], [54, 46], center=[30, 70], + radius=[18, 24], **pie_style) + pie.add("", ["科幻", ""], [26, 74], center=[50, 70], + radius=[18, 24], **pie_style) + pie.add("", ["悬疑", ""], [25, 75], center=[70, 70], + radius=[18, 24], **pie_style) + pie.add("", ["犯罪", ""], [28, 72], center=[90, 70], + radius=[18, 24], legend_top="center", **pie_style) + pie.render() diff --git a/test/test_polar.py b/test/test_polar.py index 842828b84..bc33f800f 100644 --- a/test/test_polar.py +++ b/test/test_polar.py @@ -1,14 +1,108 @@ +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals + +import math +import random + from pyecharts import Polar +from test.constants import WEEK + + +def test_polar_type_scatter_one(): + data = [(i, random.randint(1, 100)) for i in range(101)] + polar = Polar("极坐标系-散点图示例") + polar.add("", data, boundary_gap=False, type='scatter', + is_splitline_show=False, is_axisline_show=True) + assert '"type": "scatter"' in polar._repr_html_() + + +def test_polar_type_scatter_more(): + data_1 = [(10, random.randint(1, 100)) for i in range(300)] + data_2 = [(11, random.randint(1, 100)) for i in range(300)] + polar = Polar("极坐标系-散点图示例", width=1200, height=600) + polar.add("", data_1, type='scatter') + polar.add("", data_2, type='scatter') + polar.render() + + +def test_polar_type_effectscatter(): + data = [(i, random.randint(1, 100)) for i in range(10)] + polar = Polar("极坐标系-动态散点图示例", width=1200, height=600) + polar.add("", data, type='effectScatter', effect_scale=10, + effect_period=5) + assert '"type": "effectScatter"' in polar._repr_html_() + + +def test_polar_type_barradius(): + polar = Polar("极坐标系-堆叠柱状图示例", width=1200, height=600) + polar.add("A", [1, 2, 3, 4, 3, 5, 1], radius_data=WEEK, + type='barRadius', is_stack=True) + polar.add("B", [2, 4, 6, 1, 2, 3, 1], radius_data=WEEK, + type='barRadius', is_stack=True) + polar.add("C", [1, 2, 3, 4, 1, 2, 5], radius_data=WEEK, + type='barRadius', is_stack=True) + polar.render() + + +def test_polar_type_barangle(): + polar = Polar("极坐标系-堆叠柱状图示例", width=1200, height=600) + polar.add("", [1, 2, 3, 4, 3, 5, 1], radius_data=WEEK, + type='barAngle', is_stack=True) + polar.add("", [2, 4, 6, 1, 2, 3, 1], radius_data=WEEK, + type='barAngle', is_stack=True) + polar.add("", [1, 2, 3, 4, 1, 2, 5], radius_data=WEEK, + type='barAngle', is_stack=True) + polar.render() + -def test_polar(): - import math +def test_polar_draw_love(): data = [] for i in range(101): theta = i / 100 * 360 r = 5 * (1 + math.sin(theta / 180 * math.pi)) data.append([r, theta]) hour = [i for i in range(1, 25)] - polar = Polar(width=1200, height=600) - polar.add("For my honey", data, angle_data=hour, boundary_gap=False) - polar.show_config() + polar = Polar("极坐标系示例", width=1200, height=600) + polar.add("Love", data, angle_data=hour, + boundary_gap=False, start_angle=0) + polar.render() + + +def test_polar_draw_flower(): + data = [] + for i in range(361): + t = i / 180 * math.pi + r = math.sin(2 * t) * math.cos(2 * t) + data.append([r, i]) + polar = Polar("极坐标系示例", width=1200, height=600) + polar.add("Flower", data, start_angle=0, + symbol=None, axis_range=[0, None]) + polar.render() + + +def test_polar_draw_color_flower(): + data = [] + for i in range(361): + t = i / 180 * math.pi + r = math.sin(2 * t) * math.cos(2 * t) + data.append([r, i]) + polar = Polar("极坐标系示例", width=1200, height=600) + polar.add("Color-Flower", data, start_angle=0, symbol=None, + axis_range=[0, None], area_color="#f71f24", area_opacity=0.6) + polar.render() + + +def test_polar_draw_snail(): + data = [] + for i in range(5): + for j in range(101): + theta = j / 100 * 360 + alpha = i * 360 + theta + r = math.pow(math.e, 0.003 * alpha) + data.append([r, theta]) + polar = Polar("极坐标系示例") + polar.add("", data, symbol_size=0, symbol='circle', start_angle=-25, + is_radiusaxis_show=False, area_color="#f3c5b3", + area_opacity=0.5, is_angleaxis_show=False) polar.render() diff --git a/test/test_radar.py b/test/test_radar.py index 24abb98ed..00ef13938 100644 --- a/test/test_radar.py +++ b/test/test_radar.py @@ -1,95 +1,119 @@ +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals + from pyecharts import Radar -def test_radar(): + +def test_radar_default_schema(): schema = [ - ("销售", 6500), - ("管理", 16000), - ("信息技术", 30000), - ("客服", 38000), - ("研发", 52000), - ("市场", 25000) + ("销售", 6500), ("管理", 16000), ("信息技术", 30000), + ("客服", 38000), ("研发", 52000), ("市场", 25000) ] v1 = [[4300, 10000, 28000, 35000, 50000, 19000]] v2 = [[5000, 14000, 28000, 31000, 42000, 21000]] - - radar = Radar() - radar.config(schema, split_area_show=True) - radar.add("预算分配", v1, label_color=["#000"]) - radar.add("实际开销", v2, label_color=["#4e79a7"]) - radar.show_config() + radar = Radar("雷达图示例") + radar.config(schema) + radar.add("预算分配", v1, is_splitline=True, is_axisline_show=True) + radar.add("实际开销", v2, label_color=["#4e79a7"], is_area_show=False, + legend_selectedmode='single') radar.render() - value_bj = [ - [55, 9, 56, 0.46, 18, 6, 1], - [25, 11, 21, 0.65, 34, 9, 2], - [56, 7, 63, 0.3, 14, 5, 3], - [33, 7, 29, 0.33, 16, 6, 4], - [42, 24, 44, 0.76, 40, 16, 5], - [82, 58, 90, 1.77, 68, 33, 6], - [74, 49, 77, 1.46, 48, 27, 7], - [78, 55, 80, 1.29, 59, 29, 8], - [267, 216, 280, 4.8, 108, 64, 9], - [185, 127, 216, 2.52, 61, 27, 10], - [39, 19, 38, 0.57, 31, 15, 11], - [41, 11, 40, 0.43, 21, 7, 12], - [64, 38, 74, 1.04, 46, 22, 13], - [108, 79, 120, 1.7, 75, 41, 14], - [108, 63, 116, 1.48, 44, 26, 15], - [33, 6, 29, 0.34, 13, 5, 16], - [94, 66, 110, 1.54, 62, 31, 17], - [186, 142, 192, 3.88, 93, 79, 18], - [57, 31, 54, 0.96, 32, 14, 19], - [22, 8, 17, 0.48, 23, 10, 20], - [39, 15, 36, 0.61, 29, 13, 21], - [94, 69, 114, 2.08, 73, 39, 22], - [99, 73, 110, 2.43, 76, 48, 23], - [31, 12, 30, 0.5, 32, 16, 24], - [42, 27, 43, 1, 53, 22, 25], - [154, 117, 157, 3.05, 92, 58, 26], - [234, 185, 230, 4.09, 123, 69, 27], - [160, 120, 186, 2.77, 91, 50, 28], - [134, 96, 165, 2.76, 83, 41, 29], - [52, 24, 60, 1.03, 50, 21, 30], - [46, 5, 49, 0.28, 10, 6, 31] - ] - value_sh = [ - [91, 45, 125, 0.82, 34, 23, 1], - [65, 27, 78, 0.86, 45, 29, 2], - [83, 60, 84, 1.09, 73, 27, 3], - [109, 81, 121, 1.28, 68, 51, 4], - [106, 77, 114, 1.07, 55, 51, 5], - [109, 81, 121, 1.28, 68, 51, 6], - [106, 77, 114, 1.07, 55, 51, 7], - [89, 65, 78, 0.86, 51, 26, 8], - [53, 33, 47, 0.64, 50, 17, 9], - [80, 55, 80, 1.01, 75, 24, 10], - [117, 81, 124, 1.03, 45, 24, 11], - [99, 71, 142, 1.1, 62, 42, 12], - [95, 69, 130, 1.28, 74, 50, 13], - [116, 87, 131, 1.47, 84, 40, 14], - [108, 80, 121, 1.3, 85, 37, 15], - [134, 83, 167, 1.16, 57, 43, 16], - [79, 43, 107, 1.05, 59, 37, 17], - [71, 46, 89, 0.86, 64, 25, 18], - [97, 71, 113, 1.17, 88, 31, 19], - [84, 57, 91, 0.85, 55, 31, 20], - [87, 63, 101, 0.9, 56, 41, 21], - [104, 77, 119, 1.09, 73, 48, 22], - [87, 62, 100, 1, 72, 28, 23], - [168, 128, 172, 1.49, 97, 56, 24], - [65, 45, 51, 0.74, 39, 17, 25], - [39, 24, 38, 0.61, 47, 17, 26], - [39, 24, 39, 0.59, 50, 19, 27], - [93, 68, 96, 1.05, 79, 29, 28], - [188, 143, 197, 1.66, 99, 51, 29], - [174, 131, 174, 1.55, 108, 50, 30], - [187, 143, 201, 1.39, 89, 53, 31] - ] - schema = [("AQI", 300), ("PM2.5", 250), ("PM10", 300), ("CO", 5), ("NO2", 200), ("SO2", 100)] - radar2 = Radar() - radar2.config(schema) - radar2.add("北京", value_bj, item_color="#f9713c", symbol=None) - radar2.add("上海", value_sh, item_color="#b3e4a1", symbol=None) - radar2.show_config() - radar2.render() \ No newline at end of file +value_bj = [ + [55, 9, 56, 0.46, 18, 6, 1], + [25, 11, 21, 0.65, 34, 9, 2], + [56, 7, 63, 0.3, 14, 5, 3], + [33, 7, 29, 0.33, 16, 6, 4], + [42, 24, 44, 0.76, 40, 16, 5], + [82, 58, 90, 1.77, 68, 33, 6], + [74, 49, 77, 1.46, 48, 27, 7], + [78, 55, 80, 1.29, 59, 29, 8], + [267, 216, 280, 4.8, 108, 64, 9], + [185, 127, 216, 2.52, 61, 27, 10], + [39, 19, 38, 0.57, 31, 15, 11], + [41, 11, 40, 0.43, 21, 7, 12], + [64, 38, 74, 1.04, 46, 22, 13], + [108, 79, 120, 1.7, 75, 41, 14], + [108, 63, 116, 1.48, 44, 26, 15], + [33, 6, 29, 0.34, 13, 5, 16], + [94, 66, 110, 1.54, 62, 31, 17], + [186, 142, 192, 3.88, 93, 79, 18], + [57, 31, 54, 0.96, 32, 14, 19], + [22, 8, 17, 0.48, 23, 10, 20], + [39, 15, 36, 0.61, 29, 13, 21], + [94, 69, 114, 2.08, 73, 39, 22], + [99, 73, 110, 2.43, 76, 48, 23], + [31, 12, 30, 0.5, 32, 16, 24], + [42, 27, 43, 1, 53, 22, 25], + [154, 117, 157, 3.05, 92, 58, 26], + [234, 185, 230, 4.09, 123, 69, 27], + [160, 120, 186, 2.77, 91, 50, 28], + [134, 96, 165, 2.76, 83, 41, 29], + [52, 24, 60, 1.03, 50, 21, 30], + [46, 5, 49, 0.28, 10, 6, 31] + ] + +value_sh = [ + [91, 45, 125, 0.82, 34, 23, 1], + [65, 27, 78, 0.86, 45, 29, 2], + [83, 60, 84, 1.09, 73, 27, 3], + [109, 81, 121, 1.28, 68, 51, 4], + [106, 77, 114, 1.07, 55, 51, 5], + [109, 81, 121, 1.28, 68, 51, 6], + [106, 77, 114, 1.07, 55, 51, 7], + [89, 65, 78, 0.86, 51, 26, 8], + [53, 33, 47, 0.64, 50, 17, 9], + [80, 55, 80, 1.01, 75, 24, 10], + [117, 81, 124, 1.03, 45, 24, 11], + [99, 71, 142, 1.1, 62, 42, 12], + [95, 69, 130, 1.28, 74, 50, 13], + [116, 87, 131, 1.47, 84, 40, 14], + [108, 80, 121, 1.3, 85, 37, 15], + [134, 83, 167, 1.16, 57, 43, 16], + [79, 43, 107, 1.05, 59, 37, 17], + [71, 46, 89, 0.86, 64, 25, 18], + [97, 71, 113, 1.17, 88, 31, 19], + [84, 57, 91, 0.85, 55, 31, 20], + [87, 63, 101, 0.9, 56, 41, 21], + [104, 77, 119, 1.09, 73, 48, 22], + [87, 62, 100, 1, 72, 28, 23], + [168, 128, 172, 1.49, 97, 56, 24], + [65, 45, 51, 0.74, 39, 17, 25], + [39, 24, 38, 0.61, 47, 17, 26], + [39, 24, 39, 0.59, 50, 19, 27], + [93, 68, 96, 1.05, 79, 29, 28], + [188, 143, 197, 1.66, 99, 51, 29], + [174, 131, 174, 1.55, 108, 50, 30], + [187, 143, 201, 1.39, 89, 53, 31] + ] + +c_schema = [ + {"name": "AQI", "max": 300, "min": 5}, + {"name": "PM2.5", "max": 250, "min": 20}, + {"name": "PM10", "max": 300, "min": 5}, + {"name": "CO", "max": 5}, + {"name": "NO2", "max": 200}, + {"name": "SO2", "max": 100} + ] + + +def test_radar_user_define_schema_single(): + radar = Radar("雷达图示例") + radar.config(c_schema=c_schema, shape='circle') + radar.add("北京", value_bj, item_color="#f9713c", symbol=None) + radar.add("上海", value_sh, item_color="#b3e4a1", symbol=None, + legend_selectedmode='single') + html_content = radar._repr_html_() + assert 'single' in html_content + assert 'multiple' not in html_content + + +def test_radar_user_define_schema_multiple(): + radar = Radar("雷达图示例") + radar.config(c_schema=c_schema, shape='circle') + radar.add("北京", value_bj, item_color="#f9713c", symbol=None) + radar.add("上海", value_sh, item_color="#b3e4a1", symbol=None) + html_content = radar._repr_html_() + assert 'multiple' in html_content + assert 'single' not in html_content diff --git a/test/test_sankey.py b/test/test_sankey.py new file mode 100644 index 000000000..a95befd84 --- /dev/null +++ b/test/test_sankey.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals +import sys +import os +import codecs +import json +from pyecharts import Sankey + +PY2 = sys.version_info[0] == 2 + + +def test_sankey_default(): + nodes = [ + {'name': 'category1'}, {'name': 'category2'}, {'name': 'category3'}, + {'name': 'category4'}, {'name': 'category5'}, {'name': 'category6'}, + ] + + links = [ + {'source': 'category1', 'target': 'category2', 'value': 10}, + {'source': 'category2', 'target': 'category3', 'value': 15}, + {'source': 'category3', 'target': 'category4', 'value': 20}, + {'source': 'category5', 'target': 'category6', 'value': 25} + ] + sankey = Sankey("桑基图示例", width=1200, height=600) + sankey.add("sankey", nodes, links, line_opacity=0.2, + line_curve=0.5, line_color='source', is_label_show=True, + label_pos='right') + sankey.render() + + with codecs.open(os.path.join("fixtures", "energy.json"), "r", + encoding='utf-8') as f: + j = json.load(f) + sankey = Sankey("桑基图示例", width=1200, height=600) + sankey.add("sankey", nodes=j['nodes'], links=j['links'], line_opacity=0.2, + line_curve=0.5, line_color='source', + is_label_show=True, label_pos='right') + sankey.render() diff --git a/test/test_scatter.py b/test/test_scatter.py index 1c2ab1ece..f2ba724e9 100644 --- a/test/test_scatter.py +++ b/test/test_scatter.py @@ -1,13 +1,94 @@ +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals + from pyecharts import Scatter -def test_scatter(): - v1 = [10, 20, 30, 40, 50, 60] - v2 = [10, 20, 30, 40, 50, 60] - - scatter = Scatter() - # v1, v2 = scatter.draw(r"e:\python\pyecharts\_images\boy.png") - scatter.add("boy", v1, v2) - # scatter.add("a", v1, v2) - # scatter.add("b", v1[::-1], v2) - scatter.show_config() - scatter.render() \ No newline at end of file + +v1 = [10, 20, 30, 40, 50, 60] +v2 = [10, 20, 30, 40, 50, 60] + + +def test_scatter_defualt(): + scatter = Scatter("散点图示例") + scatter.add("A", v1, v2) + scatter.add("B", v1[::-1], v2) + html_content = scatter._repr_html_() + assert '"type": "value"' in html_content + assert '"type": "category"' not in html_content + + +def test_scatter_xaxis_type_category(): + scatter = Scatter("散点图示例") + scatter.add("A", ["a", "b", "c", "d", "e", "f"], v2) + scatter.add("B", ["a", "b", "c", "d", "e", "f"], v1[::-1], + xaxis_type="category") + assert '"type": "category"' in scatter._repr_html_() + + +def test_scatter_visualmap_default(): + scatter = Scatter("散点图示例") + scatter.add("A", v1, v2) + scatter.add("B", v1[::-1], v2, is_visualmap=True) + scatter.render() + + +def test_scatter_visualmap_type_size(): + scatter = Scatter("散点图示例") + scatter.add("B", v1[::-1], v2, is_visualmap=True, visual_type='size', + visual_range_size=[20, 80]) + scatter.render() + + +def test_scatter_draw_love(): + scatter = Scatter("散点图示例", width=800, height=480) + v1, v2 = scatter.draw("../images/love.png") + scatter.add("Love", v1, v2) + scatter.render() + + +def test_scatter_draw__hot_red_bra(): + scatter = Scatter("散点图示例", width=1000, height=480) + v1, v2 = scatter.draw("../images/cup.png") + scatter.add("Cup", v1, v2) + scatter.render() + + +def test_scatter_multi_dimension(): + data = [ + [28604, 77, 17096869], + [31163, 77.4, 27662440], + [1516, 68, 1154605773], + [13670, 74.7, 10582082], + [28599, 75, 4986705], + [29476, 77.1, 56943299], + [31476, 75.4, 78958237], + [28666, 78.1, 254830], + [1777, 57.7, 870601776], + [29550, 79.1, 122249285], + [2076, 67.9, 20194354], + [12087, 72, 42972254], + [24021, 75.4, 3397534], + [43296, 76.8, 4240375], + [10088, 70.8, 38195258], + [19349, 69.6, 147568552], + [10670, 67.3, 53994605], + [26424, 75.7, 57110117], + [37062, 75.4, 252847810] + ] + + x_lst = [v[0] for v in data] + y_lst = [v[1] for v in data] + extra_data = [v[2] for v in data] + sc = Scatter() + sc.add("scatter", x_lst, y_lst, extra_data=extra_data, is_visualmap=True, + visual_dimension=2, visual_orient='horizontal', + visual_type='size', visual_range=[254830, 1154605773], + visual_text_color='#000') + sc.render() + + +def test_scatter_markline_coords(): + scatter = Scatter("散点图示例") + scatter.add("A", v1, v2, mark_line_coords=[[10, 10], [30, 30]]) + assert '"coord": [' in scatter._repr_html_() diff --git a/test/test_scatter3D.py b/test/test_scatter3D.py new file mode 100644 index 000000000..5a4e77f97 --- /dev/null +++ b/test/test_scatter3D.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals + +from pyecharts import Scatter3D +from test.constants import RANGE_COLOR +from nose.tools import eq_ + + +def test_scatter3d(): + import random + data = [ + [random.randint(0, 100), + random.randint(0, 100), + random.randint(0, 100)] for _ in range(80) + ] + scatter3d = Scatter3D("3D 散点图示例", width=1200, height=600) + scatter3d.add("", data, is_visualmap=True, + visual_range_color=RANGE_COLOR) + scatter3d.render() + + +def test_scatter3d_must_use_canvas(): + scatter3d = Scatter3D("3D 散点图示例", width=1200, height=600) + eq_(scatter3d.renderer, 'canvas') diff --git a/test/test_style.py b/test/test_style.py new file mode 100644 index 000000000..73e6510ac --- /dev/null +++ b/test/test_style.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals + +from pyecharts import Style + + +def test_style(): + style = Style(title_pos="center") + s1 = style.add(is_random=True, label_pos="top") + assert style.init_style['title_pos'] == "center" + assert style.init_style.get('title', None) is None + assert s1['is_random'] is True + assert s1['label_pos'] == "top" diff --git a/test/test_template_function.py b/test/test_template_function.py new file mode 100644 index 000000000..07d82a2ab --- /dev/null +++ b/test/test_template_function.py @@ -0,0 +1,107 @@ +# coding=utf8 +""" +Test cases for jinja2 template functions +""" + +from __future__ import unicode_literals +from nose.tools import raises + +from pyecharts.utils import get_resource_dir +from pyecharts import Bar, Map +from pyecharts.engine import BaseEnvironment, EchartsEnvironment +from pyecharts.conf import PyEchartsConfig + +ECHARTS_ENV = EchartsEnvironment() + + +def create_demo_bar(chart_id_demo=None): + attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] + v1 = [5, 20, 36, 10, 75, 90] + v2 = [10, 25, 8, 60, 20, 80] + bar = Bar("柱状图数据堆叠示例") + bar.add("商家A", attr, v1, is_stack=True) + bar.add("商家B", attr, v2, is_stack=True) + if chart_id_demo: + bar._chart_id = chart_id_demo + return bar + + +def test_echarts_js_dependencies(): + env = EchartsEnvironment( + pyecharts_config=PyEchartsConfig(jshost='http://localhost/echarts') + ) + tpl = env.from_string('{{ echarts_js_dependencies(bar) }}') + bar = create_demo_bar() + html = tpl.render(bar=bar) + assert '' == html # flake8: noqa + + +def test_echarts_js_dependencies_embed(): + env = EchartsEnvironment( + pyecharts_config=PyEchartsConfig( + jshost=get_resource_dir('templates', 'js', 'echarts') + ) + ) + tpl = env.from_string('{{ echarts_js_dependencies_embed("echarts") }}') + bar = create_demo_bar() + html = tpl.render(bar=bar) + assert len(html) > 0 + + # no longer echarts_js_dependencies equals echarts_js_dependencies_ + # embed when use local host. + # because the js files is either in python path or user path + # hence it could not be simply judged. + + +def test_echarts_js_container(): + tpl = ECHARTS_ENV.from_string('{{ echarts_container(bar) }}') + bar = create_demo_bar('id_demo_chart') + html = tpl.render(bar=bar) + assert '
' == html # flake8: noqa + + bar.width = 1024 + bar.height = 768 + html = tpl.render(bar=bar) + assert '
' == html # flake8: noqa + + bar.width = '1024px' + bar.height = '768px' + html = tpl.render(bar=bar) + assert '
' == html # flake8: noqa + + +def test_echarts_js_content(): + tpl = ECHARTS_ENV.from_string('{{ echarts_js_content(bar) }}') + bar = create_demo_bar() + html = tpl.render(bar=bar) + assert len(html) > 0 + + +def test_echarts_js_content_wrap(): + tpl = ECHARTS_ENV.from_string('{{ echarts_js_content_wrap(bar) }}') + bar = create_demo_bar() + html = tpl.render(bar=bar) + assert len(html) > 0 + + +@raises(TypeError) +def test_create_environment_without_config(): + be = BaseEnvironment() + + +def test_echarts_js_in_first(): + value = [20, 190, 253, 77, 65] + attr = ['汕头市', '汕尾市', '揭阳市', '阳江市', '肇庆市'] + map = Map("广东地图示例", width=1200, height=600) + map.add("", attr, value, maptype='广东', is_visualmap=True, + visual_text_color='#000') + env = EchartsEnvironment( + pyecharts_config=PyEchartsConfig(jshost='http://localhost/echarts') + ) + tpl = env.from_string('{{ echarts_js_dependencies(m) }}') + html = tpl.render(m=map) + echarts_js_pos = html.find('echarts.min.js') + guangdong_js_pos = html.find('guangdong.js') + assert echarts_js_pos > -1 + assert guangdong_js_pos > -1 + assert echarts_js_pos < guangdong_js_pos diff --git a/test/test_themeriver.py b/test/test_themeriver.py new file mode 100644 index 000000000..a6625b8a3 --- /dev/null +++ b/test/test_themeriver.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals + +from pyecharts import ThemeRiver + + +def test_themeriver(): + data = [ + ['2015/11/08', 10, 'DQ'], ['2015/11/09', 15, 'DQ'], + ['2015/11/10', 35, 'DQ'], ['2015/11/14', 7, 'DQ'], + ['2015/11/15', 2, 'DQ'], ['2015/11/16', 17, 'DQ'], + ['2015/11/17', 33, 'DQ'], ['2015/11/18', 40, 'DQ'], + ['2015/11/19', 32, 'DQ'], ['2015/11/20', 26, 'DQ'], + ['2015/11/21', 35, 'DQ'], ['2015/11/22', 40, 'DQ'], + ['2015/11/23', 32, 'DQ'], ['2015/11/24', 26, 'DQ'], + ['2015/11/25', 22, 'DQ'], ['2015/11/08', 35, 'TY'], + ['2015/11/09', 36, 'TY'], ['2015/11/10', 37, 'TY'], + ['2015/11/11', 22, 'TY'], ['2015/11/12', 24, 'TY'], + ['2015/11/13', 26, 'TY'], ['2015/11/14', 34, 'TY'], + ['2015/11/15', 21, 'TY'], ['2015/11/16', 18, 'TY'], + ['2015/11/17', 45, 'TY'], ['2015/11/18', 32, 'TY'], + ['2015/11/19', 35, 'TY'], ['2015/11/20', 30, 'TY'], + ['2015/11/21', 28, 'TY'], ['2015/11/22', 27, 'TY'], + ['2015/11/23', 26, 'TY'], ['2015/11/24', 15, 'TY'], + ['2015/11/25', 30, 'TY'], ['2015/11/26', 35, 'TY'], + ['2015/11/27', 42, 'TY'], ['2015/11/28', 42, 'TY'], + ['2015/11/08', 21, 'SS'], ['2015/11/09', 25, 'SS'], + ['2015/11/10', 27, 'SS'], ['2015/11/11', 23, 'SS'], + ['2015/11/12', 24, 'SS'], ['2015/11/13', 21, 'SS'], + ['2015/11/14', 35, 'SS'], ['2015/11/15', 39, 'SS'], + ['2015/11/16', 40, 'SS'], ['2015/11/17', 36, 'SS'], + ['2015/11/18', 33, 'SS'], ['2015/11/19', 43, 'SS'], + ['2015/11/20', 40, 'SS'], ['2015/11/21', 34, 'SS'], + ['2015/11/22', 28, 'SS'], ['2015/11/14', 7, 'QG'], + ['2015/11/15', 2, 'QG'], ['2015/11/16', 17, 'QG'], + ['2015/11/17', 33, 'QG'], ['2015/11/18', 40, 'QG'], + ['2015/11/19', 32, 'QG'], ['2015/11/20', 26, 'QG'], + ['2015/11/21', 35, 'QG'], ['2015/11/22', 40, 'QG'], + ['2015/11/23', 32, 'QG'], ['2015/11/24', 26, 'QG'], + ['2015/11/25', 22, 'QG'], ['2015/11/26', 16, 'QG'], + ['2015/11/27', 22, 'QG'], ['2015/11/28', 10, 'QG'], + ['2015/11/08', 10, 'SY'], ['2015/11/09', 15, 'SY'], + ['2015/11/10', 35, 'SY'], ['2015/11/11', 38, 'SY'], + ['2015/11/12', 22, 'SY'], ['2015/11/13', 16, 'SY'], + ['2015/11/14', 7, 'SY'], ['2015/11/15', 2, 'SY'], + ['2015/11/16', 17, 'SY'], ['2015/11/17', 33, 'SY'], + ['2015/11/18', 40, 'SY'], ['2015/11/19', 32, 'SY'], + ['2015/11/20', 26, 'SY'], ['2015/11/21', 35, 'SY'], + ['2015/11/22', 4, 'SY'], ['2015/11/23', 32, 'SY'], + ['2015/11/24', 26, 'SY'], ['2015/11/25', 22, 'SY'], + ['2015/11/26', 16, 'SY'], ['2015/11/27', 22, 'SY'], + ['2015/11/28', 10, 'SY'], ['2015/11/08', 10, 'DD'], + ['2015/11/09', 15, 'DD'], ['2015/11/10', 35, 'DD'], + ['2015/11/11', 38, 'DD'], ['2015/11/12', 22, 'DD'], + ['2015/11/13', 16, 'DD'], ['2015/11/14', 7, 'DD'], + ['2015/11/15', 2, 'DD'], ['2015/11/16', 17, 'DD'], + ['2015/11/17', 33, 'DD'], ['2015/11/18', 4, 'DD'], + ['2015/11/19', 32, 'DD'], ['2015/11/20', 26, 'DD'], + ['2015/11/21', 35, 'DD'], ['2015/11/22', 40, 'DD'], + ['2015/11/23', 32, 'DD'], ['2015/11/24', 26, 'DD'], + ['2015/11/25', 22, 'DD'] + ] + tr = ThemeRiver("主题河流图示例图") + tr.add(['DQ', 'TY', 'SS', 'QG', 'SY', 'DD'], data, is_label_show=True) + tr.render() diff --git a/test/test_timeline.py b/test/test_timeline.py new file mode 100644 index 000000000..e36803c9c --- /dev/null +++ b/test/test_timeline.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python +# coding=utf-8 +from __future__ import unicode_literals + +from random import randint + +from pyecharts import Bar, Pie, Line, Overlap, Timeline, Style, Map +from test.constants import CLOTHES + + +def test_timeline_bar(): + bar_1 = Bar("2012 年销量", "数据纯属虚构") + bar_1.add("春季", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_1.add("夏季", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_1.add("秋季", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_1.add("冬季", CLOTHES, [randint(10, 100) for _ in range(6)]) + + bar_2 = Bar("2013 年销量", "数据纯属虚构") + bar_2.add("春季", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_2.add("夏季", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_2.add("秋季", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_2.add("冬季", CLOTHES, [randint(10, 100) for _ in range(6)]) + + bar_3 = Bar("2014 年销量", "数据纯属虚构") + bar_3.add("春季", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_3.add("夏季", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_3.add("秋季", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_3.add("冬季", CLOTHES, [randint(10, 100) for _ in range(6)]) + + bar_4 = Bar("2015 年销量", "数据纯属虚构") + bar_4.add("春季", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_4.add("夏季", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_4.add("秋季", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_4.add("冬季", CLOTHES, [randint(10, 100) for _ in range(6)]) + + bar_5 = Bar("2016 年销量", "数据纯属虚构") + bar_5.add("春季", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_5.add("夏季", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_5.add("秋季", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_5.add("冬季", CLOTHES, [randint(10, 100) for _ in range(6)], + is_legend_show=True) + + timeline = Timeline(is_auto_play=True, timeline_bottom=0) + timeline.add(bar_1, '2012 年') + timeline.add(bar_2, '2013 年') + timeline.add(bar_3, '2014 年') + timeline.add(bar_4, '2015 年') + timeline.add(bar_5, '2016 年') + assert len(timeline.options.get("baseOption").get("series")) == 0 + timeline.render() + + +def test_timeline_pie(): + style = Style() + pie_style = style.add( + is_label_show=True, + radius=[30, 55], + rosetype="radius" + ) + pie_1 = Pie("2012 年销量比例", "数据纯属虚构") + pie_1.add("秋季", CLOTHES, [randint(10, 100) for _ in range(6)], **pie_style) + + pie_2 = Pie("2013 年销量比例", "数据纯属虚构") + pie_2.add("秋季", CLOTHES, [randint(10, 100) for _ in range(6)], **pie_style) + + pie_3 = Pie("2014 年销量比例", "数据纯属虚构") + pie_3.add("秋季", CLOTHES, [randint(10, 100) for _ in range(6)], **pie_style) + + pie_4 = Pie("2015 年销量比例", "数据纯属虚构") + pie_4.add("秋季", CLOTHES, [randint(10, 100) for _ in range(6)], **pie_style) + + pie_5 = Pie("2016 年销量比例", "数据纯属虚构") + pie_5.add("秋季", CLOTHES, [randint(10, 100) for _ in range(6)], **pie_style) + + timeline = Timeline(is_auto_play=True, timeline_bottom=0, + width=1200, height=600) + timeline.add(pie_1, '2012 年') + timeline.add(pie_2, '2013 年') + timeline.add(pie_3, '2014 年') + timeline.add(pie_4, '2015 年') + timeline.add(pie_5, '2016 年') + assert len(timeline.options.get("baseOption").get("series")) == 0 + timeline.render() + + +def test_timeline_bar_line(): + attr = ["{}月".format(i) for i in range(1, 7)] + bar = Bar("1 月份数据", "数据纯属虚构") + bar.add("bar", attr, [randint(10, 50) for _ in range(6)]) + line = Line() + line.add("line", attr, [randint(50, 80) for _ in range(6)]) + overlap_0 = Overlap() + overlap_0.add(bar) + overlap_0.add(line) + + bar_1 = Bar("2 月份数据", "数据纯属虚构") + bar_1.add("bar", attr, [randint(10, 50) for _ in range(6)]) + line_1 = Line() + line_1.add("line", attr, [randint(50, 80) for _ in range(6)]) + overlap_1 = Overlap() + overlap_1.add(bar_1) + overlap_1.add(line_1) + + bar_2 = Bar("3 月份数据", "数据纯属虚构") + bar_2.add("bar", attr, [randint(10, 50) for _ in range(6)]) + line_2 = Line() + line_2.add("line", attr, [randint(50, 80) for _ in range(6)]) + overlap_2 = Overlap() + overlap_2.add(bar_2) + overlap_2.add(line_2) + + bar_3 = Bar("4 月份数据", "数据纯属虚构") + bar_3.add("bar", attr, [randint(10, 50) for _ in range(6)]) + line_3 = Line() + line_3.add("line", attr, [randint(50, 80) for _ in range(6)]) + overlap_3 = Overlap() + overlap_3.add(bar_3) + overlap_3.add(line_3) + + bar_4 = Bar("5 月份数据", "数据纯属虚构") + bar_4.add("bar", attr, [randint(10, 50) for _ in range(6)]) + line_4 = Line() + line_4.add("line", attr, [randint(50, 80) for _ in range(6)]) + overlap_4 = Overlap() + overlap_4.add(bar_4) + overlap_4.add(line_4) + + timeline = Timeline(timeline_bottom=0) + timeline.add(overlap_0, '1 月') + timeline.add(overlap_1, '2 月') + timeline.add(overlap_2, '3 月') + timeline.add(overlap_3, '4 月') + timeline.add(overlap_4, '5 月') + timeline.render() + + +def test_timeline_map(): + timeline = Timeline(timeline_bottom=0) + value = [155, 10, 66, 78, 33, 80, 190, 53, 49.6] + attr = ["福建", "山东", "北京", "上海", "甘肃", + "新疆", "河南", "广西", "西藏"] + map = Map("Map 结合 VisualMap 示例", width=1200, height=600) + map.add("", attr, value, maptype='china', is_visualmap=True, + visual_text_color='#000', visual_top="30%") + timeline.add(map, "test1") + value = [155, 10, 66, 78, 33] + attr = ["福建", "山东", "北京", "上海", "甘肃"] + map = Map("Map 结合 VisualMap 示例", width=1200, height=600) + map.add("", attr, value, maptype='china', is_visualmap=True, + visual_text_color='#000', visual_top="30%") + timeline.add(map, "test2") + assert len(timeline.options.get("baseOption").get("series")) == 2 + timeline.render() + + +def test_timeline_different_legend(): + bar_1 = Bar("2012 年销量", "数据纯属虚构") + bar_1.add("春季a", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_1.add("夏季a", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_1.add("秋季a", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_1.add("冬季a", CLOTHES, [randint(10, 100) for _ in range(6)]) + + bar_2 = Bar("2013 年销量", "数据纯属虚构") + bar_2.add("春季b", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_2.add("夏季b", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_2.add("秋季b", CLOTHES, [randint(10, 100) for _ in range(6)]) + bar_2.add("冬季b", CLOTHES, [randint(10, 100) for _ in range(6)], + is_legend_show=True) + + timeline = Timeline(is_auto_play=True, timeline_bottom=0) + timeline.add(bar_1, '2012 年') + timeline.add(bar_2, '2013 年') + content = timeline._repr_html_() + assert "\\u6625\\u5b63a" in content # 春季 a + assert "\\u6625\\u5b63b" in content # 春季 b diff --git a/test/test_treemap.py b/test/test_treemap.py new file mode 100644 index 000000000..d0807893b --- /dev/null +++ b/test/test_treemap.py @@ -0,0 +1,65 @@ +# coding=utf-8 +from __future__ import unicode_literals + +import sys + +from pyecharts import TreeMap + +PY2 = sys.version_info[0] == 2 + +data = [ + { + "value": 40, + "name": "我是A", + }, + { + "value": 180, + "name": "我是B", + "children": [ + { + "value": 76, + "name": "我是B.children", + "children": [ + { + "value": 12, + "name": "我是B.children.a", + }, + { + "value": 28, + "name": "我是B.children.b", + }, + { + "value": 20, + "name": "我是B.children.c", + }, + { + "value": 16, + "name": "我是B.children.d", + }] + }]} +] + + +def test_treemap_default(): + treemap = TreeMap("树图-默认示例", width=1200, height=600) + treemap.add("演示数据", data, is_label_show=True, label_pos='inside') + treemap.render() + + +def test_treemap_drilldown(): + treemap = TreeMap("树图-下钻示例", width=1200, height=600) + treemap.add("演示数据", data, is_label_show=True, label_pos='inside', + treemap_left_depth=1) + treemap.render() + + +def test_treemap_offcical_data(): + treemap = TreeMap("树图-官方数据", width=1200, height=600) + import os + import json + import codecs + test_fixture = os.path.join("fixtures", "treemap.json") + with codecs.open(test_fixture, "r", encoding='utf-8') as f: + data = json.load(f) + treemap.add("演示数据", data, is_label_show=True, label_pos='inside') + treemap.render() diff --git a/test/test_utils.py b/test/test_utils.py new file mode 100644 index 000000000..7b176c717 --- /dev/null +++ b/test/test_utils.py @@ -0,0 +1,102 @@ +# coding=utf-8 +from __future__ import unicode_literals + +import codecs +import json +import os +from datetime import date + +import numpy as np +from nose.tools import eq_ + +from pyecharts.utils import ( + write_utf8_html_file, + get_resource_dir, + json_dumps, + merge_js_dependencies +) + + +def test_get_resource_dir(): + path = get_resource_dir('templates') + expected = os.path.join(os.getcwd(), '..', 'pyecharts', 'templates') + eq_(path, os.path.abspath(expected)) + + +def test_write_utf8_html_file(): + content = "柱状图数据堆叠示例" + file_name = 'test.html' + write_utf8_html_file(file_name, content) + with codecs.open(file_name, 'r', 'utf-8') as f: + actual_content = f.read() + eq_(content, actual_content) + + +def test_json_encoder(): + """ + Test json encoder. + :return: + """ + data = date(2017, 1, 1) + eq_(json.dumps({'date': '2017-01-01', 'a': '1'}, indent=0), + json_dumps({'date': data, 'a': '1'})) + + data2 = {'np_list': np.array(['a', 'b', 'c'])} + data2_e = {'np_list': ['a', 'b', 'c']} + eq_(json.dumps(data2_e, indent=0), json_dumps(data2)) + + +class MockChart(object): + """ + A mock class for a Chart and Page + """ + + def __init__(self, js_dependencies): + self.js_dependencies = js_dependencies + + +def test_merge_js_dependencies_with_one_chart(): + # Prepare some kinds of charts or page. + + base_chart = MockChart(['echarts']) + + # One chart or page + eq_(['echarts'], merge_js_dependencies(base_chart)) + # A map chart + ch1 = MockChart(['echarts', 'fujian', 'zhengjiang', 'anhui']) + eq_( + ['echarts', 'fujian', 'zhengjiang', 'anhui'], + merge_js_dependencies(ch1) + ) + + +def test_merge_js_dependencies_with_multiple_charts(): + base_chart = MockChart(['echarts']) + map_chart = MockChart(['echarts', 'fujian']) + three_d_chart = MockChart(['echarts', 'echartsgl']) + # Multiple charts + eq_( + ['echarts', 'fujian'], + merge_js_dependencies(base_chart, map_chart) + ) + eq_( + ['echarts', 'echartsgl', 'fujian'], + merge_js_dependencies(base_chart, map_chart, three_d_chart) + ) + + +def test_merge_js_dependencies_with_mixed_chart_and_string(): + map_chart = MockChart(['echarts', 'fujian']) + + eq_( + ['echarts', 'zhejiang'], + merge_js_dependencies('echarts', 'zhejiang') + ) + eq_( + ['echarts', 'zhejiang'], + merge_js_dependencies(['echarts', 'zhejiang']) + ) + eq_( + ['echarts', 'fujian'], + merge_js_dependencies('echarts', map_chart) + ) diff --git a/test/test_wordcloud.py b/test/test_wordcloud.py index 41896fa60..c3aae49d7 100644 --- a/test/test_wordcloud.py +++ b/test/test_wordcloud.py @@ -1,14 +1,30 @@ +#!/usr/bin/env python +# coding=utf-8 + from pyecharts import WordCloud -def test_wordcloud(): - name = ['Sam S Club', 'Macys', 'Amy Schumer', 'Jurassic World', 'Charter Communications', - 'Chick Fil A', 'Planet Fitness', 'Pitch Perfect', 'Express', 'Home', 'Johnny Depp', - 'Lena Dunham', 'Lewis Hamilton', 'KXAN', 'Mary Ellen Mark', 'Farrah Abraham', - 'Rita Ora', 'Serena Williams', 'NCAA baseball tournament', 'Point Break'] - value = [10000, 6181, 4386, 4055, 2467, 2244, 1898, 1484, 1112, 965, 847, 582, 555, - 550, 462, 366, 360, 282, 273, 265] +name = [ + 'Sam S Club', 'Macys', 'Amy Schumer', 'Jurassic World', + 'Charter Communications', 'Chick Fil A', 'Planet Fitness', + 'Pitch Perfect', 'Express', 'Home', 'Johnny Depp', 'Lena Dunham', + 'Lewis Hamilton', 'KXAN', 'Mary Ellen Mark', 'Farrah Abraham', + 'Rita Ora', 'Serena Williams', 'NCAA baseball tournament', 'Point Break' + ] + +value = [ + 10000, 6181, 4386, 4055, 2467, 2244, 1898, 1484, 1112, + 965, 847, 582, 555, 550, 462, 366, 360, 282, 273, 265 + ] + + +def test_wordcloud_default(): + wordcloud = WordCloud(width=1300, height=620) + wordcloud.add("", name, value, word_size_range=[30, 100], rotate_step=66) + assert "diamond" not in wordcloud._repr_html_() + + +def test_wordcloud_shape_diamond(): wordcloud = WordCloud(width=1300, height=620) - wordcloud.add("", name, value, word_size_range=[20, 100]) - wordcloud.show_config() - wordcloud.render() + wordcloud.add("", name, value, word_size_range=[30, 100], shape='diamond') + assert "diamond" in wordcloud._repr_html_() diff --git a/test/utils.py b/test/utils.py new file mode 100644 index 000000000..8efc0b1d0 --- /dev/null +++ b/test/utils.py @@ -0,0 +1,9 @@ +import codecs + + +def get_default_rendering_file_content(file_name='render.html'): + """ + Simply returns the content render.html + """ + with codecs.open(file_name, 'r', 'utf-8') as f: + return f.read()