python

plotly 4.0自来水公司通告(可视化python模块推荐)

2019-07-21  本文已影响84人  栽生物坑里的信息汪

序言

虽然上次写了一个plotly绘图说明的一篇文章,向大家介绍了一下plotly这个很好用的python的画交互式图/网页的库,但时代毕竟在变化,最近在我再次上plotly的官网准备查看官方文档的时候,竟然惊喜的发现,plotly竟然在不知不觉中升级到了4.0的版本,要知道,版本号的更迭都有其意义,像这种最大位数上的数字的变化,绝对是很大的一次调整。

所以作为一个plotly的attributor之一,我今天就来吹一波plotly的更新!!

正文

首先一上来的最大的改变自然是在python部分的plotly的首页

相比于之前的首页对不起这里找不到之前的首页,最显眼的自然就是Version 4 migration Guide。其实其实还有一个不是很显眼,但是其实后来发现十分十分重要的一个模块的增加,也就是plotly Express,这个模块后面会重点讲到划重点了划重点了

我们可以点进去Version 4 migration Guide里面,我们就可以知道一些比较重大的变化/迁移(mirgration)

所以在这里也可以毫不犹豫的说一声

plotly 4.0 重点就是在于改变了一些原来3.X版本下的冗余,算是大刀阔斧的砍掉了一些模块了

迁移

online版的plotly迁移到了chart-studio

不知道有没有读者在用plotly的online版的,反正我其实是没有用的,一方面是经常要处理的数据很大(我们单位网速又很抓马),另外一方面有时不付费的话只能使用非常有限的储存空间。而且再再加上我更喜欢写代码而不是交互式点击的方式去画图,所以online版跟我始终无缘。

但正如我上一篇里面提到的,plotly是一个跨平台的可以兼容多种语言的工具库,所以online版也无可厚非,一个愿打一个愿挨嘛,商品经济。
但是!!!我每次使用import plotly的时候真的很烦。。。为什么呢?

就是plotly的default选项是使用online版,所以如果你要使用offline的输出一些图片或者网页的话,要再加一层,也就是plotly.offline.plot。当然这也仅仅是加多几个字的原因,所以我也一直这么使用,但是plotly公司会考虑到这一点,然后把plotly这个名号全部让给了离线版,然后把online版的代码迁移到了chart-studio中去,真的就很大方以及很慷慨。这里再尬吹一波plotly的抉择,这样子想必会有更多的开源代码工作者愿意使用plotly作为自己的画图工具,从而达到提高知名度的效果!

offline版的迁移

网页中时这么说的Offline features (plotly.offline) replaced by Renderers framework & HTML export
其实有点令人看不懂,但大概的意思应该是抛弃了这个模块(虽然近几个版本以内应该还在),然后把输出图片或者网页的方法直接用figure这个实例的方法来代替,也就是figure.to_htmlfigure.write_html

这个也大大提高了使用时候的便捷,不用再麻烦的从plotly.ioimport一个write_images来输出图片了。

不过值得吐槽的是,通过orca的服务端来做网页到pdf的渲染,还是有些不稳定。但重新打开一下orca的服务器端就好了,所以也不算个大问题,所以一直也没有被解决。 orca的介绍在这里

plotly.tools.make_subplots迁移到plotly.subplots.make_subplots

新增了很多plotly的配色主题

新模块plotly-Express

终于到了介绍这个全新的模块的时候了!!这个也是我这次更新里很喜欢的一个语法糖 语法糖:特指没有什么实质作用,但会大幅度提高书写的或者使用的便捷度的语法

首先开头介绍一些这是个什么,简单的说,

plotly-Express就是通过简单的一个function替使用者便捷的画图的模块

同样功能的模块在别的绘图库中也非常的多,例如R中著名的ggplot,或者说python中matplotlib的著名高级库seaborn(要是很多人没听过,质疑这几个著名,本作者概不负责)

以下可以介绍几个例子(例子都是出自于plotly-Express的例子,这里我只是个搬运工和解读的角色)

自动化散点图的颜色

import plotly.express as px
iris = px.data.iris()
fig = px.scatter(iris, x="sepal_width", y="sepal_length", color="species")
fig.show()

这里导入了一个著名的数据集(鸢尾花),然后通过plotly.express,也就是我这次要讲到的plotly-express进行绘图。通过给定一个dataframe,然后通过指定列名就可以让该function自动帮助你进行绘图。

其中通过给color指定列名,就可以让plotly自动的根据该列的值,进行离散化的赋予颜色和组别。如果是原来的写法,就得按照下面这么写。

import plotly.graph_objects as go
fig = go.Figure()
for group in set(iris.loc[:,"species"]):
    sub_df = iris.loc[iris.loc[:,"species"==group],:]
    fig.add_scatter(x=sub_df.loc[:,"sepal_width"], y=sub_df.loc[:,"sepal_length"], name = group)
plotly.offline.iplot(fig)

并且,如果要指定颜色,还得自己辛苦的在循环中手动的去赋值,就很麻烦。但是现在的方法就简单了不少。

当然也带来了一些麻烦(毕竟麻烦和便利总是形影相随的),例如如果你的species的列是连续值,但它其实是离散的类别变量,那么首先你得手动的把该列转换为字符串。而不是整数/浮点数。

自动化散点图的左右常用子图

上面的例子其实也没有简化太多,但是这个例子就简单了很多。而且似乎也很经常需要画类似的图。

import plotly.express as px
iris = px.data.iris()
fig = px.scatter(iris, x="sepal_width", y="sepal_length", color="species", marginal_y="violin",
           marginal_x="box", trendline="ols")
fig.show()

同样地,这里用的是鸢尾花的数据集。除了再次自动赋予color以外,例子中还有两个特别的参数marginal_xmarginal_y。而且传递给它们的值也很奇怪,任何一个都不属于鸢尾花数据集中的列名,让我们先看看效果吧。

效果如上,就是一个经常使用的一个散点图外加两个子图,并且这两个子图的布局要与左下角的散点图保持很多的一致,例如共享x轴(上),共享y轴(右),而且还得在右上角保留一个小小的空白区域。
所以如果要画一个上面效果的图,要写的代码量还是挺多的。

但使用plotly.express就很好的增添了这么一个语法糖的模块,从而让画这样的图大大轻松。

ps:就算这个图在绘制的过程中出了点bug,但是这个构建好的图的layout也可以利用起来,可以把数据都删掉,然后通过指定layout的方式重新再一个布局好的图上进行绘图。

自动化的pairwise散点图

同上的,直接看代码吧

import plotly.express as px
iris = px.data.iris()
fig = px.scatter_matrix(iris, dimensions=["sepal_width", "sepal_length", "petal_width", "petal_length"], color="species")
fig.show()

这种pairwise的散点图之前在plotly上画起来也非常的困难,但其实在别的绘图模块里就比较常见。
例如seabornScatterplot Matrix
或者说基于ggplotggpairs

自动化的Sankey 图

接下来一个也是比较喜欢的一个图,因为曾经为了画这么一个图就辛苦的看文档然后纠结了很久。

import plotly.express as px
tips = px.data.tips()
fig = px.parallel_categories(tips, color="size", color_continuous_scale=px.colors.sequential.Inferno)
fig.show()
sankey plot demo

但通过这么简单的一个px.parallel_categories就可以简单的在一堆通过多个分类变量描述的样本中,用一个sankey plot去把分类变量之间的关系描述清楚。

添加动画控制(animation)

import plotly.express as px
gapminder = px.data.gapminder()
fig = px.scatter(gapminder, x="gdpPercap", y="lifeExp", animation_frame="year", animation_group="country",
           size="pop", color="continent", hover_name="country", facet_col="continent",
           log_x=True, size_max=45, range_x=[100,100000], range_y=[25,90])
fig.show()

交互式的网页的其中一个好处就是可以使用动画animation,但是plotly中的动画控制对于初学者来说就常常十分难以理解,我自己如非必要也不会去写这么一个动画控制,因为就非常的难写。虽然写好了以后也很难展示 因为很难给别人一个网页的结果,但从交流/展示上来说,就会非常的有意思。

以上代码中通过animation_frame来初始化了一个slider从而达到了一个,拖动进度条就可以观察到不同年份的数据散点图的效果。

结语

数据可视化是个非常非常重要的展示的能力,数据往往只是一堆杂乱无章的数字,只有有效的组织、排序,才能把原来杂乱无章的数据,有序的很好的展现出来。而只有让别人看懂你的数据,才能让别人理解你的数据,所以可视化,非常非常重要,别人完全不知道你的数据的由来、设计、前因后果,所以企图让一个别人理解你的数据,只有好的可视化才能达到。

大家一起来学习可视化鸭~~~
下面的链接也放一些我收藏的对学习可视化很有帮助的网页。

参考链接

plotly 新增模块express
VisuAlgo - visualising data structures and algorithms through animation算法可视化
Visualizing Network Graphs — Bokeh 1.2.0 documentation
D3 / Observable
自定义地图 | 高德地图API

上一篇下一篇

猜你喜欢

热点阅读