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

使用Bokeh为您的Python绘图添加交互性

时间:2023-03-14 21:56:37 科技观察

在Bokeh中绘图比其他一些绘图库要复杂一些,但额外的努力是有回报的。在本系列文章中,我通过在每个Python绘图库中绘制相同的多条图来研究不同Python绘图库的特性。这次我专注于散景(发音为“BOE-kay”)。在Bokeh中绘图比其他一些绘图库复杂一点,但额外的努力是有回报的。Bokeh旨在让您在网络上创建自己的交互式图表,同时让您详细控制交互性的工作方式。我将通过向我在整个系列中使用的多条形图表添加工具提示来展示这一点。它绘制了1966年至2020年英国大选结果的数据。放大图(?2019Anvil)制作多个条形图在我们继续之前,请注意您可能需要调整Python环境才能使此代码正常工作,包括以下:运行最新版本的Python(在Linux、Mac上和Windows上的说明)以确保您运行的Python版本适用于这些库。数据可在线获取,并可使用Pandas导入。importpandasaspddf=pd.read_csv('https://anvil.works/blog/img/plotting-in-python/uk-election-results.csv')现在我们可以继续了。为了制作多条形图,您需要对数据进行一些调整。原始数据是这样的:>>print(long)yearpartyseats01966Conservative25311970Conservative3302Feb1974Conservative2973Oct1974Conservative27741979Conservative339........1032005Others5301042010Other2015Others801062017Others591072019Others72[60rowsx3columns]你可以把数据看成是每一个可能的(年份,政党)组合的一系列席位值。这正是Bokeh处理它的方式。你需要制作一个(year,party)元组列表:#获取每个可能的(year,party)组合的元组x=[(str(r[1]['year']),r[1]['party'])forrindf.iterrows()]#结果为[('1922','Conservative'),('1923','Conservative'),...('2019','Others')]这些将是x值。y值是座位。y=df['seats']现在您的数据应如下所示:xy('1966','Conservative')253('1970','Conservative')330('Feb1974','Conservative')297('1974年10月','保守党')277('1979','保守党')339.........('2005','其他')30('2010','其他')29('2015','Others')80('2017','Others')59('2019','Others')72Bokeh需要您将数据包装在它提供的一些对象中,以便它可以为您提供交互功能。将x和y数据结构包装在ColumnDataSource对象中。frombokeh.modelsimportColumnDataSourcesource=ColumnDataSource(data={'x':x,'y':y})然后构造一个Figure对象,传入你用FactorRange对象封装的x数据。frombokeh.plottingimportfigurefrombokeh.modelsimportFactorRangep=figure(x_range=FactorRange(*x),width=2000,title="Electionresults")你需要让Bokeh创建一个颜色表,这是一个特殊的DataSpec字典,它是根据你给它的颜色图生成的。在这种情况下,颜色图是派对名称和十六进制值之间的简单映射。frombokeh.transformimportfactor_cmapcmap={'Conservative':'#0343df','Labour':'#e50000','Liberal':'#ffff14','Others':'#929591',}fill_color=factor_cmap('x',palette=list(cmap.values()),factors=list(cmap.keys()),start=1,end=2)现在你可以创建条形图了:p.vbar(x='x',top='y',width=0.9,source=source,fill_color=fill_color,line_color=fill_color)Bokeh图表上数据的可视化称为“字形”,因此您创建了一组条形字形。调整图表的细节,使其看起来像您想要的样子。p.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最后,告诉Bokeh你现在想看你的情节:从bokeh.ioimportshowshow(p)这会将绘图写入HTML文件并在默认网络浏览器中打开它。结果如下:Bokeh中的多条绘图(?2019Anvil)它已经具有一些交互式功能,例如框缩放。Bokeh具有内置的框缩放(?2019Anvil),但Bokeh的优点在于您可以添加自己的交互性。在下一节中,我们将通过向条形图添加工具提示来探讨这个问题。向条形图添加工具提示要向条形图添加工具提示,您只需创建一个HoverTool对象并将其添加到绘图中。h=HoverTool(tooltips=[('Seats','@y'),('(Year,Party)','(@x)')])p.add_tools(h)参数定义将显示哪些数据在工具提示上。变量@y和@x指的是您传递给ColumnDataSource的变量。您还可以使用其他一些值。例如,光标在图上的位置由$x和$y给出(与@x和@y无关)。结果如下:选举图,现在带有工具提示(?2019Anvil)使用Bokeh的HTML输出,您可以在将图嵌入Web应用程序时获得完整的交互式体验。您可以在此处将此示例复制为Anvil应用程序(注意:Anvil需要注册才能使用)。现在,您可以看到在Bokeh中付出额外努力将所有数据封装在ColumnDataSource等对象中的原因。作为回报,您可以相对轻松地添加交互性。回归简单:AltairBokeh是四个最流行的图形库之一,本系列将探讨是什么让每个图形库与众不同。我还在研究一些以其有趣的方法脱颖而出的库。接下来,我将看看Altair,它的声明式API意味着它可以绘制非常复杂的图而不会让您头疼。