我在Python和Bokeh技术方面相对较新。我的目标实际上是能够在浏览器中显示包含数百万个点(例如约500万个)的折线图。我认为实际的浏览器无法处理如此大量的数据。这就是为什么我要尝试实施下采样算法以根据用户缩放来调整点数的原因。
散景技术似乎是我需要的技术。确实,我在YouTube上观看了以下视频,该视频提供了一个效果很好的下采样示例:https : //www.youtube.com/watch?v=kPknmEwQ3Rc
这就是我要为我的项目实施的。因此,我在Bokeh网站上阅读了很多《用户指南》,但“下采样”部分是空的,文档似乎并不完整:http://docs.bokeh.org/en/0.10.0/docs/user_guide /server.html#downsampling-with-server
我在GitHub等互联网上阅读了一些帖子,有人谈论了使用进行下采样的Bokeh示例bokeh-server。不幸的是,我无法在Internet上恢复任何此类示例。我发现的所有链接均无效。这就是为什么我在这里发布。我想知道是否有人会使用Bokeh或共享链接进行下采样的工作项目。
先感谢您 !
我有一个由几个可观察量的时间序列组成的数据集,我想使用散景来查看时间序列中不同点的相图.我想知道的是如何更改所选或未选定字形的属性(在这种情况下,我想减少未选择点的alpha或更改所选字符的颜色).
下面的代码在ipython笔记本中创建了我想要的界面,并基于用户指南中的示例http://bokeh.pydata.org/en/0.10.0/docs/user_guide/interaction.html#linked-brushing.我找不到任何明显的选项设置,我真的宁愿不必为这一件事学习javascript.
import numpy as np
from pandas import DataFrame
from bokeh.plotting import figure, output_notebook, show, gridplot
from bokeh.models import ColumnDataSource, widgets
def znzt_ts():#, plot_antisym=False, **kwargs):
t = np.arange(1000)
Eu = np.sin(t * np.pi/10) + np.random.random(1000)
Ez = np.cos(t * np.pi/10) + np.random.random(1000)
ts = DataFrame({'t': t, 'Eu': Eu, 'Ez': Ez})
tools = 'box_zoom,pan,reset,save,box_select'
source = ColumnDataSource(data=ts)
original_source = ColumnDataSource(data=ts)
p1 = figure(plot_width=300, plot_height=300,
tools=tools)
p2 = figure(plot_width=300, plot_height=300, tools=tools,)
p1.circle('t', 'Eu', source=source, size=1)
p2.circle('Eu', 'Ez', …Run Code Online (Sandbox Code Playgroud) 我正在评估Bokeh是否已准备好进行更广泛的使用.我已经绘制了两列数据帧(最后的代码),"关闭"和"调整关闭".

我想放入复选框来切换图中两个折线图的显示.因此,如果未选中相关复选框,则不会显示该行.http://bokeh.pydata.org/en/latest/docs/user_guide/interaction.html上的Bokeh文档确实讨论了复选框组,但未提供明确的工作示例.感谢任何有助于获取数据框列的复选框的帮助.
import pandas as pd
from bokeh.plotting import figure, output_file, show
IBM = pd.read_csv(
"http://ichart.yahoo.com/table.csv?s=IBM&a=0&b=1&c=2011&d=0&e=1&f=2016",
parse_dates=['Date'])
output_file("datetime.html")
p = figure(width=500, height=250, x_axis_type="datetime")
p.line(IBM['Date'], IBM['Close'], color='navy', alpha=0.5)
p.line(IBM['Date'], IBM['Adj Close'], color='red', alpha=0.5)
show(p)
Run Code Online (Sandbox Code Playgroud) 我是django和bokeh的新手。我试图渲染一个简单的散景图,该图由几个选择选项支持,这些选项实际上使我可以在django Web应用程序中调整图的内容。
当从中获得的script和div元素bokeh.embed.components()作为上下文变量传递到模板时,将绘制图。当我在一个bokeh.io.vform对象中拥有一个小部件和一个图时,这是行不通的。
bokeh.io.show()通过指定bokeh.plotting.output_file(),在执行时我得到正确的输出,但是我试图在我的Web应用程序中运行它。我有什么想念的吗?还是有其他方法符合我的意图?
我的仅渲染bokeh小部件的代码如下:
views.py
#django imports
from bokeh.embed import components
from bokeh.plotting import figure
from bokeh.io import vform
from bokeh.models.widgets import Select
def test(request):
s = Select(title="test", value="a", options=['a','b','c'])
script,div = components(s)
return render(request,'test.html',RequestContext(request,{'script':script,'div':div}))
Run Code Online (Sandbox Code Playgroud)
test.html
<html>
<head>
<link href="http://cdn.bokeh.org/bokeh/release/bokeh-0.11.1.min.css" rel="stylesheet" type="text/css">
<script src="http://cdn.bokeh.org/bokeh/release/bokeh-0.11.1.min.js"></script>
</head>
{% load staticfiles %}
<body>
{{ div | safe }}
{{ script | safe }}
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我希望从Django的test()启动test.html时会呈现一个选择表单元素。但不会发生。
我使用Bokeh包生成地图以显示模拟结果.输出是具有交互性的html格式的单独地图.各个地图需要交互性.
请参阅此链接以获取示例:
http://bokeh.pydata.org/en/0.10.0/docs/gallery/texas.html
模拟可以自动设置为运行多次,并为每次运行生成一个映射.这可能是100的地图.我希望能够将地图拼接在一起以创建电影 - 这不需要交互性.Bokeh具有通过浏览器创建PNG文件的功能,因此可以手动将每个地图保存为文件,并使用ffmpeg创建电影.但是,如果你需要为100个文件做这个,那么这不是一个真正的选择.目前没有办法通过Bokeh自动生成PNG文件,但我相信它会在某些时候添加.
所以我需要一个解决方法.我的想法是从他们存储在本地驱动器上的位置打开每个html文件,拍摄屏幕截图,裁剪图像以保留所需的部分并保存.但我还没有找到一个有效的解决方案.
裁剪图像很简单:
from PIL import Image
img = Image.open(file_name)
box = (1, 1, 1000, 1000)
area = img.crop(box)
area.save('saved_image', 'jpeg')
Run Code Online (Sandbox Code Playgroud)
我的问题是打开html文件并首先拍摄屏幕截图以提供上述代码.
为此我尝试了以下内容,但都需要URL而不是html文件.另外两个都使用Firefox不适合我,但我已经安装了chrome并适当地修改了代码.
如何在python中使用Selenium WebDriver进行部分截图?
http://www.idiotinside.com/2015/10/20/take-screenshot-selenium-python/
我的代码是:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('file_name')
driver.save_screenshot('image.png')
driver.quit()
Run Code Online (Sandbox Code Playgroud)
哪个回报:
{"code":-32603,"message":"Cannot navigate to invalid URL"}
Run Code Online (Sandbox Code Playgroud)
显然,文件名不是网址,因此很清楚.如果你把它传递给一个网站,它的工作正常.获取html加载和拍照的任何帮助将不胜感激!它不必涉及Selenium.
我有以下代码来从NetworkX制作散景图
p = figure(x_range=(-1.1, 1.1), y_range=(-1.1, 1.1))
p.grid.visible = False
p.axis.visible = False
graph_renderer = from_networkx(G, nx.spring_layout, random_state=11, center=(0, 0), scale=1, k=0.5)
color_map = factor_cmap('domain_cat', factors=factors, palette=Category10_6)
graph_renderer.node_renderer.glyph = Circle(radius=0.02, fill_color=color_map, line_color=None, fill_alpha=1)
graph_renderer.edge_renderer.glyph = MultiLine(line_color='lightgray', line_alpha=0.3, line_width=2)
p.renderers.append(graph_renderer)
p.add_tools(HoverTool(tooltips='@index', show_arrow=None))
show(p)
Run Code Online (Sandbox Code Playgroud)
效果很好。但是,我为节点有一个分类颜色图。我想添加一个图例。
使用绘图界面时,只需输入源列名称(https://docs.bokeh.org/en/latest/docs/user_guide/categorical.html#colors),即可轻松添加分类图例。
但是,即使通过模型接口,我也无法使用分类图例Legend和LegendItem来生成方法。
我尝试了以下形式:
items = [LegendItem(label=factor, renderers=[graph_renderer.node_renderer]) for factor in factors]
legend = Legend(items=items)
p.add_layout(legend)
Run Code Online (Sandbox Code Playgroud)
但这会产生以下结果,其中的空白图例表示正确的高度,而控制台错误为TypeError: v is undefined; can't access its "draw_legend" property。
我期待得到Flask返回的简单线散景图,但是当我浏览到localhost时我得到的是:5002/simpleline是这样的:
('','')
我有两个文件.Python文件:
from bokeh.plotting import figure, show, output_file
from bokeh.embed import components
from flask import Flask, render_template
app=Flask(__name__)
@app.route('/simpleline/')
def simpleLine():
fig=figure(title="Sensor data")
fig.line([1,2,3,4],[2,4,6,8])
div=components(fig)
return render_template('simpleline.html',div=div)
show(fig)
if __name__ == "__main__":
app.run(debug=True,port=5002)
Run Code Online (Sandbox Code Playgroud)
和HTML模板:
<!doctype html>
<html>
<head>
<title>Figure examples</title>
<link rel="stylesheet" href="http://cdn.bokeh.org/bokeh-0.7.1.min.css" type="text/css" />
<script type="text/javascript"src="http://cdn.bokeh.org/bokeh-0.7.1.min.js"></script>
</head>
<body>
<div class='bokeh'>
{{ div|safe }}
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我相信我错过了一些必不可少的东西.
在mn的回答之后,发现它components()产生了两个元素,一个Javascript字符串和一个html div.所以,我更新了我的脚本如下,但这次网页显示为空白.
from bokeh.plotting import figure, show, output_file
from bokeh.embed import components
from flask import Flask, render_template
app=Flask(__name__)
@app.route('/simpleline/') …Run Code Online (Sandbox Code Playgroud) 我试图在我的django应用程序中嵌入散景图.我按照Bokeh网站上的说明和另一个问题.
我在浏览器控制台上收到以下错误,没有获得任何绘图输出:
Uncaught TypeError: Bokeh.safely is not a function
at HTMLDocument.fn (localhost/:15)
Run Code Online (Sandbox Code Playgroud)
我不是一个JS人,但Bokeh.safely存在于Bokeh生成的脚本中.我附上了最后生成的脚本:
我的views.py文件:
from django.shortcuts import render
from bokeh.plotting import figure
from bokeh.resources import CDN
from bokeh.embed import components
def showGraph(request):
arr = [1,4,9,16,25,36]
y = [1,2,3,4,5,6]
plot = figure()
plot.line(arr, y)
script, div = components(plot, CDN)
return render(request, "data_collection/simple_chart.html", {"script": script, "div": div})
Run Code Online (Sandbox Code Playgroud)
simplechart.html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Bokeh example</title>
<link rel="stylesheet" href="http://cdn.bokeh.org/bokeh/release/bokeh-0.12.0.min.css">
<link rel="stylesheet" href="http://cdn.bokeh.org/bokeh/release/bokeh-widgets-0.12.0.min.css">
<script src="http://cdn.bokeh.org/bokeh/release/bokeh-0.12.0.min.js"></script>
<script src="http://cdn.bokeh.org/bokeh/release/bokeh-widgets-0.12.0.min.js"></script>
{{ …Run Code Online (Sandbox Code Playgroud) 我在散景中创建了一个图形,其中 X 和 Y 轴标签显示纬度和经度坐标,但使用 WMTS 平铺地图,当然使用墨卡托投影。我认为 Bokeh 进行了某种转换,因为在他们的文档中他们说:
“另请注意,传递 x_axis_type="mercator" 和 y_axis_type="mercator" 来生成带有纬度和经度标签的轴,而不是原始的 Web 墨卡托坐标”(https://docs.bokeh.org/en/latest/docs/用户指南/geo.html)
然而,当我绘制由 LAT 和 LON 设置的标记时,它们会忽略 X 和 Y 轴比例,而是根据墨卡托比例进行绘制
title = "test"
mercator_extent = dict(start=-20000000, end=20000000,bounds=None)
# create a tile source
tile_options = {}
tile_options['url'] = 'http://tile.stamen.com/watercolor/{z}/{x}/{y}.jpg'
tile_options['attribution'] = """
Map tiles by <a href="http://stamen.com">Stamen Design</a>, under
<a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a>.
Data by <a href="http://openstreetmap.org">OpenStreetMap</a>,
under <a href="http://www.openstreetmap.org/copyright">ODbL</a>.
"""
mq_tile_source = WMTSTileSource(**tile_options)
source = ColumnDataSource(data=OrderedDict(lat=([50]), lon=([50])))
x_range= Range1d(**mercator_extent)
y_range= Range1d(**mercator_extent)
plot = …Run Code Online (Sandbox Code Playgroud) 我已经安装了bokeh并从官方页面(http://bokeh.pydata.org/en/latest/docs/user_guide/server.html)下载了myapp.py,如下所示.
# myapp.py
from random import random
from bokeh.layouts import column
from bokeh.models import Button
from bokeh.palettes import RdYlBu3
from bokeh.plotting import figure, curdoc
# create a plot and style its properties
p = figure(x_range=(0, 100), y_range=(0, 100), toolbar_location=None)
p.border_fill_color = 'black'
p.background_fill_color = 'black'
p.outline_line_color = None
p.grid.grid_line_color = None
# add a text renderer to our plot (no data yet)
r = p.text(x=[], y=[], text=[], text_color=[], text_font_size="20pt",
text_baseline="middle", text_align="center")
i = 0
ds = r.data_source
# …Run Code Online (Sandbox Code Playgroud)