敲可愛畫風Python可視化庫cutecharts全攻略,你值得擁有
- 2019 年 12 月 6 日
- 筆記
作者: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 開發者能夠參與到這方面的開發中來,為社區貢獻出更多優秀的作品。希望,我們都越來越優秀。