当前位置: 首页 > 科技观察

6个很棒的可视化Python库

时间:2023-03-13 03:39:21 科技观察

对使用哪种可视化工具感到困惑?我为你分解了每个库的优缺点动机如果你是Python可视化的新手,你可能会被大量的库和示例所淹没:MatplotlibSeabornPlotlyBokehAltairFolium如果你有一个DataFrame等待可视化,你应该选择哪一个?在某些情况下,某些库可能比其他库更好。本文将展示每种方法的优缺点。到本文结束时,您应该能够区分每个库的不同特性,从而更轻松地选择一个好的库。我们将通过获取示例数据集并使用每个库来关注一些特定属性来查看一些特定属性:交互性您希望您的可视化具有交互性吗?一些库,例如Matplotlib,将可视化呈现为图像。因此,它们非常适合解释概念(在纸上、幻灯片或演示文稿中)。另一方面,像Altair、Bokeh和Plotly这样的库可以让你创建交互式图表,这样用户就可以自己深入研究并探索语法和灵活性。每个库的语法有何不同?像Matplotlib这样的低级库让你可以做任何可以想象的事情,但代价是更复杂的API。像Altair这样的一些库是非常声明性的,这使得映射到您的数据更容易。数据类型和可视化您是在处理特殊用例,例如地理地图、大数据,还是使用仅由特定库支持的图形类型?数据为了进行比较,我将在本文中使用从Github抓取的真实数据:我爬取了超过1k的优秀机器学习Github配置文件,这是我发现的从Github上优秀的机器学习资料中获取见解或从DatapaneBlob获取直接数据。importdatapaneasdpdp.Blob.get(name='github_data',owner='khuyentran1401').download_df()如果要使用Blob,请记得事先使用token登录Datapane。这个过程应该不到1分钟MatplotlibMatplotlib可能是用于可视化数据的最常用的Python库。每个对数据科学感兴趣的人都可能至少使用过一次Matplotlib。优点1.易于查看数据的属性在分析数据时,可能希望快速查看分布。比如我想快速了解关注最多的前100名用户的分布情况,通常Matplotlib就足够了。importmatplotlib.pyplotasplttop_followers=new_profile.sort_values(by='followers',axis=0,ascending=False)[:100]fig=plt.figure()plt.bar(top_followers.user_name,top_followers.followers)即使Matplotlib的x-axis看起来不太好,我们也可以通过看图来更好的理解数据的分布。2.可以画任何东西Matplotlib是多才多艺的,这意味着它可以画任何你能想象到的东西。Matplotlib的网站上有非常全面的文档和图库中的各种图形,这使得您可以轻松找到有关您能想到的任何疯狂情节的教程。像这样的一些文本:fig=plt.figure()plt.text(0.6,0.7,"learning",size=40,rotation=20.,ha="center",va="center",bbox=dict(boxstyle="round",ec=(1.,0.5,0.5),fc=(1.,0.8,0.8),))plt.text(0.55,0.6,"machine",size=40,rotation=-25.,ha="right",va="top",bbox=dict(boxstyle="square",ec=(1.,0.5,0.5),fc=(1.,0.8,0.8),))plt.show()缺点Matplotlib可以绘制任何东西,但绘制非基本图或调整图的外观可能很复杂。correlation=new_profile.corr()fig,ax=plt.subplots()im=plt.imshow(correlation)ax.set_xticklabels(correlation.columns)ax.set_yticklabels(correlation.columns)plt.setp(ax.get_xticklabels(),rotation=45,ha="right",rotation_mode="anchor")即使情节足以可视化分布,如果你想向其他人展示数据,你仍然需要固定x轴,y-轴,这是很多工作。这是因为Matplotlib有一个非常底层的接口。总结:Matplotlib可以绘制任何东西,但复杂的绘图可能需要比其他库更多的代码。SeabornSeaborn是一个基于Matplotlib的Python数据可视化库。它在库上提供了更高级别的包装器,使其更易于使用。优点1.代码少它为类似的图表提供了更高层次的接口。换句话说,seaborn通常提供与matplotlib类似的绘图,但代码更少,设计更好。我们使用与之前相同的数据来绘制图表的类似热图。correlation=new_profile.corr()sns.heatmap(correlation,annot=True)我们在不设置x和y标签的情况下得到更好的热图!2.使普通图更漂亮当涉及到流行图(例如条形图、箱形图、计数图、直方图等)时,许多人选择seaborn不仅因为它们可以用更少的代码创建,而且它们看起来更漂亮。正如我们在上面的例子中看到的,颜色看起来也比Matplotlib的默认颜色更好。sns.set(style="darkgrid")titanic=sns.load_dataset("titanic")ax=sns.countplot(x="class",data=titanic)缺点Seaborn更有限,没有那么广泛的收藏作为matplotlib重要:Seaborn是Matplotlib的更新版本。虽然Seaborn没有Matplotlib那样广泛的集合,但它们可以用更少的代码制作流行的图,如条形图、箱线图、热图等。看起来很漂亮。PlotlyPlotly的Python图形库使创建交互式、出版质量的图形变得容易。它还可以创建类似于Matplotlib和seaborn的图表,例如折线图、散点图、面积图、条形图等。优点1.喜欢R如果你喜欢在R中绘图并且在切换到Python时错过了它的功能,Plotly提供了使用Python绘制相同质量的图!我最喜欢的是PlotlyExpress,因为它真的很简单,而且用一行Python可以更快地创建更好的图形。fig=px.scatter(new_profile[:100],x='followers',y='total_stars',color='forks',size='contribution')fig.show()2.使用Plotly轻松创建交互式图表交互式绘图也可以轻松创建。交互式图表不仅美观,而且还使查看者更容易看到每个数据点。还记得我们之前用matplotlib制作的条形图吗?让我们看看Plotlyimportplotly.expressaspxtop_followers=new_profile.sort_values(by='followers',axis=0,ascending=False)[:100]fig=px的结果。bar(top_followers,x='user_name',y='followers',)fig.show()使用大致相同的代码行,我们生成一个交互式图表,我们可以将鼠标悬停在每个栏上以查看用户和关注者的数量本栏所代表。这意味着可视化的用户可以自行浏览。3.复杂的绘图变得容易使用Plotly,可以轻松创建一些通常难以创建的绘图。例如,如果我们想创建一个地图来可视化Github用户的位置,我们可以找到他们的经度和纬度,如下所示,然后使用该数据来发现用户在地图上的位置,如下所示importplotly.expressaspximportdatapaneasdplocation_df=dp。Blob.get(name='location_df',owner='khuyentran1401').download_df()m=px.scatter_geo(location_df,lat='latitude',lon='longitude',color='total_stars',size='forks',hover_data=['user_name','followers'],title='LocationsofTopUsers')m.show()只需几行代码,所有用户的位置就可以在地图上精美呈现。气泡的颜色代表分叉数,大小代表总星数缺点虽然Plotly支持各种plot,但还是缺少一些常用的plot。比如seaborn虽然有sns。没有计数图表。因此,我们需要预先执行groupby,以便按类对数据进行分组。titanic=sns.load_dataset("titanic")#Groupdatabyclasstitanic_groupby=titanic.groupby(by='class').count()fig=px.bar(titanic_groupby,y='survived',labels={'survived':'计数'})fig.show()我们需要更多代码来创建计数图,并且该图不会像seaborn那样自动显示。要点:Plotly非常适合用很少的代码创建交互式和出版质量的图形。但是,对于一些简单的图(比如count图),使用seabornAltar更简单Altair是一个基于vega-lite的Python的声明式统计可视化库,非常适合需要大量统计变换的图。优点1.简单的可视化语法用于创建可视化的语法很容易理解。它只需要提及数据列和编码通道之间的链接,其余的绘图将自动处理。这听起来很抽象,但在您处理数据时它非常重要,它使可视化信息变得非常快速和直观。比如上面的泰坦尼克数据,我们要统计每个班级的人数,只需要在y_axis=sns.load_dataset("titanic")alt.Chart(titanic)中使用count()importseabornassnsimportaltairasalttitanic即可。mark_bar().encode(alt.X('class'),y='count()')2.易于转换数据Altair也使得在创建图表时转换数据变得非常容易例如,如果我们想找到每个按性别划分的平均年龄,而不是像Plotly那样预先进行转换,我们可以在代码中执行转换以创建图形。hireable=alt.Chart(泰坦尼克号).mark_bar().encode(x='sex:N',y='mean_age:Q').transform_aggregate(mean_age='mean(age)',groupby=['sex'])hireable这里的逻辑是使用transform_aggregate()得到均值数据(没有任何顺序的分类数据),或者使用:Q确保mean_age是定量数据(价值的度量,例如数字)3.易于-linkgraphAltair还允许您在绘图之间进行一些令人印象深刻的链接,例如使用区间选择来过滤附加直方图的内容。例如,如果我们想可视化一段时间内每个班级的人数,我们可以选择年龄和票价之间的点图,我们可以这样做。brush=alt.selection(type='interval')points=alt.Chart(titanic).mark_point().encode(x='age:Q',y='fare:Q',color=alt.condition(刷,'class:N',alt.value('lightgray'))).add_selection(brush)bars=alt.Chart(titanic).mark_bar().encode(y='class:N',color='class:N',x='count(class):Q').transform_filter(brush)points&bars当我们在散点图中拖动鼠标选择一个区间时,我们可以在下面的条形图中看到变化。当与早期的转换和计算相结合时,这意味着您可以创建一些可以即时计算的非常交互式的图表——您甚至不需要运行中的Python服务器!缺点除非您指定自定义样式(如条形图),否则简单图表看起来不像seaborn或Plotly。Altair也不建议使用超过5000个样本的数据集,而是建议您在可视化之前总结数据。要点:Altair非常适合在复杂图表中显示统计数据。Altair无法处理超过5000个样本的数据,并且与Plotly或Seaborn相比,一些简单的图表在风格上看起来不一样。BokehBokeh是以网络浏览器为代表的灵活的交互式可视化库。优点Matplotlib的交互式版本如果我们要在上面提到的交互式可视化库中排名,Bokeh可能在与Matplotlib的相似性方面排名第一。Matplotlib可以创建任何绘图,因为它是一个低级可视化库。Bokeh可以用作高级或低级接口;因此,它可以创建许多Matplotlib创建的复杂图,但代码行数更少,分辨率更高。比如Matplotlib的圆形图importmatplotlib.pyplotaspltfig,ax=plt.subplots()x=[1,2,3,4,5]y=[2,5,8,2,7]forx,yinzip(x,y):ax.add_patch(plt.Circle((x,y),0.5,edgecolor="#f03b20",facecolor='#9ebcda',alpha=0.8))#Useadjustable='box-forced'让绘图也变成正方形。ax.set_aspect('equal',adjustable='datalim')ax.set_xbound(3,4)ax.plot()#Causesanautoscaleupdate.plt.show()也可以使用Bokeh创建,解析力更好,实用性更强来自bokeh.ioimportoutput_file,showfrombokeh.modelsimportCirclefrombokeh.plottingimportfigurereset_output()output_notebook()plot=figure(plot_width=400,plot_height=400,tools="tap",title="Selectacircle")renderer=plot.circle([1,2,3,4,5],[2,5,8,2,7],size=50)selected_circle=Circle(fill_alpha=1,fill_color="firebrick",line_color=None)nonselected_circle=Circle(fill_alpha=0.2,fill_color="蓝色",line_color="firebrick")renderer.selection_glyph=selected_circlerenderer.nonselection_glyph=nonselected_circleshow(plot)2.绘图之间LinkBokeh还可以非常轻松地在绘图之间建立链接——在一个绘图中应用的更改将应用??到具有相似变量的另一个绘图。例如,如果我们并排创建3个图,想观察它们之间的关系,我们可以使用链接画笔frombokeh.layoutsimportgridplot,rowfrombokeh.modelsimportColumnDataSourcereset_output()output_notebook()source=ColumnDataSource(new_profile)TOOLS="box_select,lasso_select,help"TOOLTIPS=[('user','@user_name'),('followers','@followers'),('following','@following'),('forks','@forks'),('贡献','@贡献')]s1=figure(tooltips=TOOLTIPS,plot_width=300,plot_height=300,title=None,tools=TOOLS)s1.circle(x='followers',y='following',source=source)s2=figure(tooltips=TOOLTIPS,plot_width=300,plot_height=300,title=None,tools=TOOLS)s2.circle(x='followers',y='forks',source=source)s3=figure(tooltips=TOOLTIPS,plot_width=300,plot_height=300,title=None,tools=TOOLS)s3.circle(x='followers',y='contribution',source=source)p=gridplot([[s1,s2,s3]])show(p)ColumnDataSource使数据能够在绘图之间共享。因此,当我们对一个图应用更改时,其他图也会相应地发生变化。缺点由于Bokeh是一个具有中级接口的库,因此它通常比Matplotlib需要更少的代码,但需要更多的代码来生成与Seaborn、Altair或Plotly相同的绘图。例如,要使用泰坦尼克号数据创建相同的计数图,除了预先转换数据外,如果我们希望图形看起来更好,我们还需要设置条的宽度和颜色frombokeh.transformimportfactor_cmapfrombokeh.palettesimportSpectral6p=figure(x_range=list(titanic_groupby['class']))p.vbar(x='class',top='survived',source=titanic_groupby,fill_color=factor_cmap('class',palette=Spectral6,factors=list(titanic_groupby['class'])))show(p)如果我们不给条形图增加宽度,条形图会是这样的所以,我们需要手动调整大小,使图形更好frombokeh.transformimportfactor_cmapfrombokeh.palettesimportSpectral6p=figure(x_range=list(titanic_groupby['class']))p.vbar(x='class',top='survived',width=0.9,source=titanic_groupby,fill_color=factor_cmap('class',palette=Spectral6,factors=list(titanic_groupby['class'])))show(p)如果你想用更少的代码创建漂亮的条形图,与其他库相比,Bokeh可能是缺点重点:Bokeh是唯一一个从低到高库的界面,可以轻松生成通用和花哨的图形。然而,这是以Bokeh为代价的,通常需要更多代码来创建与其他库质量相似的图。FoliumFolium使交互式传单地图上的数据可视化变得容易。该库有许多来自OpenStreetMap、Mapbox和Stamen的内置tilesets优点1.使用标记轻松创建地图Plotly、Altair和Bokeh也使我们能够创建地图,Folium使用开放的街道地图,代码最少使您更接近Google地图还记得我们如何使用Plotly创建地图来可视化Github用户的位置吗?我们可以使用Foliumimportfolium#Loaddatalocation_df=dp.Blob.get(name='location_df',owner='khuyentran1401').download_df()#Savelatitudes,longitudes,andlocations'namesinalistlats=location_df['latitude']使地图看起来更好lons=location_df['longitude']names=location_df['location']#Createamapwithinitiallocationm=folium.Map(location=[lats[0],lons[0]])forlat,lon,nameinzip(lats,lons,names):#Createmarkerwithotherlocationsfolium.Marker(location=[lat,lon],popup=name,icon=folium.Icon(color='green')).add_to(m)m最初位于纽约布鲁克林。缩小以查看地图上的其他位置。通过几行代码,我们创建了一个显示用户位置的真实地图。2.添加潜在位置如果我们想为其他用户添加潜在位置,Folium可以通过允许用户添加标记来使其更容易#Codetogeneratemahere#....#Enableaddingmorelocationsinthemapm=m.add_child(folium.ClickForMarker(popup='PotentialLocation'))在地图上单击以查看您单击的新位置。3.插件Folium有许多可以与地图一起使用的插件,包括Altair的。如果我们想看一张全球Github用户总星数的热图,找出哪里有很多Github用户,总星数最高呢?Folium插件中的热图允许您这样做。fromfolium.pluginsimportHeatMapm=folium.Map(location=[lats[0],lons[0]])HeatMap(data=location_df[['latitude','longitude','total_stars']]).add_to(m)缩小到查看完整的热图。简介:Folium允许您使用几行代码创建交互式地图。它为您提供接近谷歌地图的体验。结论恭喜!您刚刚了解了六种不同的可视化可视化工具。我希望这篇文章能让您了解每个库的作用以及何时使用它们。了解每个库的关键功能将使您能够更快地提取满足您需要的正确库。如果您仍然对使用哪个库来处理数据感到困惑,请选择一个您认为足够好的库。然后,如果代码太长或图形看起来不像您预期??的那样好,请尝试另一个库!