進行數據處理的時候,可視化是非常重要的數據分析方式,但是有時候在處理大批量的數據時,由於數據量過多,數據往往會非常密集,而不能發現有效信息,而我們經常使用的matplotlib不能滿足這樣的需求,這就需要交互式的可視化方案,提供比較方便和快捷的數據可視化操作。前幾天在處理數據的時候,需要實現數據可以滑動或者選擇查看,就發現了幾個python實現交互式可視化的庫,跟大家分享一下。
首先簡單介紹一下python的可視化的分類。在Python語言環境裡,有不少可視化解決方案,主要的可以大致分為幾類:
•基於maplotlib的可視化庫,例如經常使用的matplotlib,seaborn以及pandas和scikit-plot的繪圖•基於JavaScript的可視化庫,例如broken,plotly(DASH)以及pyecharts等庫,可以實現交互式的可視化操作•基於上述兩者或其他組合功能的庫,例如holoviews可以和Seaborn,pandas或者broken組合使用下圖是Jake VanderPlas在2017年對python可視化解決方案的總結,有些新的包沒有包含,可以作為參考
圖片來源於https://speakerdeck.com/jakevdp/pythons-visualization-landscape-pycon-2017
我在解決python交互式的可視化問題時,主要用到的是基於JavaScript的可視化庫pyecharts。pyecharts 是一個用於生成 Echarts 圖表的類庫。Echarts 是百度開源的一個數據可視化 JS 庫。用 Echarts 生成的圖可視化效果非常棒,pyecharts 是為了與 Python 進行對接,方便在 Python 中直接使用數據生成圖。使用pyecharts可以生成獨立的網頁,也可以在flask、django中集成使用 ,此外也可以直接利用render_notebook,直接在jupyter notebook裡調用渲染。
pyecharts的安裝pyecharts 分為 v0.5.X 和 v1 兩個大版本,v0.5.X 和 v1 間不兼容,v1 是一個全新的版本。其中v0.5.X支持python2.7和3.4+,未來不再進行維護,v1僅支持python3.6+,是以後版本迭代的基礎。 安裝利用pip,利用conda安裝沒有成功
或源碼安裝
$ 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])bar.add_yaxis("商家B", [8, 15, 49, 15, 65, 80])bar.render('bar.html')render 會生成本地 HTML 文件,默認會在當前目錄生成 render.html 文件嗎,也可以傳入路徑參數,如 bar.render("bar.html"),此外如果使用的是juypter notebook 可以直接reader_notebook在jupyter裡面渲染。打開html文件:
這是兩個商家不同衣服銷量對比的柱狀圖,可以查看數值的詳細信息,以及對不同的項目進行選擇。
柱狀圖
接下來參考官方的示例,對常用的圖表進行簡單示範:柱狀圖可以進行對比分析,數據是對於不同地級市的觀測和預報數據,由於數據太多,單獨畫在一個圖片中,將會非常擁擠,無法清晰看出差距,就需要藉助於交互式的圖像方案:
from pyecharts import options as optsfrom pyecharts.charts import Bardef bar_test(df) -> Bar: c = ( Bar() .add_xaxis(df.index.tolist()) .add_yaxis("觀測", df['氣溫觀測'].tolist(),category_gap="10%", gap="5%") .add_yaxis("預報", df['氣溫預測'].tolist(), category_gap="10%", gap="5%") .set_global_opts( title_opts=opts.TitleOpts(title="地級市氣溫觀測與預報分析"), toolbox_opts=opts.ToolboxOpts(), yaxis_opts=opts.AxisOpts(name="氣溫"), xaxis_opts=opts.AxisOpts(name="城市"), datazoom_opts=[opts.DataZoomOpts(),opts.DataZoomOpts(orient="vertical"), opts.DataZoomOpts(type_="inside")] ) .set_series_opts( label_opts=opts.LabelOpts(is_show=False), markline_opts=opts.MarkLineOpts( data=[ opts.MarkLineItem(type_="min", name="最小值"), opts.MarkLineItem(type_="max", name="最大值"), opts.MarkLineItem(type_="average", name="平均值"), ] ), markpoint_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), opts.MarkPointItem(type_="average", name="平均值"), ] ) ) ) return cc=bar_datazoom_slider_vertical(data)c.render_notebook()選擇不同的數據
選擇不同的範圍
對於不同地級市觀測和預報的氣溫進行對比畫圖,在圖中我們可以選擇觀測或者預報數據,縮小x範圍,查看局部的差異,或者選定y軸範圍,查看不同溫度範圍的數值分布,右上角的工具可以提供圖像的放大和存儲以及原始數據的查看。
#堆疊柱狀圖def bar_datazoom_slider_vertical(df) -> Bar: c = ( Bar() .add_xaxis(df.index.tolist()) .add_yaxis("3月", df['3月份降水觀測'].tolist(),category_gap="10%", gap="5%", stack="stack1") .add_yaxis("4月", df['4月份降水觀測'].tolist(), category_gap="10%", gap="5%", stack="stack1") .add_yaxis("5月", df['5月份降水觀測'].tolist(), category_gap="10%", gap="5%", stack="stack1") .set_global_opts( title_opts=opts.TitleOpts(title="地級市降水春季分析"), toolbox_opts=opts.ToolboxOpts(), yaxis_opts=opts.AxisOpts(name="降水"), xaxis_opts=opts.AxisOpts(name="城市"), datazoom_opts=[opts.DataZoomOpts(),opts.DataZoomOpts(orient="vertical"), opts.DataZoomOpts(type_="inside")] ) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) ) return cc=bar_datazoom_slider_vertical(data.iloc)c.render_notebook()選擇不同的月份
查看局部的數據
圖中是3,4,5三個月的降水累計分布圖,可以選擇不同的月份,查看局部的分布或者特定降水範圍的數據
箱式圖箱式圖可以查看兩個數據的統計屬性是否一致,包括均值,最值,中值等
from pyecharts import options as optsfrom pyecharts.charts import Boxplot
def boxpolt_base() -> Boxplot: v1 = [ [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], ] v2 = [ [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], ] c = Boxplot() c.add_xaxis(["expr1", "expr2"]).add_yaxis("A", c.prepare_data(v1)).add_yaxis( "B", c.prepare_data(v2) ).set_global_opts(title_opts=opts.TitleOpts(title="BoxPlot-基本示例")) return cc=boxpolt_base()c.render_notebook()從圖中可以清晰看到每個統計屬性
折線圖from pyecharts import options as optsfrom pyecharts.charts import Linedef line_test(df) -> Line: c = ( Line() .add_xaxis(df.index.tolist()) .add_yaxis("觀測", df['氣溫觀測'].tolist(),linestyle_opts=opts.LineStyleOpts(color="k", width=2)) .add_yaxis("預報", df['氣溫預測'].tolist(),linestyle_opts=opts.LineStyleOpts(color="red", width=2)) .set_global_opts( title_opts=opts.TitleOpts(title="地級市氣溫觀測與預報分析"), toolbox_opts=opts.ToolboxOpts(), yaxis_opts=opts.AxisOpts(name="氣溫"), xaxis_opts=opts.AxisOpts(name="城市"), datazoom_opts=[opts.DataZoomOpts(),opts.DataZoomOpts(orient="vertical"), opts.DataZoomOpts(type_="inside")] ) .set_series_opts( label_opts=opts.LabelOpts(is_show=False), markline_opts=opts.MarkLineOpts( data=[ opts.MarkLineItem(type_="min", name="最小值"), opts.MarkLineItem(type_="max", name="最大值"), opts.MarkLineItem(type_="average", name="平均值"), ] ), markpoint_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), opts.MarkPointItem(type_="average", name="平均值"), ] ) ) ) return cc=line_test(data)c.render_notebook()滑動x軸查看局部信息
滑動y軸查看不同的取值範圍
圖中是不同地級市觀測與預報數據的折線圖,可以通過滑動x軸查看局部的趨勢和數值,設定y軸,查看特定溫度範圍的數據
散點圖散點圖可以查看分布的趨勢
# 散點圖from pyecharts import options as optsfrom pyecharts.charts import Scatterdef scatter_visualmap_color(df) -> Scatter: c = ( Scatter() .add_xaxis(df.index.tolist()) .add_yaxis("觀測", df['降水觀測'].tolist()) .add_yaxis("預報", df['降水預測'].tolist()) .set_global_opts( title_opts=opts.TitleOpts(title="Scatter-VisualMap(Size)"), visualmap_opts=opts.VisualMapOpts(type_="size", max_=150, min_=20), ) ) return cc=scatter_visualmap_color(data.iloc[::20])c.render_notebook()大小可調節的散點圖
圖中是不同地級市,觀測與預報氣溫的散點圖,大小表示氣溫的高低,通過左方的調節bar,可以選擇一定範圍的氣溫,進行查看分布
熱力圖import random
from example.commons import Fakerfrom pyecharts import options as optsfrom pyecharts.charts import HeatMap
def heatmap_base() -> HeatMap: value = [[i, j, random.randint(0, 50)] for i in range(24) for j in range(7)] c = ( HeatMap() .add_xaxis(Faker.clock) .add_yaxis("series0", Faker.week, value) .set_global_opts( title_opts=opts.TitleOpts(title="HeatMap-基本示例"), visualmap_opts=opts.VisualMapOpts(), ) ) return cc=heatmap_base()c.render_notebook()熱力圖
由於我的樣例數據沒有提供相關的信息,就借用官方的示例數據進行簡單展示,可以應用於數據缺失或頻率的一個展示
官方其他示例地理區劃圖
地理線圖
3D展示
更多可以訪問https://pyecharts.org/#/zh-cn/geography_charts