首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Datashader canvas.line()别名

Datashader canvas.line()别名
EN

Stack Overflow用户
提问于 2018-01-14 21:20:50
回答 1查看 1.2K关注 0票数 4

我使用bokeh来绘制温度曲线,但在某些情况下,数据集相当大(> 500k测量值),并且我使用bokeh (output_backend=“webgl”事件)的用户体验很迟缓。因此,我正在试验数据着色器,以获得更快的渲染速度和更流畅的用户体验。

但数据着色器给出的可视化结果不如bokeh的结果漂亮,数据着色器结果有混叠现象:

我使用以下代码获得此并列比较:

代码语言:javascript
复制
import pandas as pd
import datashader as ds
import datashader.transfer_functions as tf
from bokeh.plotting import figure
from bokeh.io import output_notebook, show
from bokeh.models import ColumnDataSource
from bokeh.layouts import row
import numpy as np

output_notebook()

# generate signal
n = 2000
start = 0
end = 70
signal = [np.sin(x) for x in np.arange(start, end, step=(end-start)/n)]
signal = pd.DataFrame(signal, columns=["signal"])
signal = signal.reset_index()

# create a bokeh plot
source = ColumnDataSource(signal)
p = figure(plot_height=300, plot_width=400, title="bokeh plot")
p.line(source=source, x="index", y="signal")

# create a datashader image and put it in a bokeh plot
x_range = (signal["index"].min(), signal["index"].max())
y_range = (signal["signal"].min(), signal["signal"].max())
cvs = ds.Canvas(x_range=x_range, y_range=y_range, plot_height=300, plot_width=400)
agg = cvs.line(signal, 'index', 'signal')
img = tf.shade(agg)
image_source = ColumnDataSource(data=dict(image = [img.data]))
q = figure(x_range=x_range, y_range=y_range, plot_height=300, plot_width=400, title="datashader + bokeh")
q.image_rgba(source = image_source,
             image="image",
             dh=(y_range[1] - y_range[0]),
             dw=(x_range[1] - x_range[0]),
             x=x_range[0],
             y=y_range[0],
             dilate=False)

# visualize both plot, bokeh on left
show(row(p, q))

你知道如何修复这种锯齿并获得平滑的结果吗?(与bokeh的结果类似)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-16 03:05:21

以下是您的代码的可运行版本,在Jupyter笔记本中使用HoloViews:

代码语言:javascript
复制
import pandas as pd, numpy as np, holoviews as hv
from holoviews.operation.datashader import datashade, dynspread
hv.extension("bokeh")
%opts Curve RGB [width=400]
n, start, end = 2000, 0, 70
sine = [np.sin(x) for x in np.arange(start, end, step=(end-start)/n)]
signal = pd.DataFrame(sine, columns=["signal"]).reset_index()
curve = hv.Curve(signal)

curve + datashade(curve)

确实,这里的数据着色输出看起来不是很好。datashader的时间序列支持,就像datashader的其余部分一样,旨在允许在栅格网格上对大量数学上完美(即无限细)的曲线进行精确的累积和求和,以便每条曲线上的每个x位置都将落入网格中的一个且仅有一个y位置。在这里,你似乎只是想要一个大型时间序列的服务器端渲染,这需要网格中多个附近的bin的部分递增,而还不是datashader优化的东西。

你可以做的一件事是以高分辨率渲染曲线,然后“扩展”它,这样每个非零像素也会显示在相邻的像素中:

代码语言:javascript
复制
curve + dynspread(datashade(curve, height=1200, width=1200, dynamic=False, \
                            cmap=["#30a2da"]), max_px=3, threshold=1)

这里我将颜色设置为与Bokeh的默认颜色匹配,然后强制HoloView的“动态扩展”函数扩展3个像素。使用与您的版本相同的Datashader+Bokeh,您将执行img = tf.spread(tf.shade(agg),px=3)`,并在画布调用中增加绘图大小以获得类似的结果。

我没有尝试过对tf.shade()或tf.spread()的结果运行一个简单的平滑过滤器,但这两个都只返回RGB图像,所以像这样的过滤器可能会得到很好的结果。

真正的解决方案是为数据着色器实现一个可选的抗锯齿线条绘制函数,该函数在首先绘制线条时操作,而不是稍后修复像素,但这需要一些工作。欢迎投稿!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48249986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档