當前位置: 妍妍網 > 辦公

Python動態可互動圖表:pyecharts

2024-03-10辦公

隨著互聯網的高速發展,數據量也在瘋狂增長,近幾年數據分析,資料探勘的崗位越來越吃香。說到數據分析,就離不開數據的視覺化,畢竟圖表比冷冰冰的數位直觀,一眼就可以看出趨勢和結論,畢竟一圖勝千言。

而 Python 作為數據分析的主力語言,自然也有不少視覺化的類別庫,比如 matplotlib,常用的柱狀圖、散點圖、折線圖都可以生成。但如果想在網頁端展示的話就顯得有些捉襟見肘了。

做過 web 端數據視覺化的基本都知道 Echarts 這個庫,這是由百度開源的數據視覺化類別庫。其憑借著良好的互動性,精美的圖表設計,以及開發者容易接入等優點,在數據視覺化這塊占據著舉足輕重的位置。

而 Python 是一門富有表達力的語言,非常適合用於數據處理。當數據分析遇上數據視覺化時,pyecharts 誕生了。其不僅可以生成獨立的網頁,還可以在 flask , Django 等框架中整合使用。

今天我們就聊一聊 pyecharts 中幾種我們常用的圖表。

安裝

直接透過 pip 安裝即可。

pip install pyecharts

老規矩,為了故事的順利發展,我們先匯入本文所需的模組。

from pyecharts.charts import Barfrom pyecharts.charts import Linefrom pyecharts import options as optsfrom pyecharts.charts import EffectScatterfrom pyecharts.globals import SymbolTypefrom pyecharts.charts import Gridfrom pyecharts.charts import WordCloudfrom pyecharts.charts import Mapimport random

柱狀圖

平時使用最多的圖就是柱狀圖了,pyecharts 生成柱狀圖非常簡單。直接填入 x 軸和 y 軸的數據即可。

x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']data_china = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3]data_russia = [1.6, 5.4, 9.3, 28.4, 22.7, 60.7, 162.6, 199.2, 56.7, 43.8, 3.0, 4.9]bar = Bar()bar.add_xaxis(x)bar.add_yaxis("降雨量", data_china)bar.set_global_opts(title_opts=opts.TitleOpts(title="Bar - 基本範例"))bar.render()

在 PyCharm 中執行以上程式碼之後你會發現,控制台什麽也沒有,也不會像 matplotlib 一樣生成一張圖片,是不是我們姿勢不對,但細心的你會在 Python 檔的同級目錄下發現一個 html 檔,開啟它,咦,原來在這裏。

事實上 render 會生成本地 HTML 檔,預設會在當前目錄生成 render.html 檔,當然我們也可以傳入路徑參數,如 bar.render("mycharts.html")。不過這樣子來測試的話實在是太麻煩了,好在 pyechars 提供了貼心的 Notebook 模式,使得我們可以在 Jupyter Notebook / Jupyter Lab / Nteract / Zeppelin 四種環境中渲染。

本文均是在 Jupyter Notebook 下做的測試,只需將 bar.render() 改為 bar.rerender_notebook() 即可。改完之後再次 run 會得到下圖:

同時,pyechars 還支持鏈式呼叫。

bar = ( Bar() .add_xaxis(x) .add_yaxis('china', data_china) .set_global_opts(title_opts=opts.TitleOpts(title="Bar - 基本範例")))bar.render_notebook()

另外,pyechars 還支持在一個柱狀圖中添加多個 y 軸記錄,只需呼叫多一次 add_yaxis 即可。

bar = ( Bar() .add_xaxis(x) .add_yaxis('china', data_china) .add_yaxis("sussia", data_russia) .set_global_opts(title_opts=opts.TitleOpts(title="Bar - 多柱狀圖")))bar.render_notebook()

有時覺得柱狀圖太高不方便看,我們還可以將 x 軸和 y 軸互換,生成橫向的柱狀圖。多柱狀圖和 xy 軸互換不沖突,可疊加使用。

bar = ( Bar() .add_xaxis(x) .add_yaxis('china', data_china) .add_yaxis('russia', data_russia) .reversal_axis() .set_series_opts(label_opts=opts.LabelOpts(position="right")) .set_global_opts(title_opts=opts.TitleOpts(title="Bar - 翻轉 XY 軸")))bar.render_notebook()

餅狀圖

餅狀圖也是使用頻率極高的圖表之一,尤其是適用於占據百分比類的圖,可以很直觀的看出來各個類別所占據總體份額的比例。

pie = ( Pie() .add("", [list(z) for z in zip(x, data_china)]) .set_global_opts(title_opts=opts.TitleOpts(title="Pie - 基本範例")) .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")))pie.render_notebook()

圓環狀的餅狀圖。

pie = ( Pie(init_opts=opts.InitOpts(width="600px", height="400px")) .add( series_name="降雨量", data_pair=[list(z) for z in zip(x, data_china)], radius=["50%", "70%"], label_opts=opts.LabelOpts(is_show=False, position="center"), ) .set_global_opts(legend_opts=opts.LegendOpts(pos_left="legft", orient="vertical")) .set_series_opts( tooltip_opts=opts.TooltipOpts( trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)" ), label_opts=opts.LabelOpts(formatter="{b}: {c}") ))pie.render_notebook()

折線圖

折線圖通常用於展示數據在不同時間段的走勢,例如股市的 K 線圖就是折線圖的一種。

line = ( Line() .add_xaxis(x) .add_yaxis('china', data_china) .set_global_opts(title_opts=opts.TitleOpts(title="Line - 基本範例")))line.render_notebook()

同樣,和柱狀圖類似,折線圖也可以在一個圖中添加多個 y 軸記錄。

line = ( Line() .add_xaxis(x) .add_yaxis('china', data_china) .add_yaxis('russis', data_russia) .set_global_opts(title_opts=opts.TitleOpts(title="Line - 雙折線圖")))line.render_notebook()

同樣支持階梯折線圖。

line = ( Line() .add_xaxis(x) .add_yaxis('china', data_china, is_step=True) .set_global_opts(title_opts=opts.TitleOpts(title="Line - 階梯折線圖")))line.render_notebook()

散點圖

scatter = ( EffectScatter() .add_xaxis(x) .add_yaxis("", data_china) .set_global_opts(title_opts=opts.TitleOpts(title="EffectScatter - 基本範例")))scatter.render_notebook()

數據對比不是很清晰,我們可以給散點圖加上網格,使各個點對應的 y 軸數據更清晰可見。

scatter = ( EffectScatter() .add_xaxis(x) .add_yaxis("china", data_china, 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)), ))scatter.render_notebook()

同時,我們可以指定點的形狀,還可以在一個散點圖上加多個 y 軸記錄。這些配置就像積木一樣,隨意堆疊。

scatter = ( EffectScatter() .add_xaxis(x) .add_yaxis("china", [x + 30 for x in data_russia],symbol=SymbolType.ARROW) .add_yaxis("russia", data_russia, symbol=SymbolType.TRIANGLE) .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)), ))scatter.render_notebook()

圖表合並

有時候,我們需要將多種圖放在一張圖上來集中顯示,pyechars 也考慮到了。基本步驟就是先單獨生成各自類別的圖,然後用 Grid 將二者合並起來即可。

比如我們想將柱狀圖和折線圖放在一起,那就先分別生成 Bar 和 Line,然後將二者合並即可。

from pyecharts.charts import Gridbar = ( Bar() .add_xaxis(x) .add_yaxis('china', data_china) .add_yaxis("sussia", data_russia) .set_global_opts( title_opts=opts.TitleOpts(title="Grid - 多圖合並"), ))line = ( Line() .add_xaxis(x_data) .add_yaxis("蒸發量", [x + 50 for x in data_china] ))bar.overlap(line)grid = Grid()grid.add(bar, opts.GridOpts(pos_left="5%", pos_right="5%"), is_control_axis_index=True)grid.render_notebook()

詞雲

同樣,功能強大的 pyechars 對詞雲也是支持的,更貼心的是中文也完全沒問題,不會出現亂碼。

import pyecharts.options as optsfrom pyecharts.charts import WordClouddata = [("生活資源", "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"),("一次供水問題", "11"),]wordCloud = ( WordCloud() .add(series_name="熱點分析", data_pair=data, word_size_range=[6, 66]) .set_global_opts( title_opts=opts.TitleOpts( title="熱點分析", title_text style_opts=opts.Text styleOpts(font_size=23) ), tooltip_opts=opts.TooltipOpts(is_show=True), ))wordCloud.render_notebook()

地圖

最後,來看看 pyecharts 對地圖圖表的支持。

有時我們會很希望將數據展示在地圖上,比如全國各省份人口數據,微信好友各省份分布等。

provinces = ['廣東', '北京', '上海', '湖南', '重慶', '新疆', '河南', '黑龍江', '浙江', '台灣'] values = [random.randint(1, 1024) for x in range(len(provinces))]map = ( Map() .add("", [list(z) for z in zip(provinces, values)], "china") .set_global_opts( title_opts=opts.TitleOpts(title="map - 基本範例"), visualmap_opts=opts.VisualMapOpts(max_=1024, is_piecewise=True), ))map.render_notebook()

總結

今天我們分析了 pyecharts 常用的幾種圖表,俗話說一圖勝千言,數據分析離不開數據的視覺化,尤其是向領導做匯報工作時,圖表更能清晰明了的表達成果。

生成圖表的基本步驟大致可分為三個步驟,準備相關數據、利用鏈式呼叫法設定數據和相關配置、呼叫 render_notebook() 或者 render() 函式生成圖表。

另外,pyecharts 還支持好多好玩有趣的 3D 圖表,大家可自行查閱官方文件

作者:豆豆

來源 :Python 技術「ID: pythonall」

Crossin的新書【 碼上行動:用ChatGPT學會Python編程 】已經上市了。 本書以ChatGPT為輔助,系統全面地講解了如何掌握Python編程,適合Python零基礎入門的讀者學習。

購買後可加入讀者交流群,Crossin為你開啟陪讀模式,解答你在閱讀本書時的一切疑問。

Crossin的其他書籍:

添加微信 crossin123 ,加入編程教室共同學習 ~

感謝 轉發 點贊 的各位~