Python中的数据可视化的下一个层次
如何用一行Python语言做出漂亮的、完全交互式的图画
沉没成本谬误是人类所陷入的许多有害的认知偏见之一。它指的是我们倾向于继续将时间和资源投入到一个失败的事业中,因为我们已经在追求中花费了很多时间--沉没。
沉没成本谬误适用于我们在糟糕的工作中呆的时间比我们应该呆的更久,在一个项目中辛勤工作,即使它显然不会成功,是的,继续使用一个乏味的、过时的绘图库--matplotlib,而有更有效的、互动的、更好看的替代品。
在过去的几个月里,我意识到我使用matplotlib的唯一原因是我为学习复杂的语法付出了数百个小时。这种复杂性导致我在StackOverflow上花了几个小时的时间来解决如何格式化日期或添加第二条Y轴的问题,令人沮丧。
幸运的是,现在是Python绘图的大好时机,在探索了各种选择之后,一个明显的赢家--在易用性、文档和功能方面--是plotly Python库。在这篇文章中,我们将直接进入 plotly,学习如何在更短的时间内做出更好的图--通常只需一行代码。
这篇文章的所有代码都可以在GitHub上找到。这些图表都是互动的,可以在NBViewer上查看。
plotly数字的例子(来源)
Plotly 简要概述
plotly Python包是一个建立在plotly.js上的开源库,而plotly.js又是建立在d3.js上。我们将使用plotly上的一个包装器,叫做cufflinks,旨在与Pandas数据帧一起工作。
因此,我们的整个堆栈是cufflinks > plotly > plotly.js > d3.js,这意味着我们得到了用Python编码的效率和d3难以置信的交互式图形能力。
Plotly本身是一家拥有多种产品和开源工具的图形公司。
Python库是免费使用的,我们可以在离线模式下制作无限的图表,在在线模式下最多可以制作25个图表与世界分享。
本文的所有工作都是在Jupyter笔记本中完成的,并在离线模式下运行plotly + cufflinks。在用 pip install cufflinks 安装了 plotly 和 cufflinks 后,plotly 导入了以下内容以在 Jupyter 中运行。
标准的plotly进口
import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import iplot, init_notebook_mode
在离线模式下使用 plotly + cufflinks
输入 cufflinks
cufflinks.go_offline(connected=True)
init_notebook_mode(connected=True)
单一变量的分布。直方图和膨胀图
单变量--单变量--图是开始分析的标准方式,直方图是绘制分布图的常用图(尽管它有一些问题)。在这里,使用我的Medium文章统计数据(你可以在这里看到如何获得你自己的统计数据,或者在这里使用我的统计数据),让我们做一个文章拍手次数的互动直方图(df是一个标准的Pandas数据框)。
df['claps'].iplot(kind='hist', xTitle='claps',
yTitle='count', title='拍打分布')
用plotly+cufflinks制作的交互式柱状图
对于那些习惯于使用matplotlib的人来说,我们所要做的就是多加一个字母(iplot而不是plot),我们就可以得到一个更好看的交互式图表了 我们可以点击数据以获得更多的细节,放大图表的各个部分,并且正如我们稍后看到的,选择不同的类别来突出显示。
如果我们想绘制叠加的直方图,那也很简单。
df[['time_started', 'time_published']].iplot(
kind='hist',
histnorm='percent',
barmode='overlay',
xTitle='一天的时间'。
yTitle='(%) of Articles',
title='开始时间和发表时间')
通过一点点的pandas操作,我们可以做一个柱状图。
重新取样到月度频率并绘制
df2 = df[['view','reads','published_date']].jpg
set_index('published_date').\
resample('M').mean()
df2.iplot(kind='bar', xTitle='Date', yTitle='Average',
title='月平均浏览量和阅读量')
正如我们所看到的,我们可以将pandas的力量与plotly+cufflinks相结合。对于每个故事的粉丝数按出版物分类的boxplot,我们使用一个pivot,然后绘制。
df.pivot(columns=' publication', values='fans').iplot(
kind='box',
yTitle='粉丝'。
title='出版物的粉丝分布')
交互性的好处是,我们可以随心所欲地探索和细分数据。在boxplot中有很多信息,如果不能看到数字,我们就会错过大部分信息
散点图
散点图是大多数分析的核心。它使我们能够看到一个变量随时间的演变或两个(或多个)变量之间的关系。
时间序列
现实世界中相当一部分数据都有时间因素。幸运的是, plotly + cufflinks 的设计考虑到了时间序列的可视化。让我们做一个我的TDS文章的数据框架,看看趋势是如何变化的。
创建一个 "迈向数据科学 "文章的数据框架
tds = df[df['publication'] == 'Towards Data Science']./td
set_index('published_date')
将读取时间绘制成一个时间序列
tds[['claps', 'fans', 'title']].iplot(
y='claps', mode='lines+markers', secondary_y = 'fans',
secondary_y_title='fans', xTitle='Date', yTitle='claps',
text='标题', title='随时间变化的粉丝和掌声')
这里我们在一行中做了很多不同的事情。
自动获得一个格式良好的时间序列X轴
因为我们的变量有不同的范围,所以添加了一个辅助的Y轴
将文章的标题作为悬停信息添加进去
对于更多的信息,我们也可以很容易地加入文本注释。
tds_monthly_totals.iplot(
mode='lines+markers+text',
text=文本。
y='word_count',
opacity=0.8,
xTitle='日期'。
yTitle='字数'。
title='各月总字数')
带注解的散点图
对于一个由第三个分类变量着色的双变量散点图,我们使用。
df.iplot(
x='read_time',
y='read_ratio',
# 指定类别
categories='publication',
xTitle='阅读时间',
yTitle='阅读百分比'。
title='各出版物的阅读百分比与阅读比率')
让我们通过使用对数轴--指定为plotly布局--(关于布局的具体细节,请参见Plotly文档)和通过一个数字变量来确定气泡的大小来变得更复杂一些。
tds.iplot(
x='word_count',
y='reads',
size='read_ratio',
text=文本。
mode='markers',
# 对数X轴
layout=dict(
xaxis=dict(type='log', title='词数'),
yaxis=dict(title='阅读数')。
title='读取数与按读取率计算的日志字数'))
再多做一点工作(详见笔记本),我们甚至可以把四个变量(不建议这样做)放在一个图上
和以前一样,我们可以把pandas和plotly+cufflinks结合起来,制作有用的图表
df.pivot_table(
values='views', index='published_date',
columns='publication').cumsum().iplot(
mode='markers+lines',
size=8。
symbol=[1, 2, 3, 4, 5],
layout=dict(
x轴=dict(title='日期')。
yaxis=dict(type='log', title='总浏览量')。
title='各出版物的总浏览量'))
更多添加功能的例子见笔记本或文档。我们可以用一行代码将文本注释、参考线和最佳拟合线添加到我们的图中,并且仍然具有所有的交互功能。
高级绘图
现在,我们将进入一些你可能不会经常使用的图,但这些图可能相当令人印象深刻。我们将使用plotly figure_factory,使这些令人难以置信的图保持在一行之内。
散点矩阵
当我们想探索许多变量之间的关系时,散点矩阵(也叫splom)是一个不错的选择。
import plotly.figure_factory as ff
figure = ff.create_scatterplotmatrix(
df[['claps', 'publication', 'views',
'read_ratio', 'word_count']]。
diag='histogram',
index='出版物')
即使这个图也是完全互动的,允许我们探索数据。
相关性热图
为了可视化数字变量之间的相关关系,我们计算相关关系,然后制作一个有注释的热图。
corrs = df.corr()
图 = ff.create_annotated_heatmap(
z=corrs.value,
x=list(corrs.columns),
y=list(corrs.index),
annotation_text=corrs.round(2).values,
showscale=True)
绘图的清单不胜枚举。Cufflinks还有几个主题,我们可以不费吹灰之力就能得到完全不同的风格。例如,下面我们有一个 "空间 "主题的比率图和一个 "ggplot "主题的扩散图。
我们还可以得到三维图(表面和气泡)。
对于那些有兴趣的人,你甚至可以做一个饼状图。
在Plotly Chart Studio中进行编辑
当你在笔记本中制作这些图时,你会注意到在图的右下方有一个小链接,上面写着 "导出到plot.ly"。如果你点击这个链接,你就会被带到图表工作室,在那里你可以对你的图进行润色,以便最终呈现。你可以添加注释,指定颜色,一般来说,清理一切以获得一个伟大的数字。然后,你可以在网上发布你的图表,这样任何人都可以通过链接找到它。
下面是我在Chart Studio中修饰的两个图表。
在这里提到的一切,我们仍然没有探索到图书馆的全部功能!我鼓励你去查看一下这个图书馆。我鼓励你去看看plotly和cufflinks的文档,以获得更多令人难以置信的图形。
美国风电场的Plotly交互式图形(来源)。
结论
沉没成本谬论最糟糕的地方是,你只有在放弃努力后才意识到你浪费了多少时间。幸运的是,现在我已经犯了坚持使用matploblib时间过长的错误,你就不必再这样做了
在考虑绘图库的时候,有几件事是我们想要的。
用于快速探索的单线图
用于子集/调查数据的互动元素
根据需要挖掘细节的选项
可根据需要挖掘细节
易于定制的最终呈现方式
就目前而言,在Python中完成所有这些的最佳选择是plotly。Plotly允许我们快速制作可视化,并通过互动性帮助我们更好地洞察数据。另外,让我们承认,绘图应该是数据科学中最令人愉快的部分之一! 在其他库中,绘图变成了一项乏味的任务,但有了 plotly,制作一个伟大的数字又有了乐趣
随着时间的推移,我对Python中的绘图的喜爱程度的曲线图
现在是2019年,是时候升级你的Python绘图库了,以便在你的数据科学可视化中获得更好的效率、功能和美感。
网友评论