使用Python创建图形的方法有很多种,但是哪种方法最好呢?在我们做可视化之前,首先要弄清楚图像目标的一些问题:你是想初步了解数据的分布吗?想在演讲时给人留下深刻印象?也许你想向某人展示一个内在形象,一个中庸的形象?本文将介绍一些常用的Python可视化包,包括这些包的优缺点以及适用于什么样的场景。本文只延伸到2D图,给下篇讲3D图和业务报表(dashboard)留了一些空间,不过这次要讲的很多包都可以很好的支持3D图和业务报表。Matplotlib、Seaborn和Pandas将这三个包放在一起有几个原因:首先,Seaborn和Pandas构建在Matplotlib之上。当您在Seaborn或Pandas中使用df.plot()时,您实际上使用的是其他人使用Matplotlib编写的代码。因此,情节在美学上相似,用于自定义情节的语法也非常相似。当提到这些可视化工具时,脑海中浮现出三个词:探索性、数据、分析。这些包非常适合首次探索数据,但不足以进行演示。Matplotlib是一个相对低级的库,但它支持令人难以置信的定制程度(所以不要简单地将它排除在用于演示的包之外!),但还有其他工具更适合演示。Matplotlib还具有样式选择功能,可模拟流行的美化工具,如ggplot2和xkcd。这是我使用Matplotlib和相关工具完成的示例图:在处理篮球队薪资数据时,我想找到薪资中位数最高的球队。为了说明结果,我将每支球队的薪水用颜色编码成条形图,以说明一名球员在哪支球队会过得更好。importseabornassnsimportmatplotlib.pyplotaspltcolor_order=['xkcd:cerulean','xkcd:ocean','xkcd:black','xkcd:royalpurple','xkcd:royalpurple','xkcd:navyblue','xkcd:powderblue','xkcd:lightmaroon','xkcd:lightishblue','xkcd:navy']sns.barplot(x=top10.Team,y=top10.Salary,palette=color_order).set_title('TeamswithHighestMedianSalary')plt.ticklabel_format(style='sci',axis='y',scilimits=(0,0))第二个图是回归实验残差的Q-Q图。这张图的主要目的是展示如何用尽可能少的线条做出有用的图,当然也可以不那么漂亮。importmatplotlib.pyplotaspltimportscipy.statsasstats#model2isaregressionmodellog_resid=model2.predict(X_test)-y_teststats.probplot(log_resid,dist="norm",plot=plt)plt.title("NormalQ-Qplot")plt.show()最终证明,Matplotlib及其相关工具非常高效,但并不是演示的最佳工具。ggplot(2)你可能会问,“Aaron,ggplot是R中最常用的可视化包,但你不打算为Python编写一个包吗?”。人们已经用Python实现了ggplot2,复制了这个包从美化到语法的一切。在我看过的所有资料中,它都是ggplot2之类的东西,但这个包的好处在于它依赖于PandasPython包。但是,PandasPython包最近弃用了一些方法,导致Python版本不兼容。如果您想在R中使用真正的ggplot(除了依赖项之外,它们具有相同的外观、感觉和语法),我将在另一篇文章中对此进行讨论。换句话说,如果你必须在Python中使用ggplot,那么你必须安装Pandas0.19.2版本,但我建议你不要为了使用较低级别的绘图包而降低Pandas的版本。ggplot2(我认为是Python的ggplot)之所以如此重要,是因为它们使用“图形语法”来构建图片。基本前提是可以实例化一个图,然后分别添加不同的特征;即可以分别美化标题、坐标轴、数据点、趋势线等。下面是ggplot代码的一个简单示例。我们首先使用ggplot实例化绘图,设置美化属性和数据,然后添加点、主题、轴和标题标签。#AllSalariesggplot(data=df,aes(x=season_start,y=salary,colour=team))+geom_point()+theme(legend.position="none")+labs(title='SalaryOverTime',x='Year',y='Salary($)')BokehBokeh很漂亮。从概念上讲,Bokeh与ggplot类似,都是使用图形的语法来构造图片,但Bokeh具有易于使用的界面,可以制作专业的图形和业务报告。为了说明这一点,我编写了代码以根据538男性气质调查数据集制作直方图:(title='DoYouViewYourselfAsMasculine?',x_axis_label='Response',y_axis_label='Count',x_range=list(resps))p2.vbar(x=resps,top=counts,width=0.6,fill_color='red',line_color='black')show(p2)#Pandas用Bokeh表示调查结果。红色条形图代表了538人对“你觉得自己有男子气概吗?”这个问题的回答。Bokeh代码的第9-14行构建了一个优雅且专业的响应计数直方图-具有合理的字体大小、y轴刻度和格式。我编写的大部分代码都是用于标记坐标轴和标题,以及为条形图添加颜色和边框。谈到制作精美且富有表现力的图像时,我更喜欢散景——它已经为我们做了很多美化工作。在Pandas中表示相同的数据蓝色图是上面的第17行。这两个直方图的值是一样的,但是目的不同。在探索性设置中,在Pandas中写一行代码查看数据很方便,但是Bokeh的美化能力非常强大。Bokeh提供的所有便利都是在matplotlib中自定义的,包括x轴标签的角度、背景线、y轴刻度和字体(大小、斜体、粗体)等。下图显示了一些随机趋势,具有更高的定制程度:使用图例和不同的颜色和线条。Bokeh也是制作交互式商业报告的绝佳工具。PlotlyPlotly非常强大,但设置和创建图形需要花费大量时间,而且不直观。和Plotly干了大半个上午,差点没做出什么东西来,直接去吃饭了。我只创建了没有坐标标签的条形图,以及无法删除线条的“散点图”。上手Plotly有几点需要注意:安装时必须有APIkey并注册,不能直接用pip安装;Plotly绘制的数据和布局对象是唯一的,但不直观;该布局对我不起作用(40行代码白费!)但它有优点,设置中的所有缺点都有相应的解决方法:您可以在Plotly网站和Python环境中编辑图像;支持交互式图像和业务报告;Plotly配合Mapbox,可以自定义地图;具有绘制出色图形的潜力。下面是我针对这个包编写的代码:#plot1-barplot#**note**-thelayoutlinesdonothingandtripnoerrorsdata=[go.Bar(x=team_ave_df.team,y=team_ave_df.turnovers_per_mp)]layout=go.Layout(title=go.layout.Title(text='TurnoversperMinutebyTeam',xref='paper',x=0),xaxis=go.layout.XAxis(title=go.layout.xaxis.Title(text='Team',font=dict(family='CourierNew,monospace',size=18,color='#7f7f7f'))),yaxis=go.layout.YAxis(title=go.layout.yaxis.Title(text='AverageTurnovers/Minute',font=dict(family='CourierNew,monospace',size=18,color='#7f7f7f'))),autosize=True,hovermode='closest')py.iplot(figure_or_data=data,layoutlayout=layout,filename='jupyter-plot',sharing='public',fileopt='overwrite')#plot2-attemptatascatterplotdata=[go.Scatter(x=player_year.minutes_played,y=player_year.salary,marker=go.scatter.Marker(color='red',size=3))]layout=go.Layout(title="test",xaxis=dict(title='why'),yaxis=dict(title='plotly'))py.iplot(figure_or_data=data,layoutlayout=layout,filename='jupyter-plot2',sharing='public')[Image:image.png]条形图显示不同NBA球队每分钟的平均失误率散点图显示NBA薪水和上场时间之间的关系总的来说,开箱即用美化器看起来不错,但我的多次尝试逐字复制文档和修改轴标签让我失败了。但下面的图展示了Plotly的潜力,以及我为什么花几个小时在上面:PlotlyPagePygal上的一些示例图Pygal不是很出名,并且像其他常用的绘图包一样,它也使用图形框架语法来构建图像。由于相对简单的绘图目标,这是一个相对简单的绘图包。使用Pygal非常简单:实例化图形;使用图形目标属性对其进行格式化;使用figure.add()向图中添加数据。我在使用Pygal时遇到的主要问题是图像渲染。不得不使用render_to_file选项,然后在Web浏览器中打开文件以查看我刚刚构建的内容。最后这是值得的,因为图形是交互式的,并且具有令人满意且易于定制的美化功能。总而言之,包看起来不错,但在文件创建和渲染部分很麻烦。Networkx虽然Networkx基于matplotlib,但它仍然是图形分析和可视化的最佳解决方案。图和网络不是我的专业领域,但Networkx是一种快速简便的方式来以图形方式表示网络之间的连接。下面是我为简单图形构建的不同表示,以及从StanfordSNAP下载的一些代码(关于绘制小型Facebook网络)。我用数字(1~10)对每个节点进行颜色编码,代码如下:options={'node_color':range(len(G)),'node_size':300,'width':1,'with_labels':False,'cmap':plt.cm.coolwarm}nx.draw(G,**options)上面提到的稀疏Facebook图的可视化代码如下:importitertoolsimportnetworkxasnximportmatplotlib.pyplotaspltf=open('data/facebook/1684.圈子','r')circles=[line.split()forlineinf]f.close()network=[]forcircincircles:cleaned=[int(val)forvalincirc[1:]]network.append(cleaned)G=nx.vinnetwork的Graph():G.add_nodes_from(v)edges=[itertools.combinations(net,2)fornetinnetwork]foredge_groupinedges:G.add_edges_from(edge_group)options={'node_color':'lime','node_size':3,'width':1,'with_labels':False,}nx.draw(G,**options)此图非常稀疏,Networkx通过最大化每个簇的间隔来显示这种稀疏化。数据可视化的包有很多,但是没法说哪个最好。希望大家看完这篇文章,能够了解在不同的情况下如何使用不同的美化工具和代码。原文链接:https://towardsdatascience.com/reviewing-python-visualization-packages-fa7fe12e622b【本文为微信《机器之心》专栏原文翻译公众号《机器之心》(id:almosthuman2014)"]戳这里,阅读更多本作者的好文
