敲可愛畫風Python可視化庫cutecharts全攻略,你值得擁有

  • 2019 年 12 月 6 日
  • 筆記

導讀:本文帶你玩轉手繪風可視化庫cutecharts,我把她叫做pyecharts的妹妹。

作者:NFii、老表

來源:簡說Python(ID:xksnh888)

昨天,手機突然叮咚一響,微信群跳出一條消息,「@老表 新圖表庫 敲可愛的畫風」,還有倉庫鏈接:

我打開看了下,原來是陳健冬大佬有搞了個新的可視化庫,這,我必須嘗鮮啊。

cutecharts 項目地址:

https://github.com/chenjiandongx/cutecharts/

記得給個Star~

本文概要:

01 可視化庫cutecharts基本使用介紹

02 爬取中國電競價值排行榜-外設排行榜,利用cutecharts數據可視化分析 03 總結 抒情

01 可視化庫cutecharts基本使用介紹

1. cutecharts 安裝

最簡單的肯定是pip安裝:

$ pip3 install cutecharts

當然,也可以進行源碼安裝:

$ git clone https://github.com/chenjiandongx/cutecharts.git  $ cd cutecharts  $ pip3 install -r requirements.txt  $ python3 setup.py install  

其中需要安裝的第三方輔助庫jinja2,是基於Python的模板引擎,主要用於渲染可視化後的內容,最終形成可運行的html文件,當然,如果你不感興趣,你不用過多了解,在安裝cutecharts時會自動幫你安裝上,但你得知道它是unicode編碼,稍不注意,可能模板生成錯誤。

2. 基本使用

目前cutecharts支援的可視化影像類型有:柱狀圖、折線圖、餅狀圖、雷達圖、散點圖。

我想後續作者還會增加的,比如:詞雲圖、3D柱狀圖、條形圖等等。

另外,項目里已經給我們提供了測試用例,所以我們學習的時候就不用再去自己寫測試用例了,直接調用即可。

  • 柱狀圖
# 導入cutecharts中的Bar  from cutecharts.charts import Bar  # 導入測試用例  from cutecharts.faker import Faker      def bar_base() -> Bar:      chart = Bar("Bar-基本示例")      chart.set_options(labels=Faker.choose(), x_label="I'm xlabel", y_label="I'm ylabel")      chart.add_series("series-A", Faker.values())      return chart      bar_base().render_notebook()

渲染引擎提供了兩個:

  • .render(html_name) :生成一個本地文件,html_name為文件名(html文件),默認名為:render.html
  • .render_notebook() :可以在jupyter中直接運行顯示,如上文程式碼 本文案例程式碼都是在Jupyter Notebook上編寫運行

顯示情況:

當然,裡面的顏色、文字內容我們都是可以更改的。

相關函數參數,作者在Github里寫的特別清楚,很方便閱讀使用

▲內容來自:github cutecharts

  • 折線圖
from cutecharts.charts import Line  from cutecharts.faker import Faker    def line_base() -> Line:      chart = Line("Line-基本示例")      chart.set_options(labels=Faker.choose(), x_label="I'm xlabel", y_label="I'm ylabel", legend_pos="upRight")      chart.add_series("series-A", Faker.values())      chart.add_series("series-B", Faker.values())      return chart      line_base().render_notebook()

顯示情況:

當然,裡面的顏色、文字內容我們都是可以更改的。

相關函數參數,作者在Github里寫的特別清楚,很方便閱讀使用。

▲內容來自:github cutecharts

  • 餅圖
from cutecharts.charts import Pie  from cutecharts.faker import Faker      def pie_base() -> Pie:      chart = Pie("Pie-基本示例")      chart.set_options(labels=Faker.choose())      chart.add_series(Faker.values())      return chart      pie_base().render_notebook()

顯示情況:

當然,裡面的顏色、文字內容我們都是可以更改的。

相關函數參數,作者在Github里寫的特別清楚,很方便閱讀使用。

▲內容來自:github cutecharts

  • 雷達圖
from cutecharts.charts import Radar  from cutecharts.faker import Faker      def radar_base() -> Radar:      chart = Radar("Radar-基本示例")      chart.set_options(labels=Faker.choose())      chart.add_series("series-A", Faker.values())      chart.add_series("series-B", Faker.values())      return chart      radar_base().render_notebook()

顯示情況:

當然,裡面的顏色、文字內容我們都是可以更改的。

相關函數參數,作者在Github里寫的特別清楚,很方便閱讀使用。

▲內容來自:github cutecharts

  • 散點圖
from cutecharts.charts import Scatter  from cutecharts.faker import Faker      def scatter_base() -> Scatter:      chart = Scatter("Scatter-基本示例")      chart.set_options(x_label="I'm xlabel", y_label="I'm ylabel")      chart.add_series(          "series-A", [(z[0], z[1]) for z in zip(Faker.values(), Faker.values())]      )      chart.add_series(          "series-B", [(z[0], z[1]) for z in zip(Faker.values(), Faker.values())]      )      return chart      scatter_base().render_notebook()

顯示情況:

當然,裡面的顏色、文字內容我們都是可以更改的。

相關函數參數,作者在Github里寫的特別清楚,很方便閱讀使用。

▲內容來自:github cutecharts

這裡由於篇幅關係,本文只對cutecharts基本影像展現做了介紹,對於以上五個類型的可視化影像的具體參數沒有做展開介紹,感興趣的可以去github查看更詳細內容:

https://github.com/chenjiandongx/cutecharts

02 爬取中國電競價值排行榜-外設排行榜,利用cutecharts數據可視化分析

註:本文所有程式碼都是在Jupyter Notebook下運行,理論上移到本地開發工具也是可以運行的,如有問題,請留言評論。

1. 爬取數據

"""  爬取中國電競價值排行榜-外設排行榜  網站:http://djws.uuu9.com/rank/201907/  數據類:鍵盤 滑鼠 耳機 顯示器 電競椅 筆記型電腦 顯示卡 路由器  數據項:排名 型號廠家 天貓指數 京東指數 百度指數 性價指數 科技指數 綜合指數  """  

具體實現程式碼:

# 爬取數據  import pandas as pd  url = "http://djws.uuu9.com/rank/201907/"  url_read = pd.read_html(url, header=0)[0]  url_read

比較簡單,因為該網站數據存儲在表格(table)里,我之前介紹過pandas的read_html函數,可以快速的讀取網頁中table里的數據。

觀察上面獲取到的數據,我們發現,奇數行的數據有問題,我看了下網頁源碼,確實頁面的table寫的有點問題,表頭在重複出現,這個數據處理很簡單,我們取出偶數行的正確數據即可。

url_read=url_read[url_read.index%2==0]

我們會發現,數據里的綜合指數數值為NaN,這是因為這一欄數據在網站中是以影像條顯示的,存儲在i標籤的width里,這裡我們就不獲取了,要獲取也是有辦法的,比如:正則表達式,如果你感興趣,可以去試試。

電競與外設-鍵盤前12名在3-7月的所有的數據。

# 爬取數據  import pandas as pd    def get_data(i):      url = "http://djws.uuu9.com/rank/20190%d/"%i      url_read = pd.read_html(url, header=0)[0]      url_read=url_read[url_read.index%2==0]      return url_read    df_data = []  # 循環抓取3-7月數據  for i in range(3,8):      df_data.append(get_data(i))  # axis: 1 表示列拼接,0 表示行拼接  df = pd.concat(df_data, axis=0)  

為了後續工作方便,我們最好是跑一次,然後把數據存到本地,方便讀取處理。

df.to_csv(r'rich_list.csv', mode='a', encoding='utf_8_sig', header=0, index=False)

2. 數據可視化分析

獲取了電競與外設-鍵盤前12名在3-7月的所有的數據,共60條數據,方便數據讀取顯示,以下程式碼是在Pycharm上編寫,理論上移植到其他開發工具或平台也可運行,如有問題歡迎留言交流。

  • Core issues:鍵盤品牌分析
讀取數據
import os  import pandas as pd    # 數據統計函數  def get_list_num(l):      name = list(set(l))  # 名字      value = []   # 次數      for item in name:          value.append(l.count(item))      return name, value      # 獲取當前文件父目錄路徑  father_path = os.getcwd()  # # 原始數據文件路徑  rpath_csv = father_path+r'/rich_list.csv'  # 讀取數據  csv_read = pd.read_csv(rpath_csv)
  • 品牌分析
讀取數據
manufacturer = list(csv_read["廠家"])  statistical = get_list_num(manufacturer)
可視化
# 導入cutecharts中的Bar  from cutecharts.charts import Bar      def bar_base() -> Bar:      chart = Bar("3-7月鍵盤品牌")      chart.set_options(labels=statistical[0], x_label="品牌名", y_label="出現次數")      chart.add_series("品牌頻數比較", statistical[1])      return chart      bar_base().render()

從這裡看,我們可以發現達爾優、雷蛇、CHERRY、賽睿、海盜船都在排行榜上出現了10次,華碩ROG、雷柏略差一些,只出現了五次。 我們再來結合各個品牌對應的產品排名來分析一下: 數據處理

# 獲取每個品牌對應的排名總和  rank_list = []  for i in statistical[0]:      table = csv_read.loc[csv_read["廠家"] == i]      rank_list.append(sum(table["排名"])/5)  # 排名計算總和都除五
可視化分析
from cutecharts.charts import Line      def line_base() -> Line:      chart = Line("3-7月鍵盤品牌")      chart.set_options(labels=statistical[0], x_label="品牌名", y_label="總數")      chart.add_series("品牌頻數", statistical[1])      chart.add_series("品牌排名", rank_list)      return chart  line_base().render()

首先我們要知道,第一次統計的品牌名出現次數,表示品牌旗下產品上榜的數量,可能是有多種產品上榜,也可能是部分產品多次上榜,第二次統計的產品排名數和(為了方便展示,我把數除五了),表示該品牌所有上榜產品的排名和,如果做對比的話,應該是在第一個條件(品牌出現次數)相同情況下做對比。 從圖中我們很容易看出,品牌CHERRY這個品牌出現次數多,而且排名靠前(因為排名數和低),其次是海盜船,第三可以算賽睿,雷蛇,達爾優,我們還可以看出雷柏和華碩ROG好像差不多。 接下來我們再看看品牌熱度,我們直接看綜合指數,當然,如果你在做數據分析工作中,肯定不會這麼選擇,你應該選擇和你目的最貼切的數據項進行分析,甚至進行一些進階演算法,給每個指數項一定權重然後分析。

index_list = []  # 選取三個比較熱門的產品  model = ["MX8.0", "K70", "雷柏V500"]  for i in model:      print(i)      table = csv_read.loc[csv_read["型號"] == i]      print(table)  # 顯示查詢數據  

從網頁上我們可以輕易看到,七月綜合指數最高是的CHERRY旗下的MX8.0,如果你感興趣,可以像我什麼一樣,自己選3-5個熱門產品,作出他們3-7月之間的綜合指數或其他數據的變化圖(一段時間內的變化,折線圖會是一種比較好的顯示方式)。 對於以上數據,你還有什麼其他比較好的分析思路嗎?歡迎你留言說說你的看法,由於時間和篇幅關係,我就不過多敘述了。 記住,本文主旨是給大家介紹cutecharts這個新的py可視化庫。 cutecharts 項目地址: https://github.com/chenjiandongx/cutecharts/ 如果喜歡,請給個Star。

03 總結 抒情

哇,終於寫完了,雖然本文技術含量不是那麼高,但還是有很多地方是大家可以學習的,比如:認識個牛人。

最後,我代替大家,其實也就是我自己想問的,問了陳鍵冬大佬三個問題,這裡分享給大家:

Q1. 目前 cutecharts 只支援部分圖形,後續還會開發出其他圖形支援嗎?比如詞雲圖?

A:cutecharts 是基於 chart.xkcd 開發的,目前 100% 支援其所有圖形和配置項,如果 chart.xkcd 圖表類型更新的話,cutecharts 也會同步更新的。

Q2. 你覺得 cutecharts 和 pyecharts 的關係是什麼?

A:cutecharts 和 pyecharts 屬於同一類項目,都是使用 Python、Notebook+JS 實現數據的可視化,不過 pyecharts 目前有著更豐富的圖形種類以及更多的配置項。cutecharts 可以看做是精簡版的 pyecharts,保留著 pyecharts 的所有核心功能,是學習 pyecharts 源碼的很好的入手點。

Q3. 你有沒有什麼想說的,對 cutecharts 和 pyecharts 的使用者?

A:開發一個類似的庫並不難,無非是找到優秀的 JS 庫,設計好 Python 介面,並將兩者融合在一起。所以也希望有更多 Python 開發者能夠參與到這方面的開發中來,為社區貢獻出更多優秀的作品。希望,我們都越來越優秀。