专栏首页蛰虫始航手绘效果为图表添色,cutecharts带你画Q版可视图|可视化系列04

手绘效果为图表添色,cutecharts带你画Q版可视图|可视化系列04

本文内容框架

cutecharts简介

Matplotlib默认主题下绘制的可视化图形如一位高贵冷艳、不沾烟火的冰山女神,而cutecharts的图就像不拘常规、潇洒无羁的活力少年。

纤尘不染vs洒脱无畏

cutecharts[1]是基于chart.xkcd的Python可视化库,chart.xkcd[2]则是基于SVG来绘制可视化图表的JavaScript库,cutecharts充分利用了JavaScript灵活易用的特点,通过简单的语句让可视化图形有强大的表现力和优秀的交互效果,对操作系统和设备的依赖很低。

cutecharts进行可视化的基本代码框架如下:

import cutecharts.charts as ctc
df=pd.DataFrame({'x':['Mon.','Tue.','Wed.','Thu.','Fri.'],
                 'y':[76,37,90,60,50],
                 'z':[37,46,53,81,60]})
chart = ctc.Line("title",width='500px',height='400px') #新建折线图
chart.set_options(
    labels=list(df['x']),  #注意输入的是可迭代对象,但直接df['x']不行
    x_label="Weekday", 
    y_label="US" )
chart.add_series("This Week", list(df['y'])) #同样不能直接df['y']
chart.add_series("Last Week", list(df['z']))
chart.render_notebook()

cutecharts通过charts建立绘图对象,应用层的类有Line/Bar/Scatter等5个, 在语法上,通过charts.Line("title",width,height)建立折线图对象,设置标题、图表大小,然后统一通过.add_series()传入各坐标轴的数据,通过.set_options()设置各种图表参数,如坐标轴标签、轴标题和图元颜色等。set_options和add_series的语句顺序可以调换。chart.render_notebook()将图在jupyter notebook中渲染出来。

Line

绘制一个折线图的代码和绘图效果上面已经提到,add_series()对应一条线,多个add_series()就是在图中绘制多条折线。 .set_options()可以设置的参数如下:

•labels:X坐标轴的数据,输入的是可迭代对象,但直接df['x']不行,不支持Series;•x_label/y_label:分别对应X坐标轴名称和Y坐标轴名称;•y_tick_count:Y轴刻度分割段数;•colors 颜色数组,支持满足CSS样式的各种颜色输入方式;•legend_pos:图例位置,可选四个位置{"upLeft", "upRight", "downLeft", "downRight"},默认upLeft;•font_family:设置文本的字体;

图像输出

我们通过.Line()创建图并且通过.add_series().set_options()设置数据及图元之后,通过chart.render("fname.html")输出为本地的HTML文档,打开HTML就是一个可视化图像。render的参数有dest表示输出文件的路径,template_name表示渲染所用的模板。 chart.render_notebook()是在jupyter notebook中直接出图。chart.load_javascript()加载 JS 依赖,在 JupyterLab 渲染时用。

Scatter

Scatter用于绘制散点图,例子代码及绘图效果如下:

chart = ctc.Scatter('title',width='500px',height='400px')
chart.set_options(
    x_label="xlabel", 
    y_label="ylabel" ,
    colors=['#1EAFAE','#BA5C25'],
    dot_size=1)
chart.add_series("y",[(c['y'],c['z']) for i,c in df.iterrows()])
chart.add_series("dy",[(c['z'],c['y']) for i,c in df.iterrows()])
chart.render_notebook()

.set_options()支持设置的参数如下:

•x_label/y_label:分别对应X坐标轴名称和Y坐标轴名称;•x_tick_count/y_tick_count:X轴和Y轴刻度分割段数;•is_show_line:是否绘制散点连线的效果;•dot_size 目前没有点的形状?•colors 颜色数组,如果是一个颜色也要写成['#1EAFAE']形式;•time_format:日期数据类型的展示格式;•legend_pos:图例位置,可选四个位置{"upLeft", "upRight", "downLeft", "downRight"},默认upLeft;•font_family:设置文本的字体;

根据上面的参数解释,需要说明的是,绘制带端点的折线用的是Scatter并设置is_show_line=True,而不是用Line()。

散点图的add_series输入的是[(x1,y1), (x2,y2)] 这样的数据数组,使用时要符合其格式。

Bar

ctc.Bar()用于绘制柱状图。例子代码及绘图效果如下:

chart = ctc.Bar('title',width='500px',height='400px')
chart.set_options(
    labels=list(df['x']),
    x_label="Weekday", 
    y_label="US" ,
    colors=['#1EAFAE' for i in range(len(df))]
    )
chart.add_series("y",list(df['y']))
chart.add_series("z",list(df['z']))
chart.render_notebook()

.set_options()支持设置的参数如下:

Pie

ctc.Pie()用于绘制饼图。例子代码及绘图效果如下:

chart = ctc.Pie('title',width='500px',height='400px')
chart.set_options(
    labels=list(df['x']),
    inner_radius=0
    )
chart.add_series(list(df['y'])) #只接受一个参数,也就是数据列
chart.render_notebook()

和之前的图不同的是,Pie的.add_series()只接受一个参数,也就是数据列。.set_options()支持设置的参数如下:

Radar

ctc.Radar()用于绘制雷达图。例子代码及绘图效果如下:

chart = ctc.Radar('Radar',width='700px',height='600px')
chart.set_options(
    labels=list(df['x']),
    legend_pos='upRight'
    )
chart.add_series('y',list(df['y']))
chart.add_series("z",list(df['z']))
chart.render_notebook()

.set_options()支持设置的参数如下:

chart.xkcd

cutecharts基于chart.xkcd进行封装,通过看两个库的源码可以看到的是chart.xkcd枚举了Line、Bar、Radar等图来绘制具有手绘效果的图像。cutecharts几个绘图接口和chart.xkcd的对应关系如下:

cutecharts和xkcd的对应关系表

chart.xkcd还有一个StackedBar()用于绘制堆叠柱状图,目前cutecharts还没有StackedBar。从源码中能看到,chart.xkcd用到了d3-selection、d3-scale等d3.js的脚手架来做交互和DOM操纵(关于D3可视化后续公众号会更新6篇系列文章进行实践,目前有一篇概览性文章),同时为了实现手绘效果,在具体绘制柱状图等图表时,通过addFilter.js添加偏移量形成手绘线条的效果、通过xkcd字体来实现文本的手写效果。通过 addAxis.jsaddLegend.js等绘制坐标轴和文本。

总结

基于JavaScript库实现可视化,可以很好地实现交互、高亮等实用的功能,给可视化添色,Python作为一种胶水语言并且具有活跃的社区,将JavaScript可视化库变成Python可视化库也并不复杂,广泛应用的pyecharts就是基于echarts开发的,语法上cutecharts的写法和pyecharts一脉相承,理解了cutecharts的写法,对学习pyecharts也有帮助。

和pyecharts支持丰富的图表类型不同,受限于chart.xkcd本身只支持6种图(且连常用的条形图都不包含),cutecharts支持的图表也很少,只能满足常用的图表,组合图绘制也心有余而力不足,另外使用默认字体时中文文本没有漫画/手绘的效果,需要配置对应字体。

有任何建议欢迎留言交流。

References

[1] cutecharts: https://github.com/chenjiandongx/cutecharts [2] chart.xkcd: https://github.com/timqian/chart.xkcd

本文分享自微信公众号 - 蛰虫始航(lyns_sailing),作者:蛰虫始航

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 判断点是否在多边形内的Python实现及小应用(射线法)

    判断一个点是否在多边形内是处理空间数据时经常面对的需求,例如GIS软件中的点选功能、根据多边形边界筛选出位于多边形内的点、求交集、筛选不在多边形内的点等等。判断...

    蛰虫始航
  • 2019GEOJSON标准格式学习

    最近做的项目需要详细了解geojson,因此查了一些资料,现在整理一份标准格式的记录,要理解本文需要首先了解json的基本知识,这里不过多展开,可以去参考w3s...

    蛰虫始航
  • 在Windows下配置定时运行的Python脚本

    目前我们写出的Python代码,无论是jupyter notebook里还是变成.py格式的脚本,都是需要手动点按钮运行,但是在有些需要自动化定期运行脚本的情况...

    蛰虫始航
  • 47.QT-QChart之曲线图,饼状图,条形图使用

    张诺谦
  • dojo chart生成函数

    lzugis
  • 你将你的Helm chart放在哪里?

    无论你喜欢与否,你都不得不承认Helm是管理Kubernetes应用程序独一无二的工具,你甚至可以通过不同的方式使用它。

    不会飞的小鸟
  • 如何选出适合自己的管理Helm Chart的最佳方式?

    无论你喜欢与否,你都不得不承认Helm是管理Kubernetes应用程序独一无二的工具,你甚至可以通过不同的方式使用它。

    CNCF
  • react-native 使用 F2实现折线图

    最近工作入坑了react-native,有实现折线图的需求,使用了阿里的antv/f2可视化库。

    w候人兮猗
  • 深入理解ES6之—块级绑定

    使用var关键字声明的变量,无论其实际声明位置在何处,都会被视为声明于所在函数的顶部(如果声明不在任意函数内,则视为在全局作用域的顶部)。这就是所谓的变量提升。

    寻找石头鱼
  • VB6对滚轮的支持

            我需要对Mapx控件支持鼠标滚轮,找了一个可以使用的代码,来自         http://blog.csdn.net/areful/arch...

    用户1075292

扫码关注云+社区

领取腾讯云代金券