Plotly是一个数据绘图库,具有简洁的界面,旨在让您构建自己的API。Plotly是一个绘图生态系统,可让您使用Python以及JavaScript和R进行绘图。在本文中,我将重点介绍使用Python库进行绘图。Plotly具有三种不同的PythonAPI,您可以选择以不同的方式使用它们:一个类似于Matplotlib的面向对象的API一个数据驱动的API,它通过构建类似JSON的数据结构来定义绘图一个类似于Seaborn的高级绘图接口,称为对于“PlotlyExpress”API,我将通过使用它们绘制相同的图来探索每个API:英国大选结果的分组直方图。在我们继续之前,请注意您可能需要调整您的Python环境才能使此代码工作,包括以下内容:运行最新版本的Python(Linux、Mac和Windows的说明)与这些库一起工作的Python。数据可在线获取,并可使用Pandas导入。importpandasaspddf=pd.read_csv('https://anvil.works/blog/img/plotting-in-python/uk-election-results.csv')现在我们可以继续了。使用图对象绘制图Plotly的面向对象API叫做graph_objects,有点类似于Matplotlib的面向对象API。要创建直方图,您可以构造一个包含四个直方图的对象:#importPlotlyanddataimportplotly.graph_objectsasgofromvotesimportwideasdf#getlistofxyears=df['year']x=list(range(len(years)))#Definedrawingbar_plots=[go.Bar(x=x,y=df['conservative'],name='Conservative',marker=go.bar.Marker(color='#0343df')),go.Bar(x=x,y=df['labour'],name='Labour',marker=go.bar.Marker(color='#e50000')),go.Bar(x=x,y=df['liberal'],name='Liberal',marker=go.bar.Marker(color='#ffff14')),go.Bar(x=x,y=df['others'],name='Others',marker=go.bar.Marker(color='#929591')),]#指定样式layout=go.Layout(title=go.layout.Title(text="选举结果",x=0.5),yaxis_title="Seats",xaxis_tickmode="array",xaxis_tickvals=list(range(27)),xaxis_ticktext=tuple(df['year'].values),)#绘制直方图fig=go.Figure(data=bar_plots,layout=layout)#告诉Plotly渲染fig.show()不像Matplotlib,不需要手动计算fig.show()的x轴位置直方图,Plotly将帮助您适应。最终结果图:使用图形对象制作的多条图(?2019Anvil)使用Python数据结构进行绘图您还可以使用Python原始数据结构定义图,其结构与面向对象的API相同。这直接对应于Plotly的JavaScript实现的JSONAPI。#定义绘图数据fig={'data':[{'type':'bar','x':x,'y':df['conservative'],'name':'Conservative','marker':{'color':'#0343df'}},{'type':'bar','x':x,'y':df['labour'],'name':'Labour','marker':{'color':'#e50000'}},{'type':'bar','x':x,'y':df['liberal'],'name':'Liberal','marker':{'color':'#ffff14'}},{'type':'bar','x':x,'y':df['others'],'name':'Others','marker':{'color':'#929591'}},],'layout':{'title':{'text':'选举结果','x':0.5},'yaxis':{'title':'Seats'},'xaxis':{'tickmode':'array','tickvals':list(range(27)),'ticktext':tuple(df['year'].values),}}}#告诉Plotly渲染它pio.show(fig)最终结果和上次完全一样:Amulti-barplotmadeusingJSON-likedatastructures(?2019Anvil)UsePlotlyExpressforplotlyPlotlyExpressisahigh-levelAPI封装图形对象。您可以使用一行代码来绘制直方图:#importPlotlyanddataimportplotly.expressaspxfromvotesimportlongasdf#定义颜色字典以获取自定义条形图颜色cmap={'Conservative':'#0343df','Labour':'#e50000','Liberal':'#ffff14','Others':'#929591',}#generatefigurefig=px.bar(df,x="year",y="seats",color="party",barmode="group",color_discrete_map=cmap)这里使用的是长格式数据,也称为“整洁数据”。这些列代表年份、政党和席位,而不是政党。这与在Seaborn中制作直方图非常相似。>>打印(长)年党席位01922保守党34411923保守党25821924保守党41231929保守党26041931保守党470...........1032005其他301042010其他291052015其他80106209190其他72[108行x3列]您可以访问底层图形对象API进行详细调整。比如添加标题和y轴标签:#使用图形对象API调整绘图importplotly.graph_objectsasgofig.layout=go.Layout(title=go.layout.Title(text="Electionresults",x=0.5),yaxis_title="Seats",)最后,让Plotly渲染:fig.show()这将在一个未使用的端口上运行一个临时的网络服务器,并打开默认的网络浏览器来查看图像(网络服务器将被关闭立即地)。不幸的是,结果并不完美。x轴被视为整数,因此两组之间的距离又远又小,很难看出趋势。使用PlotlyExpress制作的多条形图(?2019Anvil)您可能会尝试通过将x值转换为字符串来让PlotlyExpress将x值视为字符串,这样它就会以均匀的间距和词法顺序绘制。不幸的是,它们仍然相距很远,并且像在graph_objects中那样设置xaxis_tickvals也不起作用。与Seaborn中的类似示例不同,在这种情况下,抽象似乎没有提供足够的解决方法来提供您想要的东西,但也许您可以编写自己的API?构建您自己的PlotlyAPI对Plotly的操作方式不满意?然后构建您自己的PlotlyAPI!Plotly的核心是一个使用D3和stack.gl进行绘图的JavaScript库。JavaScript库的接口使用指定的JSON结构进行绘图。所以,你只需要输出JavaScript库喜欢使用的JSON结构。Anvil这样做是为了创建一个完全在浏览器中运行的PythonPlotlyAPI。Plotly使用JavaScript库创建绘图,由其他语言的库通过JSON驱动(?2019Anvil)在Anvil版本中,您可以同时使用图形对象API和上面介绍的Python数据结构方法。运行完全相同的命令,将数据和布局分配给Anvil应用程序中的Plot组件。这是一个用Anvil的客户端PythonAPI绘制的多列直方图:classEntrypoint(EntrypointTemplate):def__init__(self,**properties):#设置表单属性和数据绑定。self.init_components(**properties)#从服务器获取数据data=anvil.server.call('get_election_data')#获取一个x值的便捷列表years=data['year']x=list(range(len(years)))#定义绘图bar_plots=[go.Bar(x=x,y=data['conservative'],name='Conservative',marker=go.Marker(color='#0343df')),go.Bar(x=x,y=data['labour'],name='Labour',marker=go.Marker(color='#e50000')),go.Bar(x=x,y=data['liberal'],name='Liberal',marker=go.Marker(color='#ffff14')),go.Bar(x=x,y=data['others'],name='Others',marker=go.Marker(color='#929591')),]#指定布局layout={'title':'Electionresults','yaxis':{'title':'Seats'},'xaxis':{'tickmode':'数组','tickvals':list(range(27)),'ticktext':data['year'],},}#生成多列直方图self.plot_1.data=bar_plotsself.plot_1.layout=布局绘制逻辑及以上相同,但它完全在网络浏览器中运行,绘图由用户计算机上的PlotlyJavaScript库完成!与本系列中的所有其他Python绘图库相比,这是一个很大的优势,因为它们都需要在服务器上运行。这是在Anvil应用程序中运行的交互式Plotly绘图:使用Anvil的客户端PythonPlotly库在网络上绘制选举图(?2019Anvil)您可以将此示例复制为Anvil应用程序(注意:Anvil需要注册才能使用)。在前端运行Plotly还有一个好处:它为自定义交互行为提供了更多选项。Plotly中的自定义交互Plotly绘图不仅是动态的,您还可以自定义它们的交互行为。例如,您可以使用hovertemplate自定义每个条形图中工具提示的格式:go.Bar(x=x,y=df['others'],name='others',marker=go.bar.Marker(color='#929591'),hovertemplate='Seats:%{y}',),将此应用到每个条形图时,您将看到以下结果:多条形图带有自定义工具提示(?2019Anvil)这很有用,当您想在某些事件发生时执行您想要的任何代码时(例如,当用户将鼠标悬停在栏上时,您想显示有关选举的信息框).在Anvil的Plotly库中,您可以将事件处理程序绑定到悬停等事件,从而实现复杂的交互。带有悬停事件处理程序的多条图(?2019Anvil)您可以通过将方法绑定到图的悬停事件来实现此目的:defplot_1_hover(self,points,**event_args):"""当数据出现时调用此方法点悬停。"""i=points[0]['point_number']self.label_year.text=self.data['year'][i]self.label_con.text=self.data['conservative'][i]self.label_lab.text=self.data['labour'][i]self.label_lib.text=self.data['liberal'][i]self.label_oth.text=self.data['others'][i]url=f"https://en.wikipedia.org/wiki/{self.data['year'][i]}_United_Kingdom_general_election"self.link_more_info.text=urlself.link_more_info.url=url这是一个交互性非常高,从开发人员的角度来看,可定制性也非常高。这一切都要归功于Plotly的架构——它有一个干净的界面,明确设计用于让您构建自己的API。如果这个伟大的设计随处可见,那将会很有帮助!与Bokeh的自定义交互现在您已经了解了Plotly如何使用JavaScript创建动态图,您可以使用Anvil的客户端编写Python代码以在浏览器中实时编辑它们。Bokeh是另一个Python绘图库,它可以输出可嵌入到Web应用程序中的HTML文档,并获得类似于Plotly提供的动态功能(“BOE-kay”,如果您想知道它的发音)。
