python可視化利器:pyecharts


python可視化利器:pyecharts


 

前言

前面我們提及ggplotRPython中都是數據可視化的利器,在機器學習和數據分析領域得到了廣泛的應用。pyecharts結合了Python和百度開源的Echarts工具,基於其交互性和便利性得到了眾多開發者的認可。擁有如下的特點:

  • 可集成至FlaskDjango等主流web框架
  • 相較於matplotlib等傳統繪圖庫,pyecharts語法更加簡潔,更加注重數據的呈現方式而非圖形細節
  • 包含原生的百度地圖,方便繪制地理可視化圖形

本文主要整理自pyecharts官網github文檔:https://github.com/pyecharts/pyecharts/

安裝

# pip安裝 $ pip(3) install pyecharts # 源碼安裝 $ git clone https://github.com/pyecharts/pyecharts.git $ cd pyecharts $ pip install -r requirements.txt $ python setup.py install # 或者執行 python install.py 

簡單的實例

首先繪制第一個圖表:

from pyecharts.charts import Bar bar = Bar() bar.add_xaxis(["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"]) bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90]) # render 會生成本地 HTML 文件,默認會在當前目錄生成 render.html 文件 # 也可以傳入路徑參數,如 bar.render("mycharts.html") bar.render() # pyechart所有方法均支持鏈式調用, 因此上面的代碼也可以改寫成如下形式 from pyecharts.charts import Bar bar = ( Bar() .add_xaxis(["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"]) .add_yaxis("商家A", [5, 20, 36, 10, 75, 90]) ) bar.render() # 使用options配置項添加主標題和副標題 from pyecharts.charts import Bar from pyecharts import options as opts bar = Bar() bar.add_xaxis(["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"]) bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90]) bar.set_global_opts(title_opts=opts.TitleOpts(title="主標題", subtitle="副標題")) bar.render() 
 
image.png

基本圖表

1. 柱狀圖

from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.commons.utils import JsCode from pyecharts.globals import ThemeType list2 = [ {"value": 12, "percent": 12 / (12 + 3)}, {"value": 23, "percent": 23 / (23 + 21)}, {"value": 33, "percent": 33 / (33 + 5)}, {"value": 3, "percent": 3 / (3 + 52)}, {"value": 33, "percent": 33 / (33 + 43)}, ] list3 = [ {"value": 3, "percent": 3 / (12 + 3)}, {"value": 21, "percent": 21 / (23 + 21)}, {"value": 5, "percent": 5 / (33 + 5)}, {"value": 52, "percent": 52 / (3 + 52)}, {"value": 43, "percent": 43 / (33 + 43)}, ] c = ( # 設置主題: 默認是黑紅風格, 其他風格大部分還不如黑紅風格好看 Bar(init_opts=opts.InitOpts()) # 新增x軸數據, 這里有五列柱狀圖 .add_xaxis( [ "名字很長的X軸標簽1", "名字很長的X軸標簽2", "名字很長的X軸標簽3", "名字很長的X軸標簽4", "名字很長的X軸標簽5", ] ) # 參數一: 系列名稱; 參數二: 系列數據; stack: 數據堆疊; category_gap: 柱間距離 .add_yaxis("product1", list2, stack="stack1", category_gap="50%") .add_yaxis("product2", list3, stack="stack1", category_gap="50%") # set_series_opts系列配置項,可配置圖元樣式、文字樣式、標簽樣式、點線樣式等; 其中opts.LabelOpts指標簽配置項 .set_series_opts( label_opts=opts.LabelOpts( position="right", # 數據標簽的位置 formatter=JsCode( # 標簽內容的格式器, 這里展示了百分比 "function(x){return Number(x.data.percent * 100).toFixed() + '%';}" ), ) ) # set_global_opts全局配置項 .set_global_opts( # 旋轉坐標軸: 解決坐標軸名字過長的問題 xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)), title_opts=opts.TitleOpts(title="Bar-柱狀圖展示", subtitle="Bar-副標題"), ) .render("stack_bar_percent.html") ) 
 
image.png

2. 特效散點圖

from pyecharts import options as opts from pyecharts.charts import EffectScatter from pyecharts.faker import Faker from pyecharts.globals import SymbolType c = ( # 特效散點圖 EffectScatter() # Faker返回假數據 .add_xaxis(Faker.choose()) # symbol=SymbolType.ARROW修改特效類型: 這里指箭頭特效 .add_yaxis("", Faker.values(), symbol=SymbolType.ARROW) .set_global_opts( title_opts=opts.TitleOpts(title="EffectScatter-顯示分割線"), # 顯示橫縱軸分割線 xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)), yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)), ) .render("effectscatter_splitline.html") ) 
 
image.png

3. 漏斗圖

研發崗涉及業務分析時經常需要繪制漏斗圖,用pyecharts可以一鍵生成


data = [[x_data[i], y_data[i]] for i in range(len(x_data))] ( # InitOpts初始化配置項: 配置畫布長寬 Funnel(init_opts=opts.InitOpts(width="800px", height="500px")) .add( series_name="網頁訪問數據", data_pair=data, # gap: 數據圖形間距, 默認0 gap=2, # tooltip_opts: 鼠標提示框組件配置項, a: series_name, b: x_data, c: y_data tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b} : {c}%"), # label_opts: 標簽配置項, inside指標簽在圖層內部 label_opts=opts.LabelOpts(is_show=True, position="inside"), # 圖元樣式配置項 itemstyle_opts=opts.ItemStyleOpts(border_color="#fff", border_width=1), ) .set_global_opts(title_opts=opts.TitleOpts(title="漏斗圖", subtitle="純屬虛構")) .render("funnel_chart.html") ) 
 
image.png

4. 關系圖

from pyecharts import options as opts from pyecharts.charts import Graph # 構造數據: nodes表示節點信息和對應的節點大小; links表示節點之間的關系 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 = [] # fake節點之間的兩兩雙向關系 for i in nodes: for j in nodes: links.append({"source": i.get("name"), "target": j.get("name")}) c = ( Graph() # repulsion: 節點之間的斥力因子, 值越大表示節點之間的斥力越大 .add("", nodes, links, repulsion=8000) .set_global_opts(title_opts=opts.TitleOpts(title="Graph-基本示例")) .render("graph_base.html") ) 
 
image.png

數據分析中常見的微博轉發圖也是通過關系圖轉化來的:

 

 
image.png

5. 組合組件Grid

最常用的是組合直方圖和折點圖。

from pyecharts import options as opts from pyecharts.charts import Bar, Grid, Line from pyecharts.faker import Faker bar = ( Bar() .add_xaxis(Faker.choose()) .add_yaxis("商家A", Faker.values()) .add_yaxis("商家B", Faker.values()) .set_global_opts(title_opts=opts.TitleOpts(title="Grid-Bar")) ) line = ( Line() .add_xaxis(Faker.choose()) .add_yaxis("商家A", Faker.values()) .add_yaxis("商家B", Faker.values()) .set_global_opts( title_opts=opts.TitleOpts(title="Grid-Line", pos_top="48%"), legend_opts=opts.LegendOpts(pos_top="48%"), ) ) grid = ( Grid() # GridOpts: 直角坐標系網格配置項 # pos_bottom: grid組件離容器底部的距離 # pos_top: grid組件離容器頂部的距離 .add(bar, grid_opts=opts.GridOpts(pos_bottom="60%")) .add(line, grid_opts=opts.GridOpts(pos_top="60%")) .render("grid_vertical.html") ) 
 
image.png

6. 折線圖

import pyecharts.options as opts from pyecharts.charts import Line from pyecharts.faker import Faker c = ( Line() # Faker: 獲取偽造數據集 .add_xaxis(Faker.choose()) .add_yaxis("商家A", Faker.values()) .add_yaxis("商家B", Faker.values()) .set_global_opts(title_opts=opts.TitleOpts(title="Line-基本示例")) .render("line_base.html") ) 
 
image.png

7. 地圖

from pyecharts import options as opts from pyecharts.charts import Map from pyecharts.faker import Faker c = ( Map() # Faker: 偽造數據集, 包括國家和對應的value .add("商家A", [list(z) for z in zip(Faker.country, Faker.values())], "world") # 顯示label .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( title_opts=opts.TitleOpts(title="Map-世界地圖"), # VisualMapOpts: 視覺映射配置項, 指定組件的最大值 visualmap_opts=opts.VisualMapOpts(max_=200), ) .render("map_world.html") ) 
 
image.png

8. 層疊組件

from pyecharts import options as opts from pyecharts.charts import Bar, Line from pyecharts.faker import Faker 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() .add_xaxis(Faker.months) .add_yaxis("蒸發量", v1) .add_yaxis("降水量", v2) .extend_axis( # 新增y坐標軸配置項: 因為有三個縱軸數據, 包括蒸發量/降水量(單位是ml), 平均溫度(單位是°C) yaxis=opts.AxisOpts( axislabel_opts=opts.LabelOpts(formatter="{value} °C"), interval=5 ) ) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( title_opts=opts.TitleOpts(title="Overlap-bar+line"), # 設置y坐標軸配置項 yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} ml")), ) ) # 新增折線圖 line = Line().add_xaxis(Faker.months).add_yaxis("平均溫度", v3, yaxis_index=1) # 使用層疊組件組合圖形 bar.overlap(line) bar.render("overlap_bar_line.html") 
 
image.png

9. 餅狀圖

from pyecharts import options as opts from pyecharts.charts import Pie from pyecharts.faker import Faker c = ( Pie() .add( "", # 設置數據集 [list(z) for z in zip(Faker.choose(), Faker.values())], radius=["40%", "55%"], # 設置標簽配置項 label_opts=opts.LabelOpts( # 標簽位置 position="outside", # 標簽內容格式器: {a}(系列名稱),{b}(數據項名稱),{c}(數值), {d}(百分比) formatter="{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c} {per|{d}%} ", # 文字塊背景色 background_color="#eee", # 文字塊邊框顏色 border_color="#aaa", border_width=1, border_radius=4, # 在 rich 里面,可以自定義富文本樣式。利用富文本樣式,可以在標簽中做出非常豐富的效果 rich={ "a": {"color": "#999", "lineHeight": 22, "align": "center"}, "abg": { "backgroundColor": "#e3e3e3", "width": "100%", "align": "right", "height": 22, "borderRadius": [4, 4, 0, 0], }, "hr": { "borderColor": "#aaa", "width": "100%", "borderWidth": 0.5, "height": 0, }, "b": {"fontSize": 16, "lineHeight": 33}, "per": { "color": "#eee", "backgroundColor": "#334455", "padding": [2, 4], "borderRadius": 2, }, }, ), ) .set_global_opts(title_opts=opts.TitleOpts(title="Pie-富文本示例")) .render("pie_rich_label.html") ) 

10. 雷達圖

import pyecharts.options as opts from pyecharts.charts import Radar """ Gallery 使用 pyecharts 1.1.0 參考地址: https://echarts.baidu.com/examples/editor.html?c=radar 目前無法實現的功能: 1、雷達圖周圍的圖例的 textStyle 暫時無法設置背景顏色 """ v1 = [[4300, 10000, 28000, 35000, 50000, 19000]] v2 = [[5000, 14000, 28000, 31000, 42000, 21000]] ( Radar(init_opts=opts.InitOpts(width="1280px", height="720px", bg_color="#CCCCCC")) .add_schema( schema=[ opts.RadarIndicatorItem(name="銷售(sales)", max_=6500), opts.RadarIndicatorItem(name="管理(Administration)", max_=16000), opts.RadarIndicatorItem(name="信息技術(Information Technology)", max_=30000), opts.RadarIndicatorItem(name="客服(Customer Support)", max_=38000), opts.RadarIndicatorItem(name="研發(Development)", max_=52000), opts.RadarIndicatorItem(name="市場(Marketing)", max_=25000), ], splitarea_opt=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1) ), textstyle_opts=opts.TextStyleOpts(color="#fff"), ) .add( series_name="預算分配(Allocated Budget)", data=v1, linestyle_opts=opts.LineStyleOpts(color="#CD0000"), ) .add( series_name="實際開銷(Actual Spending)", data=v2, linestyle_opts=opts.LineStyleOpts(color="#5CACEE"), ) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( title_opts=opts.TitleOpts(title="基礎雷達圖"), legend_opts=opts.LegendOpts() ) .render("basic_radar_chart.html") ) 
 
image.png

11. 普通散點圖

from pyecharts import options as opts from pyecharts.charts import Scatter from pyecharts.faker import Faker c = ( Scatter() .add_xaxis(Faker.choose()) .add_yaxis("商家A", Faker.values()) .set_global_opts( title_opts=opts.TitleOpts(title="Scatter-顯示分割線"), xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)), yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)), ) .render("scatter_splitline.html") ) 
 
image.png

其他圖形

其他的圖形示例可以在官方文檔中查詢:http://gallery.pyecharts.org/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM