1. 前言
在日常工作中,为了更直观的发现数据中隐藏的规律,察觉到变量之间的互动关系,人们常常借助可视化帮助我们更好的给他人解释现象,做到一图胜千文的说明效果。
在Python中,常见的数据可视化库有:
上述两个库都是静态的可视化库,大多数做过前端Web开发的同学都用到过Echarts.js库,它是一款前端可视化的JS库、功能非常之强大。在使用之前,需要导入js库到项目中。对于平时用Python较多的同学而言,如果每次实现可视化功能(特别是一些小需求),都需要引用js库显然不太方便,于是就在想有没有Python与Echarts结合的轮子。答案是肯定的 ,在Github中就有一个国人开发的一个Echarts与Python结合的轮子:Pyecharts,它不仅很好的兼容了web项目,而且可以做到可视化的动态效果。
2. Pyecharts介绍
Pyecharts 是一个用于生成 Echarts 图表的类库。常规的Echarts 是由百度开源的一个数据可视化 JS 库,主要用于数据可视化。简单来说,Pyecharts是一款将python与echarts结合的强大的数据可视化工具。
使用 Pyecharts 可以生成独立的网页,也可以在 flask , Django 中集成使用。
项目介绍:
http:
项目源码:
https:
从项目文档介绍可知, pyecharts目前分为两个大的系列版本:0.5.x 和v1.x.x。
0.5.x 版本将不再进行维护,文档位于 05x-docs.pyecharts.org。
新版本系列将从 v1.0.0 开始,文档位于 pyecharts.org;示例位于 gallery.pyecharts.org
PS: v0.5.x 和 V1 间不兼容,V1 是一个全新的版本。
3. Pyecharts支持30+种可视化图表
得益于Echarts 项目,目前Pyecharts支持 30+ 种常见图表,如下所示:
Bar(柱状图/条形图)
Bar3D(3D 柱状图)
Boxplot(箱形图)
EffectScatter(散点图)
Funnel(漏斗图)
Gauge(仪表盘)
Geo(地理坐标系)
Graph(关系图)
HeatMap(热力图)
Kline(K线图)
Line(折线/面积图)
Line3D(3D 折线图)
Liquid(水球图)
Map(地图)
Parallel(平行坐标系)
Pie(饼图)
Polar(极坐标系)
Radar(雷达图)
Sankey(桑基图)
Scatter(散点图)
Scatter3D(3D 散点图)
ThemeRiver(主题河流图)
WordCloud(词云图)
4. Pyecharts安装
1、pip 安装
$ pip install pyecharts -U
2、源码安装
# v1 以上版本 $ git clone https://github.com/pyecharts/pyecharts.git # 如果需要安装 0.5.11 版本,请使用 git clone https://github.com/pyecharts/pyecharts.git -b v05x $ cd pyecharts $ pip install -r requirements.txt $ python setup.py install
在使用pip安装库时,由于墙的原因,下载时可能会出现断线和速度过慢的问题导致下载失败,所以建议通过豆瓣源或清华镜像来进行下载:
pip install -i https://pypi.douban.com/simple pyecharts pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts
PS: 这里要专门说明一下,自从 0.3.2 开始,为了缩减项目本身的体积以及维持 pyecharts 项目的轻量化运行,pyecharts 将不再自带地图 js 文件。如用户需要用到地图图表(Geo、Map),可自行安装对应的地图文件包。
pip install echarts-countries-pypkg pip install echarts-china-provinces-pypkg pip install echarts-china-cities-pypkg
5. Pyecharts官方示例实战
现在我们来开始正式使用pycharts,这里我们先直接使用官方的数据,感受一下可视化展示效果。
from pyecharts.charts import Barfrom pyecharts import options as opts bar = ( Bar() .add_xaxis(["衬衫" , "毛衣" , "领带" , "裤子" , "风衣" , "高跟鞋" , "袜子" ]) .add_yaxis("商家A" , [114 , 55 , 27 , 101 , 125 , 27 , 105 ]) .add_yaxis("商家B" , [57 , 134 , 137 , 129 , 145 , 60 , 49 ]) .set_global_opts(title_opts=opts.TitleOpts(title="某商场销售情况" )) ) bar.render_notebook()
在这里顺便安利一下jupyter,pyecharts在v0.1.9.2版本开始,在jupyter上可以直接调用实例(例如上方直接调用bar.render_notebook())就可以将图表直接展示出来,非常方便。
如果脚本在非jupyter环境运行,图表渲染方法需改为:
bar .render ()
默认情况下,pycharts生成图表为HTML格式,也支持生成png图片格式,如下:
from snapshot_selenium import snapshot as driverfrom pyecharts import options as optsfrom pyecharts.charts import Barfrom pyecharts.render import make_snapshotdef bar_chart () -> Bar: c = ( Bar() .add_xaxis(["衬衫" , "毛衣" , "领带" , "裤子" , "风衣" , "高跟鞋" , "袜子" ]) .add_yaxis("商家A" , [114 , 55 , 27 , 101 , 125 , 27 , 105 ]) .add_yaxis("商家B" , [57 , 134 , 137 , 129 , 145 , 60 , 49 ]) .reversal_axis() .set_series_opts(label_opts=opts.LabelOpts(position="right" )) .set_global_opts(title_opts=opts.TitleOpts(title="Bar-测试渲染图片" )) ) return c make_snapshot(driver, bar_chart().render(), "bar.png" )
6. Pyecharts几种高频使用的可视化图表
在上面官方示例中的柱状图表我们已经能感受到pycharts可视化功能的强大,最后再介始几种日常工作中常用的可视化图表及对应示例。
6.1 Pie饼状图
from pyecharts import options as optsfrom pyecharts.charts import Piefrom pyecharts.faker import Faker pie = ( Pie() .add("" , [list(z) for z in zip(Faker.choose(), Faker.values())]) .set_colors(["blue" , "green" , "yellow" , "red" , "pink" , "orange" , "purple" ]) .set_global_opts(title_opts=opts.TitleOpts(title="Pie-设置颜色" )) .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}" )) ) pie.render_notebook()
6.2 仪表盘
from pyecharts import options as optsfrom pyecharts.charts import Gauge g = ( Gauge() .add("" , [("完成率" , 66.6 )]) .set_global_opts(title_opts=opts.TitleOpts(title="Gauge-基本示例" )) ) g.render_notebook()
6.3 折线图
import pyecharts.options as optsfrom pyecharts.charts import Linefrom pyecharts.faker import Faker c = ( Line() .add_xaxis(Faker.choose()) .add_yaxis("商家A" , Faker.values(), is_smooth=True ) .add_yaxis("商家B" , Faker.values(), is_smooth=True ) .set_global_opts(title_opts=opts.TitleOpts(title="Line-smooth" )) ) c.render_notebook()
6.4 K线图
from pyecharts import options as optsfrom pyecharts.charts import Kline data = [ [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 ], ] k = ( Kline() .add_xaxis(["2017/7/{}" .format(i + 1 ) for i in range (31 )]) .add_yaxis ("k线图" , data ) .set_global_opts ( yaxis_opts=opts.AxisOpts(is_scale=True ), xaxis_opts =opts.AxisOpts(is_scale=True), title_opts=opts.TitleOpts(title="K线图-基本示例" ), ) ) k.render_notebook()
6.5 地图Map
from pyecharts import options as optsfrom pyecharts.charts import Map from pyecharts.faker import Faker map = ( Map () .add("中国地图" , [list(z) for z in zip(Faker.provinces, Faker.values())], "china" ) .set_global_opts(title_opts=opts.TitleOpts(title="Map-基本示例" )) ) map.render_notebook()
6.6 词云图
import pyecharts.options as optsfrom pyecharts.charts import WordCloud data = [ ("生活资源" , "999" ), ("供热管理" , "888" ), ("供气质量" , "777" ), ("生活用水管理" , "688" ), ("一次供水问题" , "588" ), ("交通运输" , "516" ), ("城市交通" , "515" ), ("环境保护" , "483" ), ("房地产管理" , "462" ), ("城乡建设" , "449" ), ("社会保障与福利" , "429" ), ("社会保障" , "407" ), ("文体与教育管理" , "406" ), ("公共安全" , "406" ), ("公交运输管理" , "386" ), ("出租车运营管理" , "385" ), ("供热管理" , "375" ), ("市容环卫" , "355" ), ("自然资源管理" , "355" ), ("粉尘污染" , "335" ), ("噪声污染" , "324" ), ("土地资源管理" , "304" ), ("物业服务与管理" , "304" ), ("医疗卫生" , "284" ), ("粉煤灰污染" , "284" ), ("占道" , "284" ), ("供热发展" , "254" ), ("农村土地规划管理" , "254" ), ("生活噪音" , "253" ), ("供热单位影响" , "253" ), ("城市供电" , "223" ), ("房屋质量与安全" , "223" ), ("大气污染" , "223" ), ("房屋安全" , "223" ), ("文化活动" , "223" ), ("拆迁管理" , "223" ), ("公共设施" , "223" ), ("供气质量" , "223" ), ("供电管理" , "223" ), ("燃气管理" , "152" ), ("教育管理" , "152" ), ("医疗纠纷" , "152" ), ("执法监督" , "152" ), ("设备安全" , "152" ), ("政务建设" , "152" ), ("县区、开发区" , "152" ), ("宏观经济" , "152" ), ("教育管理" , "112" ), ("社会保障" , "112" ), ("生活用水管理" , "112" ), ("物业服务与管理" , "112" ), ("分类列表" , "112" ), ("农业生产" , "112" ), ("二次供水问题" , "112" ), ("城市公共设施" , "92" ), ("拆迁政策咨询" , "92" ), ("物业服务" , "92" ), ("物业管理" , "92" ), ("社会保障保险管理" , "92" ), ("低保管理" , "92" ), ("文娱市场管理" , "72" ), ("城市交通秩序管理" , "72" ), ("执法争议" , "72" ), ("商业烟尘污染" , "72" ), ("占道堆放" , "71" ), ("地上设施" , "71" ), ("水质" , "71" ), ("无水" , "71" ), ("供热单位影响" , "71" ), ("人行道管理" , "71" ), ("主网原因" , "71" ), ("集中供热" , "71" ), ("客运管理" , "71" ), ("国有公交(大巴)管理" , "71" ), ("工业粉尘污染" , "71" ), ("治安案件" , "71" ), ("压力容器安全" , "71" ), ("身份证管理" , "71" ), ("群众健身" , "41" ), ("工业排放污染" , "41" ), ("破坏森林资源" , "41" ), ("市场收费" , "41" ), ("生产资金" , "41" ), ("生产噪声" , "41" ), ("农村低保" , "41" ), ("劳动争议" , "41" ), ("劳动合同争议" , "41" ), ("劳动报酬与福利" , "41" ), ("医疗事故" , "21" ), ("停供" , "21" ), ("基础教育" , "21" ), ("职业教育" , "21" ), ("物业资质管理" , "21" ), ("拆迁补偿" , "21" ), ("设施维护" , "21" ), ("市场外溢" , "11" ), ("占道经营" , "11" ), ("树木管理" , "11" ), ("农村基础设施" , "11" ), ("无水" , "11" ), ("供气质量" , "11" ), ("停气" , "11" ), ("燃气管理" , "11" ), ("市容环卫" , "11" ), ("新闻传媒" , "11" ), ("人才招聘" , "11" ), ("市场环境" , "11" ), ("行政事业收费" , "11" ), ("食品安全与卫生" , "11" ), ("城市交通" , "11" ), ("房地产开发" , "11" ), ("房屋配套问题" , "11" ), ("物业服务" , "11" ), ("物业管理" , "11" ), ("占道" , "11" ), ("园林绿化" , "11" ), ("户籍管理及身份证" , "11" ), ("公交运输管理" , "11" ), ("公路(水路)交通" , "11" ), ("房屋与图纸不符" , "11" ), ("有线电视" , "11" ), ("社会治安" , "11" ), ("林业资源" , "11" ), ("其他行政事业收费" , "11" ), ("经营性收费" , "11" ), ("食品安全与卫生" , "11" ), ("体育活动" , "11" ), ("有线电视安装及调试维护" , "11" ), ("低保管理" , "11" ), ("劳动争议" , "11" ), ("社会福利及事务" , "11" ), ("一次供水问题" , "11" ), ] c=( WordCloud() .add(series_name="热点分析" , data_pair=data, word_size_range=[6 , 66 ]) .set_global_opts( title_opts=opts.TitleOpts( title="热点分析" , title_textstyle_opts=opts.TextStyleOpts(font_size=23 ) ), tooltip_opts=opts.TooltipOpts(is_show=True ), ) ) c.render_notebook()
上述示例仅供参考,读者们结合日常工作应用,学会举一反三才是关健,更多Pychart示例介绍可见:代码示例