“HowtoplotinPython?”这个问题曾经有一个简单的答案:Matplotlib是唯一的方法。如今,Python作为数据科学的语言有了更多的选择。你应该使用哪个?本指南将帮助您做出决定。它将向您展示如何使用四个最流行的Python绘图库:Matplotlib、Seaborn、Plotly和Bokeh,以及两个值得考虑的优秀后起之秀:Altair,具有丰富的API;Pygal,具有漂亮的SVG输出。我还会看一下Pandas提供的非常方便的绘图API。对于每个库,我都包含了源代码片段,以及一个使用Anvil的完整的基于Web的示例。Anvil是我们构建Web应用程序的平台,除了Python之外什么都不做。让我们来看看。示例图每个库都采用略有不同的方法来绘制数据。为了比较它们,我将用每个库绘制相同的图表并向您展示源代码。例如数据,我选择了这个自1966年以来的英国大选结果的分组柱状图。英国选举数据的条形图我从维基百科整理了一个英国选举历史的数据集:保守党、工党和自由党赢得的英国议会席位数量(广义)在每次选举中,从1966年到2019年,加上“其他”赢得的席位数量。您可以将其下载为CSV文件。MatplotlibMatplotlib是最古老的Python绘图库,并且仍然是最受欢迎的。它创建于2003年,是SciPyStack的一部分,SciPyStack是一个类似于Matlab的开源科学计算库。Matplotlib可让您精确控制绘图。例如,您可以为条形图中的每个条形定义单独的X位置。这是绘制此图的代码(您可以在此处运行):(len(years))#Ploteachbarplot.注意:手动计算thebarsax.bar的'闪避'(x-3*width/2,df['conservative'],width,label='Conservative',color='#0343df')斧头。bar(x-width/2,df['labour'],width,label='Labour',color='#e50000')ax.bar(x+width/2,df['liberal'],width,label='Liberal',color='#ffff14')ax.bar(x+3*width/2,df['others'],width,label='Others',color='#929591')#Customisesomedisplaypropertiesax.set_ylabel('席位')ax.set_title('UKelectionresults')ax.set_xticks(x)#Thisensureswehaveonetickperyear,otherwisewegetfewerax.set_xticklabels(years.astype(str).values,rotation='vertical')ax.legend()#AskMatplotlibtoshowtheplotplt.show()以下是用Matplotlib绘制的选举结果:它提供了一个非常简洁的界面,让你很容易但是,在不影响功率的情况下制作各种有用的图!Seaborn提供了一个逃生通道来访问底层的Matplotlib对象,因此您仍然拥有完全的控制权。Seaborn的代码比原来的Matplotlib更简单(在这里工作):party",palette=['blue','red','yellow','grey'],saturation=0.6)#Customisesomedisplaypropertiesax.set_title('UKelectionresults')ax.grid(color='#cccccc')ax.set_ylabel('Seats')ax.set_xlabel(None)ax.set_xticklabels(df["year"].unique().astype(str),rotation='vertical')#AskMatplotlibtoshowitplt.show()并生成这样的图表:Seabornplot英国选举数据PlotlyPlotly是一个包含Python绘图库的绘图生态系统。它具有三种不同的接口:面向对象的接口。一个命令式接口,允许您使用类似JSON的数据结构指定您的绘图。类似于Seaborn的高级接口,称为PlotlyExpress。Plotly绘图旨在嵌入到Web应用程序中。Plotly的核心实际上是一个JavaScript库!它使用D3和stack.gl绘制图表。您可以通过将JSON传递给此JavaScript库来构建其他语言的Plotly库。官方Python和R库就是这样做的。在Anvil,我们移植了PythonPlotlyAPI以在网络浏览器中运行。这是使用Plotly的源代码(您可以在这里运行):=x,y=df['保守'],name='保守',marker=go.bar.Marker(color='#0343df')),go.Bar(xx=x,y=df['劳动'],name='Labour',marker=go.bar.Marker(color='#e50000')),go.Bar(xx=x,y=df['liberal'],name='Liberal',marker=go.bar.Marker(color='#ffff14')),go.Bar(xx=x,y=df['others'],name='Others',marker=go.bar.Marker(color='#929591')),]#Customisesomedisplaypropertieslayout=go.Layout(title=go.layout.Title(text="Electionresults",x=0.5),yaxis_title="席位",xaxis_tickmode="array",xaxis_tickvals=list(range(27)),xaxis_ticktext=tuple(df['year'].values),)#Makethemulti-barplotfig=go.Figure(data=bar_plots,layoutlayout=layout)#TellPlotlytorenderitfig.show()散景散景(发音为“BOE-kay")擅长构建交互式情节,所以这个标准示例并没有真正带来它尽其所能。与Plotly一样,Bokeh的绘图旨在嵌入到Web应用程序中,并将绘图输出为HTML文件。下面是使用Bokeh的代码(你可以在这里运行):frombokeh.ioimportshow,output_filefrombokeh.modelsimportColumnDataSource,FactorRange,HoverToolfrombokeh.plottingimportfiguresfrombokeh.transformimportfactor_cmapfromvotesimportlongasdf#Specifyafiletowritetheplottooutput_file")("Twritetheplottooutputs.html")("T(r[1]['year']),r[1]['party'])forrindf.iterrows()]y=df['seats']#Bokehwrapsyourdatainitsownobjectstosupportinteractivitysource=ColumnDataSource(data=dict(xx=x,yy=y))#Createacolourmapcmap={'保守党':'#0343df','工党':'#e50000','自由党':'#ffff14','其他':'#929591',}fill_color=factor_cmap('x',palette=list(cmap.values()),factors=list(cmap.keys()),start=1,end=2)#Maketheplotp=figure(x_range=FactorRange(*x),width=1200,title="Electionresults")p.vbar(x='x',top='y',width=0.9,sourcesource=source,fill_colorfill_color=fill_color,line_color=fill_color)#Customisesomedisplaypropertiesp.y_range.start=0p.x_range.range_padding=0.1p.yaxis.axis_label='Seats'p.xaxis.major_label_orientation=1p.xgrid.grid_line_color=None图表如下所示:英国选举数据的散景图AltairAltair基于一种称为Vega(或“视觉语法”)的声明性绘图语言,这意味着它有一个经过深思熟虑的API,可以很好地扩展复杂的绘图,让你不会迷失在嵌套循环的地狱中。与Bokeh一样,Altair将其图形输出为HTML文件。这是代码(您可以在此处运行):importaltairasaltfromvotesimportlongasdf#Setupthecolourmapcmap={'Conservative':'#0343df','Labour':'#e50000','Liberal':'#ffff14','Others':'#929591',}#Castyearstostringsdf['year']=df['year'].astype(str)#Here'swherewemaketheplotchart=alt.Chart(df).mark_bar().encode(x=alt.X('party',title=None),y='seats',column=alt.Column('year',sort=list(df['year']),title=None),color=alt.Color('派对',scale=alt.Scale(domain=list(cmap.keys()),range=list(cmap.values()))))#SaveitasanHTMLfile.chart.save('altair-elections.html')结果图表:Altairplotof英选数据PygalPygal侧重于视觉外观。它默认生成SVG图像,因此您可以无限缩放它们或打印它们而不会像素化。Pygalplots也有一些很好的内置交互功能,如果你想在你的web应用程序中嵌入plots,Pygal是另一个被低估的候选者。代码如下所示(您可以在此处运行):importpygalfrompygal.styleimportStylefromvotesimportwideasdf#Definethestylecustom_style=Style(colors=('#0343df','#e50000','#ffff14','#929591')font_family='Roboto,Helvetica,Arial,sans-serif',background='transparent',label_font_size=14,)#Setupthebarplot,readyfordatac=pygal.Bar(title="UKElectionResults",style=custom_style,y_title='Seats',width=1200,x_label_rotation=270,)#Addfourdatasetstothebarplotc.add('保守党',df['保守党'])c.add('工党',df['工党'])c.add('自由党',df['自由党'])c..add('Others',df['others'])#DefinetheX-labelssc.x_labels=df['year']#WritethistoanSVGfilec.render_to_file('pygal.svg')绘图结果:PygalplotofBritishelectiondataPandasPandasisPythonAn非常受欢迎的数据科学图书馆。它允许您进行各种可扩展的数据操作,但它也有一个方便的绘图API。因为是直接操作dataframes,所以Pandas示例是本文中最简洁的代码片段,甚至比Seaborn的代码还要短!PandasAPI是Matplotlib的包装器,因此您还可以使用底层的MatplotlibAPI来精细控制您的绘图。这是Pandas中的选举结果图。代码美观简洁!frommatplotlib.colorsimportListedColormapfromvotesimportwideasdfcmap=ListedColormap(['#0343df','#e50000','#ffff14','#929591'])ax=df.plot.bar(x='year',colormap=cmap)ax.set_xlabel(None)ax.set_ylabel('Seats')ax.set_title('UKelectionresults')plt.show()绘图结果:英国选举数据的Pandas图要运行此示例,请参见此处。以您的方式绘制Python提供了许多无需编写太多代码即可绘制数据的方法。虽然您可以使用这些方法快速开始创建绘图,但它们确实需要一些本地配置。如果您需要,Anvil可为Python开发提供完美的Web体验。玩得开心!
