![f89a85d802a413ffaad7b8c055a2a16c.png](https://i-blog.csdnimg.cn/blog_migrate/dfafbc3335ae5c4ca9ea0985aa76bf59.jpeg)
(Source)
如何使用单行Python制作美观,完全交互的图
沉没成本的谬论是使人类沦为猎物的许多有害认知偏见之一。 它是指我们倾向于将时间和资源继续用于失败的事业,因为我们已经花了很多时间去做必然失败的事。 沉没成本意味着我们不应该更长的时间呆在糟糕的工作上,即使很显然它行不通,也将项目拒之门外。是的,当有机会使用,效率更高,交互性和外观更好的替代方案时,没有理由继续使用乏味,过时的绘图库-matplotlib 。
在过去的几个月中,我意识到使用Matplotlib的唯一原因是我花了数百个小时来学习复杂的语法。 这种复杂性导致数小时的挫败感,弄清了如何格式化日期或添加第二个y轴。 幸运的是,这是进行Python绘图的绝佳时机,在探索了各种选择之后,就其易用性,文档和功能而言,明显的赢家是可开发的Python库。 在本文中,我们将深入研究绘图,学习如何在更短的时间内制作更好的绘图-通常只需一行代码。
GitHub(https://github.com/WillKoehrsen/Data-Analysis/blob/master/plotly/Plotly%20Whirlwind%20Introduction.ipynb)上提供了本文的所有代码。 这些图表都是交互式的,可以在NBViewer上查看。
![e66b3238d05ac6612c7ed3cb51f3ef25.png](https://i-blog.csdnimg.cn/blog_migrate/369447e30cd01759eb714170e7d71680.jpeg)
Example of plotly figures (source)
Plotly简要概述
plotly Python软件包是一个基于plotly.js的开源库,该库又基于d3.js。 我们将在设计用于Pandas数据框的称为cufflinks包。 因此,我们的整个技术栈是cufflinks> plotly> plotly.js> d3.js,这意味着我们拥有d3令人难以置信的交互式图形功能,同时获得了Python编码的效率。
(Plotly本身是一家图形公司,提供多种产品和开源工具。Python库是免费使用的,我们可以在离线模式下制作无限制的图表,而在线模式下最多可以制作25个图表以与世界共享。)
本文中的所有工作都是在Jupyter Notebook中完成的,并且在离线模式下运行有绘图+cufflinks。 使用pip安装plotly和cufflinks后,以cufflinks方式导入以下内容以在Jupyter中运行:
# Standard plotly importsimport plotly.plotly as pyimport plotly.graph_objs as gofrom plotly.offline import iplot, init_notebook_mode# Using plotly + cufflinks in offline modeimport cufflinkscufflinks.go_offline(connected=True)init_notebook_mode(connected=True)
单变量分布:直方图和箱线图
单变量(单变量)图是开始分析的标准方法,直方图是用于绘制分布图的首选图(尽管有一些问题)。 在这里,使用我的中型文章统计信息(您可以在此处查看如何获得自己的统计信息或在此处使用我的统计信息),让我们制作文章点赞数量的交互式直方图(df是标准的Pandas数据框):
df['claps'].iplot( kind='hist', x, y, )
![916fb29fc606e1e202ea58cc9c9afcd7.gif](https://i-blog.csdnimg.cn/blog_migrate/787cd892f4ac9065ac522df4b1434817.gif)
Interactive histogram made with plotly+cufflinks
对于那些习惯于使用matplotlib的用户,我们所要做的就是再添加一个字母(用iplot代替plot),我们将获得一个外观更好,更具交互性的图表! 我们可以单击数据以获取更多详细信息,将其放大到绘图的各个部分,然后如稍后所见,选择不同的类别以突出显示。
如果我们想绘制重叠的直方图,那很简单:
df[['time_started', 'time_published']].iplot( kind='hist', histnorm='percent', barmode='overlay', x, y, )
![550a0fc45d1b16bc5b9b7b20e284c2e2.png](https://i-blog.csdnimg.cn/blog_migrate/b5e187e74f1efc46f9ce6689581637f2.jpeg)
借助一些Pandas操作,我们可以绘制一个小图:
# Resample to monthly frequency and plot df2 = df[['view','reads','published_date']]. set_index('published_date'). resample('M').mean()df2.iplot(kind='bar', x, y, )
![458cc4965a17c99cbe00b9d6c7ff02fd.png](https://i-blog.csdnimg.cn/blog_migrate/1d0eb8c2ba51ab666b52cd5480fa8928.jpeg)
如我们所见,我们可以将Pandas的功能与plotly+cufflinks结合起来。 对于每个故事,按出版物发布的粉丝的箱线图,我们使用cufflinks,然后绘制:
df.pivot(columns='publication', values='fans').iplot( kind='box', y, )
![a6e7c8c4c036152251dcdbae8d71107e.gif](https://i-blog.csdnimg.cn/blog_migrate/ac074f78c71297279aa418523f8b5b43.gif)
交互的好处是我们可以根据需要浏览子集数据。 箱形图中有很多信息,并且如果无法查看数字,我们将错过大多数信息!
散点图
散点图是大多数分析的核心。 它使我们能够看到变量随时间的变化或两个(或多个)变量之间的关系。
时间序列
现实世界中相当一部分数据具有时间元素。 幸运的是,plotly +cufflinks的设计考虑了时间序列的可视化。 让我们为我的TDS文章制作一个数据框,然后看看趋势如何变化。
# Create a dataframe of Towards Data Science Articlestds = df[df['publication'] == 'Towards Data Science']. set_index('published_date')# Plot read time as a time seriestds[['claps', 'fans', 'title']].iplot( y='claps', mode='lines+markers', secondary_y = 'fans', secondary_y_, x, y, text='title', )
![b019929517aa72fa6cdf91750eeadb27.gif](https://i-blog.csdnimg.cn/blog_migrate/0916e786e78843d9edfc9240b00d576a.gif)
在这里,我们正在一行中做很多不同的事情:
· 自动获取格式正确的时序X轴
· 添加辅助y轴,因为我们的变量具有不同的范围
· 添加文章标题作为悬停信息
有关更多信息,我们还可以轻松添加文本注释:
tds_monthly_totals.iplot( mode='lines+markers+text', text=text, y='word_count', opacity=0.8, x, y, )
![e040c352378841cbdf22a0ccbb6da860.png](https://i-blog.csdnimg.cn/blog_migrate/58c349eb60a042ee8071869c9d3d45c6.jpeg)
Scatterplot with annotations
对于由第三个类别变量着色的双变量散点图,我们使用:
df.iplot( x='read_time', y='read_ratio', # Specify the category categories='publication', x, y, )
![5a2ea045c48757fa1a63119f3135e26d.png](https://i-blog.csdnimg.cn/blog_migrate/ef5ca2dc28090b3c013d53d02b62f676.jpeg)
通过使用指定布局的对数轴(请参见Plotly文档以获取布局详细信息),并使用数值变量来调整气泡大小,让我们更加复杂一些:
tds.iplot( x='word_count', y='reads', size='read_ratio', text=text, mode='markers', # Log xaxis layout=dict( xaxis=dict(type='log', ), yaxis=dict(), ))
![7b099af34f8c1be4ad3c5c577e79f50f.png](https://i-blog.csdnimg.cn/blog_migrate/d4294e7ef45f73c33562bbb483e1a232.jpeg)
通过做更多的工作(有关详细信息,请参阅笔记本),我们甚至可以在一个图表上放置四个变量(不建议这样做)!
![0fae63a7801e0fd15c9b5a042b8f818d.png](https://i-blog.csdnimg.cn/blog_migrate/c35141641ae077a23a6a99fef625d1e8.jpeg)
和以前一样,我们可以将Pandas与plotly + cufflinks结合使用,以获得有用的plot
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( xaxis=dict(), yaxis=dict(type='log', ), ))
![6323b782088eab4af643dc9362d9b186.png](https://i-blog.csdnimg.cn/blog_migrate/3fdea5dbb7df8f77ae0a9987f5fa71cc.jpeg)
有关更多功能的更多示例,请参见笔记本或文档。 我们可以使用一行代码,并且仍然具有所有交互功能,将文本注释,参考线和最佳拟合线添加到绘图中。
高级图
现在,我们将介绍一些您可能不会经常使用的图表,但它们会给人留下深刻的印象。 我们将使用plotly fig_factory,甚至将这些难以置信的功能保持在一行代码上。
散点矩阵
当我们要探索许多变量之间的关系时,散点图(也称为splom)是一个不错的选择:
import plotly.figure_factory as fffigure = ff.create_scatterplotmatrix( df[['claps', 'publication', 'views', 'read_ratio','word_count']], diag='histogram', index='publication')
![5b55bb76f169ef55dac591f9c956fead.png](https://i-blog.csdnimg.cn/blog_migrate/2bfd4b285f517eaf37f3368213d7cdd8.jpeg)
即使该图是完全互动的,也允许我们探索数据。
关联热图
为了可视化数值变量之间的相关性,我们计算相关性,然后制作带注释的热图:
corrs = df.corr()figure = ff.create_annotated_heatmap( z=corrs.values, x=list(corrs.columns), y=list(corrs.index), annotation_text=corrs.round(2).values, showscale=True)
![a607fac77852dcca4468095d0e785f0b.png](https://i-blog.csdnimg.cn/blog_migrate/f116580e9f0087b6879eb7c6b0400cc2.jpeg)
plot清单不胜枚举。 cufflinks还具有几个主题,我们可以轻松使用它们来获得完全不同的样式。 例如,下面我们在"space"主题中有一个比率图,在"ggplot"中有一个展布图:
![9c694edf9265bfda577a991a81b0e239.png](https://i-blog.csdnimg.cn/blog_migrate/fe4bd9a62717fc51a29235e3cf26989d.jpeg)
![be137915c1d777f2dea2211a89fbc7a1.png](https://i-blog.csdnimg.cn/blog_migrate/e410beb5544d066027d186511ad45a5b.jpeg)
我们还获得了3D图(表面和气泡):
![43e4972648a4b3afe15203e8f25f232a.png](https://i-blog.csdnimg.cn/blog_migrate/2ff2b54efbfc3c3a80156082ff3f3983.jpeg)
![3c01d3a601b9c9bb381a3f2786d63481.png](https://i-blog.csdnimg.cn/blog_migrate/1b0a30e6fc72572ae37c22d02e3aecc4.jpeg)
对于那些喜欢的人,您甚至可以制作饼图:
![3127f1e2064c9b77d6d6faf382c6bd2b.png](https://i-blog.csdnimg.cn/blog_migrate/b52548535e3b55eb9583a077db5f5ea5.jpeg)
在Plotly Chart Studio中进行编辑
在笔记本上绘制这些图时,您会在图形的右下方看到一个小链接,上面显示"导出到plot.ly"。 如果单击该链接,那么您将被带到Plotly Chart Studio,在这里您可以对绘图进行修饰,用于最终演示。 您可以添加注释,指定颜色,并通常将所有内容清理干净,以获得一个不错的形象。 然后,您可以在线发布图形,以便任何人都可以通过链接找到它。
以下是我在Chart Studio中修改过的两个图表:
![bdc3b92f48a072f2a9ae13a846470507.png](https://i-blog.csdnimg.cn/blog_migrate/219ae4e9c2efc4fcbc36051361de7a9e.jpeg)
![1cfa4aaf39da3f79bb5b84bcc02b43ed.png](https://i-blog.csdnimg.cn/blog_migrate/a14405832933c377b554ef01f46b1a8e.jpeg)
对于这里提到的所有内容,我们仍然没有探索库的全部功能! 我建议您同时查看plotly和cufflinks文档,以获取更多令人难以置信的图形。
![1bba88eb9dfeb1d45b5e16042789eb81.png](https://i-blog.csdnimg.cn/blog_migrate/188105de1afccf8c5aadf85e416f53f5.jpeg)
Plotly interactive graphics of wind farms in United States (Source)
结论
关于沉没成本谬误的最糟糕的部分是,您只会意识到自己退出这项工作后浪费了多少时间。 幸运的是,由于我犯了长时间使用matploblib的错误,您不必这样做!
在考虑绘制库时,我们需要做一些事情:
· 单行代码图表快速探索
· 子集/调查数据的交互元素
· 可选择根据需要深入研究细节
· 轻松定制以进行最终演示
截至目前,在Python中完成所有这些操作的最佳选择是Plotly。 通过Plotly,我们可以快速进行可视化,并通过交互性帮助我们更好地了解数据。 另外,让我们承认,绘图应该是数据科学中最令人愉快的部分之一! 在其他库中,绘图变成了一项繁琐的工作,但在plotly中,绘制一个出色的图表就变得令人愉快!
![3bc0b8cdb91c9155edccfbacafae0a32.png](https://i-blog.csdnimg.cn/blog_migrate/f525b0fd94710d685564bafd45b0b902.jpeg)
A plot of my enjoyment with plotting in Python over time
现在已经到了2019年,是时候升级Python绘图库了,以便在数据科学可视化中实现更高的效率,功能和美观性。
(本文翻译自Will Koehrsen《The Next Level of Data Visualization in Python》,参考https://towardsdatascience.com/the-next-level-of-data-visualization-in-python-dd6e99039d5e)