今天给大家推荐一个可视化库:cutecharts,我把她叫做pyecharts的妹妹

一、前言

昨天,手机突然叮咚一响,微信群跳出一条消息,“@老表 新图表库 敲可爱的画风”,还有仓库链接,
<center>
<img src="https://img-blog.csdnimg.cn/20191013101840120.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2,size_16,color_FFFFFF,t_70" width="60%" alt=""/></center>
我打开看了下,原来是陈健冬大佬有搞了个新的可视化库,这,我必须尝鲜啊。
<center>
<img src="https://img-blog.csdnimg.cn/20191013103114383.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2,size_16,color_FFFFFF,t_70" width="80%" alt=""/></center>

cutecharts 项目地址:https://github.com/chenjiandongx/cutecharts/

记得给个Star~

二、本文概要

Part one : 可视化库cutecharts基本使用介绍
Part two : 爬取中国电竞价值排行榜-外设排行榜,利用cutecharts数据可视化分析
Part three : 总结 抒情

Part one : 可视化库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编码,稍不注意,可能模板生成错误,比如我之前遇到过的问题:jinja2页面渲染出错-解决

2.基本使用

目前cutecharts支持的可视化图像类型有:柱状图、折线图、饼状图、雷达图、散点图。
我想后续作者还会增加的,比如:词云图、3D柱状图、条形图等等。
另外,项目里已经给我们提供了测试用例,所以我们学习的时候就不用再去自己写测试用例了,直接调用即可。
<center>
<img src="https://img-blog.csdnimg.cn/20191013150803677.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2,size_16,color_FFFFFF,t_70" width="80%" alt=""/></center>

First : 柱状图

# 导入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上编写运行

显示情况:
<center>
<img src="https://img-blog.csdnimg.cn/20191013151823347.gif" width="80%" alt=""/></center>
当然,里面的颜色、文字内容我们都是可以更改的。
相关函数参数,作者在Github里写的特别清楚,很方便阅读使用
<center>
<img src="https://img-blog.csdnimg.cn/20191013152643631.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2,size_16,color_FFFFFF,t_70" width="80%" alt=""/>


内容来自:github cutecharts
</center>

Second : 折线图

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()

显示情况:
<center>
<img src="https://img-blog.csdnimg.cn/20191013154902394.gif" width="80%" alt=""/></center>
当然,里面的颜色、文字内容我们都是可以更改的。
相关函数参数,作者在Github里写的特别清楚,很方便阅读使用
<center>
<img src="https://img-blog.csdnimg.cn/2019101315513591.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2,size_16,color_FFFFFF,t_70" width="80%" alt=""/>


内容来自:github cutecharts
</center>

Third : 饼图

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()

显示情况:
<center>
<img src="https://img-blog.csdnimg.cn/2019101315571757.gif" width="80%" alt=""/></center>
当然,里面的颜色、文字内容我们都是可以更改的。
相关函数参数,作者在Github里写的特别清楚,很方便阅读使用
<center>
<img src="https://img-blog.csdnimg.cn/20191013155803265.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2,size_16,color_FFFFFF,t_70" width="80%" alt=""/>


内容来自:github cutecharts
</center>

Fourth : 雷达图

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()

显示情况:
<center>
<img src="https://img-blog.csdnimg.cn/20191013161054993.gif" width="80%" alt=""/></center>
当然,里面的颜色、文字内容我们都是可以更改的。
相关函数参数,作者在Github里写的特别清楚,很方便阅读使用
<center>
<img src="https://img-blog.csdnimg.cn/20191013161150831.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2,size_16,color_FFFFFF,t_70" width="80%" alt=""/>


内容来自:github cutecharts
</center>

Fifth : 散点图

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()

显示情况:
<center>
<img src="https://img-blog.csdnimg.cn/2019101315571757.gif" width="80%" alt=""/></center>
当然,里面的颜色、文字内容我们都是可以更改的。
相关函数参数,作者在Github里写的特别清楚,很方便阅读使用
<center>
<img src="https://img-blog.csdnimg.cn/20191013161246101.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2,size_16,color_FFFFFF,t_70" width="80%" alt=""/>


内容来自:github cutecharts
</center>

这里由于篇幅关系,本文只对cutecharts基本图像展现做了介绍,对于以上五个类型的可视化图像的具体参数没有做展开介绍,感兴趣的可以去github查看更详细内容:

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

Part two : 爬取中国电竞价值排行榜-外设排行榜,利用cutecharts数据可视化分析

【注】本文所有代码都是在Jupyter Notebook下运行,理论上移到本地开发工具也是可以运行的,如有问题,请留言评论。

1.爬取数据

<center>
<img src="https://img-blog.csdnimg.cn/20191013162830697.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2,size_16,color_FFFFFF,t_70" width="80%" alt=""/></center>

"""
爬取中国电竞价值排行榜-外设排行榜
网站: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里的数据,具体见文章:数据分析从零开始实战 | 基础篇(四)

<center>
<img src="https://img-blog.csdnimg.cn/20191013172202652.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2,size_16,color_FFFFFF,t_70" width="80%" alt=""/></center>
观察上面获取到的数据,我们发现,奇数行的数据有问题,我看了下网页源码,确实页面的table写的有点问题,表头在重复出现,这个数据处理很简单,我们取出偶数行的正确数据即可。

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

<center>
<img src="https://img-blog.csdnimg.cn/20191013173231558.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2,size_16,color_FFFFFF,t_70" width="80%" alt=""/></center>

我们会发现,数据里的综合指数数值为NaN,这是因为这一栏数据在网站中是以图像条显示的,存储在i标签的width里,这里我们就不获取了,要获取也是有办法的,比如:正则表达式,如果你感兴趣,可以去试试。
<center>
<img src="https://img-blog.csdnimg.cn/20191013173956242.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2,size_16,color_FFFFFF,t_70" width="80%" alt=""/></center>

电竞与外设-键盘前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)
Question one: 对品牌分析

读取数据

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()

<center>
<img src="https://img-blog.csdnimg.cn/2019101318500912.gif" width="80%" alt=""/></center>
从这里看,我们可以发现达尔优、雷蛇、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()

<center>
<img src="https://img-blog.csdnimg.cn/20191013193134966.gif" width="80%" alt=""/></center>
首先我们要知道,第一次统计的品牌名出现次数,表示品牌旗下产品上榜的数量,可能是有多种产品上榜,也可能是部分产品多次上榜,第二次统计的产品排名数和(为了方便展示,我把数除五了),表示该品牌所有上榜产品的排名和,如果做对比的话,应该是在第一个条件(品牌出现次数)相同情况下做对比。
从图中我们很容易看出,品牌CHERRY这个品牌出现次数多,而且排名靠前(因为排名数和低),其次是海盗船,第三可以算赛睿,雷蛇,达尔优,我们还可以看出雷柏和华硕ROG好像差不多。
<center>
<img src="https://img-blog.csdnimg.cn/20191013194857121.gif" width="80%" alt=""/></center>
接下来我们再看看品牌热度,我们直接看综合指数,当然,如果你在做数据分析工作中,肯定不会这么选择,你应该选择和你目的最贴切的数据项进行分析,甚至进行一些进阶算法,给每个指数项一定权重然后分析。

index_list = []
# 选取三个比较热门的产品
model = ["MX8.0", "K70", "雷柏V500"]
for i in model:
    print(i)
    table = csv_read.loc[csv_read["型号"] == i]
    print(table)  # 显示查询数据

<center>
<img src="https://img-blog.csdnimg.cn/2019101320085599.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2,size_16,color_FFFFFF,t_70" width="80%" alt=""/></center>
<center>
<img src="https://img-blog.csdnimg.cn/20191013195655902.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2,size_16,color_FFFFFF,t_70" width="80%" alt=""/></center>

从网页上我们可以轻易看到,七月综合指数最高是的是CHERRY旗下的MX8.0,如果你感兴趣,可以像我什么一样,自己选3-5个热门产品,作出他们3-7月之间的综合指数或其他数据的变化图(一段时间内的变化,折线图会是一种比较好的显示方式)。
对于以上数据,你还有什么其他比较好的分析思路吗?欢迎你留言说说你的看法,由于时间和篇幅关系,我就不过多叙述了。

记住,本文主旨是给大家介绍cutecharts这个新的py可视化库。

cutecharts 项目地址:https://github.com/chenjiandongx/cutecharts/
如果喜欢,请给个Star。

Part three : 总结 抒情

哇,终于写完了,虽然本文技术含量不是那么高,但还是有很多地方是大家可以学习的,比如:认识个牛逼的人。
最后,我代替大家,其实也就是我自己想问的,问了陈键冬大佬三个问题,这里分享给大家:

Q:1. 目前 cutecharts 只支持部分图形,后续还会开发出其他图形支持吗?比如词云图?

A:cutecharts 是基于 chart.xkcd 开发的,目前 100% 支持其所有图形和配置项,如果 chart.xkcd 图表类型更新的话,cutecharts 也会同步更新的。

Q:2. 你觉得 cutecharts 和 pyecharts 的关系是什么?

A:cutecharts 和 pyecharts 属于同一类项目,都是使用 Python、Notebook+JS 实现数据的可视化,不过 pyecharts 目前有着更丰富的图形种类以及更多的配置项。

cutecharts 可以看做是精简版的 pyecharts,保留着 pyecharts 的所有核心功能,是学习 pyecharts 源码的很好的入手点。

Q:3. 你有没有什么想说的,对 cutecharts 和 pyecharts 的使用者?

A:开发一个类似的库并不难,无非是找到优秀的 JS 库,设计好 Python 接口,并将两者融合在一起。所以也希望有更多 Python 开发者能够参与到这方面的开发中来,为社区贡献出更多优秀的作品。

希望,我们都越来越优秀。
和简说Python 一起学Python

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,188评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,464评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,562评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,893评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,917评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,708评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,430评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,342评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,801评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,976评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,115评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,804评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,458评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,008评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,135评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,365评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,055评论 2 355

推荐阅读更多精彩内容

  • 1、Pyecharts简介 Echarts是一个由百度开源的数据可视化工具,凭借着良好的交互性,精巧的图表设计,得...
    扫盲狗阅读 9,105评论 6 21
  • 无意中从今日头条中看到的一篇文章,可以生成简单的图表。据说一些大数据开发们也是经常用类似的图表库,毕竟有现成的,改...
    田旭1阅读 11,758评论 2 72
  • 非科班出身,也能驾驭新媒体运营的岗位 不多说,事实摆在眼前,新媒体职位在向你友好地招手。 看了万达集团的新媒体职位...
    繁事生活记载阅读 436评论 0 1
  • 今年的春天格外的漫长,几场大雨间小雨过后,温度依然让人舒适,享受着度过寒冬的安全感,再也不用身子瑟瑟发抖,当然,也...
    萌小欧阅读 230评论 0 1
  • ​人之初,性本善。 人,在最初的时候都是善良的,只不过是随着社会环境,人心就慢慢变得复杂,将内心的贪欲无限扩大。 ...
    A花糖糖阅读 1,036评论 0 1