序言
虽然上次写了一个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_html
和figure.write_html
。
这个也大大提高了使用时候的便捷,不用再麻烦的从plotly.io
中import
一个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_x
和marginal_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上画起来也非常的困难,但其实在别的绘图模块里就比较常见。
例如seaborn
的Scatterplot Matrix
或者说基于ggplot
的ggpairs
自动化的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()
但通过这么简单的一个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中的动画控制对于初学者来说就常常十分难以理解,我自己如非必要也不会去写这么一个动画控制,因为就非常的难写。虽然写好了以后也很难展示 因为很难给别人一个网页的结果
,但从交流/展示上来说,就会非常的有意思。
- 由于简书还不支持嵌入js,所以以下图只是静态图,建议到链接去看一下效果(:з」∠)
以上代码中通过animation_frame
来初始化了一个slider从而达到了一个,拖动进度条就可以观察到不同年份的数据散点图的效果。
结语
数据可视化是个非常非常重要的展示的能力,数据往往只是一堆杂乱无章的数字,只有有效的组织、排序,才能把原来杂乱无章的数据,有序的很好的展现出来。而只有让别人看懂你的数据,才能让别人理解你的数据,所以可视化,非常非常重要,别人完全不知道你的数据的由来、设计、前因后果,所以企图让一个别人理解你的数据,只有好的可视化才能达到。
大家一起来学习可视化鸭~~~
下面的链接也放一些我收藏的对学习可视化很有帮助的网页。
参考链接
plotly 新增模块express
VisuAlgo - visualising data structures and algorithms through animation算法可视化
Visualizing Network Graphs — Bokeh 1.2.0 documentation
D3 / Observable
自定义地图 | 高德地图API