如何最好地使用python创建简单,可交互和可共享的图?

时间:2019-02-15 09:13:36

标签: python matplotlib plotly data-visualization bokeh

我希望有人能指出我正确的方向。 python datavis的领域现在已经变得非常庞大,并且有太多的选择让我对实现此目标的最佳方法有些困惑。

我有一个xarray数据集(但它很容易是pandas数据框或numpy数组的列表)。

我有3列,分别是A,B和C。它们包含40个数据点。

我想绘制一个A与B +比例* C的散点图,其中比例由交互式滑块确定。

此版本的更高级版本将具有一个下拉列表,您可以在其中选择一组不同的3列,但稍后我会担心这一点。

所有这些的警告是,我希望它可以联机和交互以供其他人使用。

似乎有很多选择:

  • Jupyter(我不使用笔记本电脑,所以我不太熟悉它们,但是 使用mybinder,我认为这很容易做到)
  • 密谋
  • 散景服务器
  • pyviz.org(这是一个非常有趣的地方,但似乎 如何实现这一目标有很多选择)

任何想法或建议将不胜感激。

1 个答案:

答案 0 :(得分:2)

确实有很多选择,我不确定什么是最好的,但是我经常使用bokeh,对此我感到很高兴。以下示例可以帮助您入门。要启动此程序,请在保存脚本的目录中打开一个cmd,然后运行“ bokeh serve script.py --show --allow-websocket-origin = *”。

from bokeh.plotting import figure
from bokeh.io import curdoc
from bokeh.models.widgets import Slider
from bokeh.models import Row,ColumnDataSource

#create the starting data
x=[0,1,2,3,4,5,6,7,8]
y_noise=[1,2,2.5,3,3.5,6,5,7,8]
slope=1 #set the starting value of the slope
intercept=0 #set the line to go through 0, you can change this later
y= [slope*i + intercept  for i in x]#create the y data via a list comprehension

# create a plot
fig=figure() #create a figure
source=ColumnDataSource(dict(x=x, y=y)) #the data destined for the figure
fig.circle(x,y_noise)#add some datapoints to the plot
fig.line('x','y',source=source,color='red')#add a line to the figure

#create a slider and update the graph source data when it changes
def updateSlope(attrname, old, new):
    print(str(new)+" is the new slider value")
    y = [float(new)*i + intercept  for i in x]
    source.data = dict(x=x, y=y)   
slider = Slider(title="slope", value=slope, start=0.0, end=2.0,step=0.1)
slider.on_change('value', updateSlope)

layout=Row(fig,slider)#put figure and slider next to eachother
curdoc().add_root(layout)#serve it via "bokeh serve slider.py --show --allow-websocket-origin=*"

allow-websocket-origin = *是为了允许其他用户联系服务器并查看该图。 http为http://yourPCservername:5006/(5006是默认的bokeh端口)。如果您不希望通过PC进行服务,则可以订阅类似Heroku的云服务:example