matplotlib是Python中最广为人知的图表绘制框架。但是它实在太复杂了,如果要画出较为漂亮的图,则需要付出很多的时间与精力。这次介绍一个Python下能轻松生成各种图表的框架plotly plotly是一个可交互,基于浏览器的绘图库,主打功能是绘制在线可交互的图表,所绘制出来的图表真的赏心悦目。它所支持的语言不只是Python,还支持诸如r,matlab,javescript等语言。plotly绘制的图能直接在jupyter中查看,也能保存为离线网页,或者保存在plot.ly云端服务器内,以便在线查看。
如果使用Python语言,建议用jupyter notebook或jupyterlab作为IDE, 在pycharm中使用plotly并不是一种很好的体验。
notice:我的系统是ubuntu16.04, 其他系统安装步骤望查看文末参考网站
plotly的安装非常简单:
pip install plotly
Notice: 如果你只想使用plotly在线绘图功能,以下安装环节可略去不看
如果只使用plotly在线版,上面一行命令就够了。但是,但是,我们画完图后肯定不想每次还要跳转到新的浏览器标签页查看,而是希望能在jupyter中直接查看,所以还需要配置一下jupyterlab支持。这需要使用pip安装jupyterlab
以及ipywidgets
pip install jupyterlab==0.35 "ipywidgets>=7.2"
如果你的Python包管理器是conda:
conda install jupyterlab=0.35 "ipywidgets>=7.2"
当然,如果你之前已经安装过jupyterlab
,那么可以在Python中查看相关库版本:
[1] import jupyterlab
[2] jupyterlab.__version__
[Output] '0.35.2'
[3] import ipywidgets
[4] ipywidgets.__version__
[Output] '7.4.2'
如果版本不满足相关要求,则升级一下jupyterlab
在安装好jupyterlab
之后,安装一些要用到的jupyterlab 插件
注意,插件安装命令在linux与windows中有所不同
# 为避免"JavaScript heap out of memory"错误,首先在终端中输入如下命令
# (OS X/Linux)
export NODE_OPTIONS=--max-old-space-size=4096
# (Windows)
set NODE_OPTIONS=--max-old-space-size=4096
# Jupyter插件
jupyter labextension install @jupyter-widgets/[email protected] --no-build
# FigureWidget support
jupyter labextension install [email protected] --no-build
# 离线绘图插件
jupyter labextension install @jupyterlab/[email protected] --no-build
# JupyterLab chart editor 表格编辑器(这是可选项,非必须)
jupyter labextension install [email protected] --no-build
# Build extensions 安装插件
jupyter lab build
# 去除NODE_OPTIONS环境变量
# (OS X/Linux)
unset NODE_OPTIONS
# (Windows)
set NODE_OPTIONS=
plot.ly支持导出静态图片。plotly.io
包中提供了to_image
和write_image
两个函数实现相应功能。这需要先安装plotly提供的orca
1命令行工具库及psutil
Python包。
首先可以尝试使用
conda install -c plotly plotly-orca psutil
进行安装。
但是我使用上述命令安装orca
的时候网速过慢,没法安装。
通过查看orca安装说明,其提供了多种安装途径。最后选择了使用npm2安装(这又是一个大坑)
安装nvm(不要直接安装nodejs,那样会安装到系统全局下,导致后续一堆关于用户权限的问题)
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash
安装输入如下命令,目的是让终端找到nvm环境变量,当然你也可以直接关闭重开一个新终端,就不用输入下列命令了
source ~/.bashrc
使用命令command -v nvm
如果输出nvm
那么说明安装成功了
使用nvm ls-remote可查看node所有版本
通过 nvm install <版本号> 命令安装node
安装完毕后,若node -v
与’npm -v’能正常查看版本号,说明安装成功。
在npm安装好后,不要急着安装orca。 还记得上面使用conda安装时遇到的国外源速度过慢问题么,npm默认源也是国外的,我们先将其换为国内源(不要问那为啥不换conda的镜像源,已经尝试过换成清华及我大肥科的,但依然没啥卵用,应该是没有收录)
安装cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
使用cnpm而非npm安装orca
cnpm install -g [email protected] orca
总算是看到丝滑流畅的安装过程了233.
最后验证一下是否安装成功,在终端输入如下命令
orca graph '{ "data": [{"y": [1,2,1]}] }' -o fig.png
High five!
Last but not least
如果你需要导出eps
格式图片文件(latex写论文有时需要这样的图表),那么需要安装poppler
跟inkscape
#也许需要加上那个在需要请求帮助时会说出来的有魔力的词:)
apt-get install poppler-utils
apt-get install inkscape
首先注册一个plotly账号,在用户头像–setting–API Keys下生成API key
在jupyterlab 中输入
import plotly.plotly as py
import plotly.graph_objs as go
plotly.tools.set_credentials_file(username='your_name', api_key='your_keys')
trace0 = go.Scatter(
x=[1, 2, 3, 4],
y=[10, 15, 13, 17]
)
trace1 = go.Scatter(
x=[1, 2, 3, 4],
y=[16, 5, 11, 9]
)
data = [trace0, trace1]
py.plot(data, filename = 'basic-line', auto_open=True)
输出一行提示语及一个网址,这时浏览器会自动跳转到该网页
High five! You successfully sent some data to your account on plotly. View your plot in your browser at https://plot.ly/~cookiegg/0 or inside your plot.ly account where it is named 'basic-line'
'https://plot.ly/~cookiegg/0'
该网页上输出图(在网页上该图是可以交互的):
plotly提供了每个绘图函数的离线版本。
import plotly
import plotly.graph_objs as go
plotly.offline.plot({
"data": [go.Scatter(x=[1, 2, 3, 4], y=[4, 3, 2, 1])],
"layout": go.Layout(title="hello world")
}, auto_open=True)
使用plotly.offline.plot
可生成离线网页图片,如上述代码片段输出结果:
'file:/path/to/temp-plot.html'
使用浏览器即可打开该网页。
但这样的离线绘图模式显得非常麻烦,plotly提供了在jupyterlab环境中显示可交互图表的方法。
plotly.offline.iplot
函数可在jupyter中内嵌显示plotly交互式图表,只需要在jupyter notebook开头写入plotly.offline.init_notebook_mode(connected=True)
即可:
import plotly
import plotly.graph_objs as go
plotly.offline.init_notebook_mode(connected=True)
plotly.offline.iplot({
"data": [go.Scatter(x=[1, 2, 3, 4], y=[4, 3, 2, 1])],
"layout": go.Layout(title="hello world")
})
plotly.py 支持静态图片输出。plotly.io.to_image
能将plotly 图表转为静态图
import plotly.graph_objs as go
import plotly.io as pio
trace1 = [go.Scatter(x=[1,2,3], y=[4,5,6], marker={'color': 'red', 'symbol': 104, 'size': 10},
mode="markers+lines", text=["one","two","three"], name='1st Trace')]
layout=go.Layout(title="First Plot", xaxis={'title':'x1'}, yaxis={'title':'x2'})
figure=go.Figure(data=trace1,layout=layout)
static_image_bytes = pio.to_image(figure, format='png')
from IPython.display import Image
Image(static_image_bytes)
如果要保存静态图片,plotly.io.write_image
能将图片转为包括png,jpg,pdf,svg,eps
在内的多种格式。
TODO: 在使用plotly一段时间后会写一篇深入一些的使用介绍,Just let it be.
https://github.com/plotly/orca ↩︎
https://github.com/creationix/nvm ↩︎