喜欢用Python做项目的朋友,难免会遇到这样的情况:做图表的时候,该用哪个好看又实用的可视化工具包呢?前几篇有漂亮图表的时候,总有读者在后台留言询问用什么工具做的图表。下面,作者介绍了八个用Python实现的可视化工具包,其中一些也可以用在其他语言中。快来试试你喜欢哪一款?在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)#Pandascounts.plot(kind='bar')用Bokeh表示调查结果红色柱状图代表538人对“Doyouthinkyouaremanly?”这个问题的回答回答。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通过最大化每个簇的间隔来表现出这种稀疏化。市面上有很多数据可视化包,但很难说哪一个是最好的。希望大家看完这篇文章,能够了解在不同的情况下如何使用不同的美化工具和代码。
