☰Read-only archive⌕
Looking for help with Bokeh?

This is a read-only archive. Ask questions and join the conversation on GitHub.

Visit Community Support on GitHub →
Archived discussions · Captured October 28, 2026

Bokeh server really slow to render

Community Support
Laurens_Hagendoorn
Laurens_Hagendoorn

Hello, I am trying to build a bokeh dashboard and am currently stuck on my first tab.

image.png

The plot seen above renders just fine in my jupyter notebook (taking about a second). However, when I stick the same code (roughly) in a bokeh server, it is unbearably slow (multiple minutes).

I am making a lineplot with many lines, and a lot of them overlap (could be causing a rendering issue?)

I have grouped all these lines into 7 lines in total (as I have read it is better to draw fewer larger lines than more small ones).

A shortened example of the data looks like this:

xs = [np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,

np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,11.18082192, 12.02739726, 13.25205479, 14.22739726,np.nan,np.nan,np.nan, 6.55616438, 7.53150685, 8.52054795,

9.47123288, 10.44109589,np.nan]),

np.array([np.nan,np.nan,np.nan, 0.70410959, 1.63835616,

2.73972603, 3.64931507,np.nan,np.nan,np.nan,np.nan, 4.00821918, 5.04383562, 6.00821918, 7.05479452,

np.nan,np.nan,np.nan,np.nan, 4.56164384,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,11.18082192,np.nan,np.nan,np.nan,np.nan,np.nan, 5.94794521, 6.55616438, 7.53150685, 8.52054795,

np.nan,np.nan,np.nan])]

ys = [np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([ np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

-0.15652901, 0.14953203, 0.62195036, 0.64414847, np.nan,

np.nan, np.nan, -0.33739475, -0.27092199, -0.32020045,

-0.35019554, -0.21857558, np.nan]),

np.array([ np.nan, np.nan, np.nan, -0.42062806, -0.50175937,

-0.39375614, -0.45259168, np.nan, np.nan, np.nan,

np.nan, -0.38755729, -0.45590074, -0.38985249, -0.30375873,

np.nan, np.nan, np.nan, np.nan, -0.10799712,

np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

-0.15652901, np.nan, np.nan, np.nan, np.nan,

np.nan, -0.2219407 , -0.33739475, -0.27092199, -0.32020045,

np.nan, np.nan, np.nan])]

single_sources = [ColumnDataSource({‘x_line’: xs[i], ‘y_line’: ys[i]}) for i in range(7)]

``

As you can see the data contains a lot of nans, could this be the problem?

Finally I plot like this:

f = figure(toolbar_location=None, title=‘Planjaar alle wegen’)
f.xaxis.axis_label=‘Leeftijd’

f.yaxis.axis_label=‘PCA_1’

for i,col,lbl in zip(range(7),colors_pljr,labels):

r = f.line(x=‘x_line’, y=‘y_line’, alpha=0.5, line_width=2, source=single_sources[i], line_color=col, legend=lbl)

f.legend.location = “top_left”

f.legend.click_policy=“hide”

``

NOTE: this example actually plots just fine, it is only when I try to make the full 40,000+ line plot that the rendering becomes unbearably long (multiple minutes).

I have also added a CheckboxGroup. In the full plot it again can take a minute or more before the callback is actually called.

Could anybody point out what I am missing?

⌁   Link to post
Laurens_Hagendoorn
Laurens_Hagendoorn

It was the huge number of NaN’s

···

Op dinsdag 11 september 2018 14:44:47 UTC+2 schreef Laurens Hagendoorn:

Hello, I am trying to build a bokeh dashboard and am currently stuck on my first tab.

The plot seen above renders just fine in my jupyter notebook (taking about a second). However, when I stick the same code (roughly) in a bokeh server, it is unbearably slow (multiple minutes).

I am making a lineplot with many lines, and a lot of them overlap (could be causing a rendering issue?)

I have grouped all these lines into 7 lines in total (as I have read it is better to draw fewer larger lines than more small ones).

A shortened example of the data looks like this:

xs = [np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,

np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,11.18082192, 12.02739726, 13.25205479, 14.22739726,np.nan,np.nan,np.nan, 6.55616438, 7.53150685, 8.52054795,

9.47123288, 10.44109589,np.nan]),

np.array([np.nan,np.nan,np.nan, 0.70410959, 1.63835616,

2.73972603, 3.64931507,np.nan,np.nan,np.nan,np.nan, 4.00821918, 5.04383562, 6.00821918, 7.05479452,

np.nan,np.nan,np.nan,np.nan, 4.56164384,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,11.18082192,np.nan,np.nan,np.nan,np.nan,np.nan, 5.94794521, 6.55616438, 7.53150685, 8.52054795,

np.nan,np.nan,np.nan])]

ys = [np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),

np.array([ np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

-0.15652901, 0.14953203, 0.62195036, 0.64414847, np.nan,

np.nan, np.nan, -0.33739475, -0.27092199, -0.32020045,

-0.35019554, -0.21857558, np.nan]),

np.array([ np.nan, np.nan, np.nan, -0.42062806, -0.50175937,

-0.39375614, -0.45259168, np.nan, np.nan, np.nan,

np.nan, -0.38755729, -0.45590074, -0.38985249, -0.30375873,

np.nan, np.nan, np.nan, np.nan, -0.10799712,

np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

np.nan, np.nan, np.nan, np.nan, np.nan,

-0.15652901, np.nan, np.nan, np.nan, np.nan,

np.nan, -0.2219407 , -0.33739475, -0.27092199, -0.32020045,

np.nan, np.nan, np.nan])]

single_sources = [ColumnDataSource({‘x_line’: xs[i], ‘y_line’: ys[i]}) for i in range(7)]

``

As you can see the data contains a lot of nans, could this be the problem?

Finally I plot like this:

f = figure(toolbar_location=None, title=‘Planjaar alle wegen’)
f.xaxis.axis_label=‘Leeftijd’

f.yaxis.axis_label=‘PCA_1’

for i,col,lbl in zip(range(7),colors_pljr,labels):

r = f.line(x=‘x_line’, y=‘y_line’, alpha=0.5, line_width=2, source=single_sources[i], line_color=col, legend=lbl)

f.legend.location = “top_left”

f.legend.click_policy=“hide”

``

NOTE: this example actually plots just fine, it is only when I try to make the full 40,000+ line plot that the rendering becomes unbearably long (multiple minutes).

I have also added a CheckboxGroup. In the full plot it again can take a minute or more before the callback is actually called.

Could anybody point out what I am missing?

⌁   Link to post
Bryan
Bryan

There's lots potentially going and intersecting here.

7*40k = 250k points is approach the limits of standard Bokeh canvas rendering, just with simple scatter markers. However lines are more complicated for browser canvases to composite, and they can be wildly inconsistent in their rendering performance, which is outside our control. You might find this is terrible on some browsers, but works fine on others.

Putting NaNs in lines also results in a more complicated code path in Bokeh itself. When the capability to handle NaNs in line was added, nothing like the data below was envisioned. NaN was chosen and intended (perhaps poorly) as a sentinel value signify conceptually single lines that had multiple disjoint segments. I definitelh only had in mind the case "lots of data with a couple of nans in between" As an example I actually have no idea what consecutive NaNs will do or how they will perform.

It's also potentially possible that something about your code organization is preventing Bokeh form using binary array transport. It would require investigation. But TLDR, the JSON spec itself does not support NaN values at all. Thing "kind of work" by accident because JS is terrible about implicit casting, and will convert a string like "nan" to null when treated as a number. But it can be a severe drag on performance. If Bokeh is falling b back to naive JSON encoding then that could also be an issue.

As an aside, I'd really suggest looking at Datashader (together with Bokeh). Datashader renderings things in Python, and can send the resulting images to Bokeh, even in interactive contexts. Aside from implicitly being a technique for bandwidth compression when you have lots of points, Datashader gives you very fine control over rendering which can be very useful for improving the efficacy of visualization when there is extreme over-plotting, such as you seem to have.

Thanks,

Bryan

···

On Sep 11, 2018, at 06:08, laurens.hagendoorn@clockworks.co wrote:
in
It was the huge number of NaN's

Op dinsdag 11 september 2018 14:44:47 UTC+2 schreef Laurens Hagendoorn:
Hello, I am trying to build a bokeh dashboard and am currently stuck on my first tab.

The plot seen above renders just fine in my jupyter notebook (taking about a second). However, when I stick the same code (roughly) in a bokeh server, it is unbearably slow (multiple minutes).

I am making a lineplot with many lines, and a lot of them overlap (could be causing a rendering issue?)
I have grouped all these lines into 7 lines in total (as I have read it is better to draw fewer larger lines than more small ones).

A shortened example of the data looks like this:

xs = [np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
     np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
     np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
     np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
     np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
     np.array([np.nan, np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,
               np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,11.18082192, 12.02739726, 13.25205479, 14.22739726,np.nan,np.nan,np.nan, 6.55616438, 7.53150685, 8.52054795,
             9.47123288, 10.44109589,np.nan]),
    np.array([np.nan,np.nan,np.nan, 0.70410959, 1.63835616,
             2.73972603, 3.64931507,np.nan,np.nan,np.nan,np.nan, 4.00821918, 5.04383562, 6.00821918, 7.05479452,
            np.nan,np.nan,np.nan,np.nan, 4.56164384,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,11.18082192,np.nan,np.nan,np.nan,np.nan,np.nan, 5.94794521, 6.55616438, 7.53150685, 8.52054795,
            np.nan,np.nan,np.nan])]

ys = [np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
     np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
     np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
     np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
     np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
            np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
     np.array([ np.nan, np.nan, np.nan, np.nan, np.nan,
                    np.nan, np.nan, np.nan, np.nan, np.nan,
                    np.nan, np.nan, np.nan, np.nan, np.nan,
                    np.nan, np.nan, np.nan, np.nan, np.nan,
                    np.nan, np.nan, np.nan, np.nan, np.nan,
                    np.nan, np.nan, np.nan, np.nan, np.nan,
                    np.nan, np.nan, np.nan, np.nan, np.nan,
            -0.15652901, 0.14953203, 0.62195036, 0.64414847, np.nan,
                    np.nan, np.nan, -0.33739475, -0.27092199, -0.32020045,
            -0.35019554, -0.21857558, np.nan]),
     np.array([ np.nan, np.nan, np.nan, -0.42062806, -0.50175937,
            -0.39375614, -0.45259168, np.nan, np.nan, np.nan,
                    np.nan, -0.38755729, -0.45590074, -0.38985249, -0.30375873,
                    np.nan, np.nan, np.nan, np.nan, -0.10799712,
                    np.nan, np.nan, np.nan, np.nan, np.nan,
                    np.nan, np.nan, np.nan, np.nan, np.nan,
                    np.nan, np.nan, np.nan, np.nan, np.nan,
            -0.15652901, np.nan, np.nan, np.nan, np.nan,
                    np.nan, -0.2219407 , -0.33739475, -0.27092199, -0.32020045,
                    np.nan, np.nan, np.nan])]

single_sources = [ColumnDataSource({'x_line': xs[i], 'y_line': ys[i]}) for i in range(7)]

As you can see the data contains a lot of nans, could this be the problem?

Finally I plot like this:
f = figure(toolbar_location=None, title='Planjaar alle wegen')
f.xaxis.axis_label='Leeftijd'
f.yaxis.axis_label='PCA_1'
for i,col,lbl in zip(range(7),colors_pljr,labels):
    r = f.line(x='x_line', y='y_line', alpha=0.5, line_width=2, source=single_sources[i], line_color=col, legend=lbl)
f.legend.location = "top_left"
f.legend.click_policy="hide"

NOTE: this example actually plots just fine, it is only when I try to make the full 40,000+ line plot that the rendering becomes unbearably long (multiple minutes).

I have also added a CheckboxGroup. In the full plot it again can take a minute or more before the callback is actually called.

Could anybody point out what I am missing?

--
You received this message because you are subscribed to the Google Groups "Bokeh Discussion - Public" group.
To unsubscribe from this group and stop receiving emails from it, send an email to bokeh+unsubscribe@continuum.io.
To post to this group, send email to bokeh@continuum.io.
To view this discussion on the web visit https://groups.google.com/a/continuum.io/d/msgid/bokeh/07b8e331-800a-4f94-8def-09ecb72f5790%40continuum.io\.
For more options, visit https://groups.google.com/a/continuum.io/d/optout\.

⌁   Link to post
Bryan
Bryan

Here is a data shader section specifically regarding lines/timeseries:

  http://datashader.org/user_guide/3_Timeseries.html

Bryan

···

On Sep 11, 2018, at 08:05, Bryan Van de ven <bryan@bokeh.org> wrote:

There's lots potentially going and intersecting here.

7*40k = 250k points is approach the limits of standard Bokeh canvas rendering, just with simple scatter markers. However lines are more complicated for browser canvases to composite, and they can be wildly inconsistent in their rendering performance, which is outside our control. You might find this is terrible on some browsers, but works fine on others.

Putting NaNs in lines also results in a more complicated code path in Bokeh itself. When the capability to handle NaNs in line was added, nothing like the data below was envisioned. NaN was chosen and intended (perhaps poorly) as a sentinel value signify conceptually single lines that had multiple disjoint segments. I definitelh only had in mind the case "lots of data with a couple of nans in between" As an example I actually have no idea what consecutive NaNs will do or how they will perform.

It's also potentially possible that something about your code organization is preventing Bokeh form using binary array transport. It would require investigation. But TLDR, the JSON spec itself does not support NaN values at all. Thing "kind of work" by accident because JS is terrible about implicit casting, and will convert a string like "nan" to null when treated as a number. But it can be a severe drag on performance. If Bokeh is falling b back to naive JSON encoding then that could also be an issue.

As an aside, I'd really suggest looking at Datashader (together with Bokeh). Datashader renderings things in Python, and can send the resulting images to Bokeh, even in interactive contexts. Aside from implicitly being a technique for bandwidth compression when you have lots of points, Datashader gives you very fine control over rendering which can be very useful for improving the efficacy of visualization when there is extreme over-plotting, such as you seem to have.

Thanks,

Bryan

On Sep 11, 2018, at 06:08, laurens.hagendoorn@clockworks.co wrote:
in
It was the huge number of NaN's

Op dinsdag 11 september 2018 14:44:47 UTC+2 schreef Laurens Hagendoorn:
Hello, I am trying to build a bokeh dashboard and am currently stuck on my first tab.

The plot seen above renders just fine in my jupyter notebook (taking about a second). However, when I stick the same code (roughly) in a bokeh server, it is unbearably slow (multiple minutes).

I am making a lineplot with many lines, and a lot of them overlap (could be causing a rendering issue?)
I have grouped all these lines into 7 lines in total (as I have read it is better to draw fewer larger lines than more small ones).

A shortened example of the data looks like this:

xs = [np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
    np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
    np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
    np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
    np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
    np.array([np.nan, np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,
              np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,11.18082192, 12.02739726, 13.25205479, 14.22739726,np.nan,np.nan,np.nan, 6.55616438, 7.53150685, 8.52054795,
            9.47123288, 10.44109589,np.nan]),
   np.array([np.nan,np.nan,np.nan, 0.70410959, 1.63835616,
            2.73972603, 3.64931507,np.nan,np.nan,np.nan,np.nan, 4.00821918, 5.04383562, 6.00821918, 7.05479452,
           np.nan,np.nan,np.nan,np.nan, 4.56164384,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,11.18082192,np.nan,np.nan,np.nan,np.nan,np.nan, 5.94794521, 6.55616438, 7.53150685, 8.52054795,
           np.nan,np.nan,np.nan])]

ys = [np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
    np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
    np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
    np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
    np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
           np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
    np.array([ np.nan, np.nan, np.nan, np.nan, np.nan,
                   np.nan, np.nan, np.nan, np.nan, np.nan,
                   np.nan, np.nan, np.nan, np.nan, np.nan,
                   np.nan, np.nan, np.nan, np.nan, np.nan,
                   np.nan, np.nan, np.nan, np.nan, np.nan,
                   np.nan, np.nan, np.nan, np.nan, np.nan,
                   np.nan, np.nan, np.nan, np.nan, np.nan,
           -0.15652901, 0.14953203, 0.62195036, 0.64414847, np.nan,
                   np.nan, np.nan, -0.33739475, -0.27092199, -0.32020045,
           -0.35019554, -0.21857558, np.nan]),
    np.array([ np.nan, np.nan, np.nan, -0.42062806, -0.50175937,
           -0.39375614, -0.45259168, np.nan, np.nan, np.nan,
                   np.nan, -0.38755729, -0.45590074, -0.38985249, -0.30375873,
                   np.nan, np.nan, np.nan, np.nan, -0.10799712,
                   np.nan, np.nan, np.nan, np.nan, np.nan,
                   np.nan, np.nan, np.nan, np.nan, np.nan,
                   np.nan, np.nan, np.nan, np.nan, np.nan,
           -0.15652901, np.nan, np.nan, np.nan, np.nan,
                   np.nan, -0.2219407 , -0.33739475, -0.27092199, -0.32020045,
                   np.nan, np.nan, np.nan])]

single_sources = [ColumnDataSource({'x_line': xs[i], 'y_line': ys[i]}) for i in range(7)]

As you can see the data contains a lot of nans, could this be the problem?

Finally I plot like this:
f = figure(toolbar_location=None, title='Planjaar alle wegen')
f.xaxis.axis_label='Leeftijd'
f.yaxis.axis_label='PCA_1'
for i,col,lbl in zip(range(7),colors_pljr,labels):
   r = f.line(x='x_line', y='y_line', alpha=0.5, line_width=2, source=single_sources[i], line_color=col, legend=lbl)
f.legend.location = "top_left"
f.legend.click_policy="hide"

NOTE: this example actually plots just fine, it is only when I try to make the full 40,000+ line plot that the rendering becomes unbearably long (multiple minutes).

I have also added a CheckboxGroup. In the full plot it again can take a minute or more before the callback is actually called.

Could anybody point out what I am missing?

--
You received this message because you are subscribed to the Google Groups "Bokeh Discussion - Public" group.
To unsubscribe from this group and stop receiving emails from it, send an email to bokeh+unsubscribe@continuum.io.
To post to this group, send email to bokeh@continuum.io.
To view this discussion on the web visit https://groups.google.com/a/continuum.io/d/msgid/bokeh/07b8e331-800a-4f94-8def-09ecb72f5790%40continuum.io\.
For more options, visit https://groups.google.com/a/continuum.io/d/optout\.

⌁   Link to post
Bryan
Bryan

And here is a ref about using Holoviews to drive Datashader+Bokeh together at a high level, for interactive cases:

  Working with large data using datashader — HoloViews v1.18.1

Bryan

···

On Sep 11, 2018, at 08:08, Bryan Van de ven <bryan@bokeh.org> wrote:

Here is a data shader section specifically regarding lines/timeseries:

  http://datashader.org/user_guide/3_Timeseries.html

Bryan

On Sep 11, 2018, at 08:05, Bryan Van de ven <bryan@bokeh.org> wrote:

There's lots potentially going and intersecting here.

7*40k = 250k points is approach the limits of standard Bokeh canvas rendering, just with simple scatter markers. However lines are more complicated for browser canvases to composite, and they can be wildly inconsistent in their rendering performance, which is outside our control. You might find this is terrible on some browsers, but works fine on others.

Putting NaNs in lines also results in a more complicated code path in Bokeh itself. When the capability to handle NaNs in line was added, nothing like the data below was envisioned. NaN was chosen and intended (perhaps poorly) as a sentinel value signify conceptually single lines that had multiple disjoint segments. I definitelh only had in mind the case "lots of data with a couple of nans in between" As an example I actually have no idea what consecutive NaNs will do or how they will perform.

It's also potentially possible that something about your code organization is preventing Bokeh form using binary array transport. It would require investigation. But TLDR, the JSON spec itself does not support NaN values at all. Thing "kind of work" by accident because JS is terrible about implicit casting, and will convert a string like "nan" to null when treated as a number. But it can be a severe drag on performance. If Bokeh is falling b back to naive JSON encoding then that could also be an issue.

As an aside, I'd really suggest looking at Datashader (together with Bokeh). Datashader renderings things in Python, and can send the resulting images to Bokeh, even in interactive contexts. Aside from implicitly being a technique for bandwidth compression when you have lots of points, Datashader gives you very fine control over rendering which can be very useful for improving the efficacy of visualization when there is extreme over-plotting, such as you seem to have.

Thanks,

Bryan

On Sep 11, 2018, at 06:08, laurens.hagendoorn@clockworks.co wrote:
in
It was the huge number of NaN's

Op dinsdag 11 september 2018 14:44:47 UTC+2 schreef Laurens Hagendoorn:
Hello, I am trying to build a bokeh dashboard and am currently stuck on my first tab.

The plot seen above renders just fine in my jupyter notebook (taking about a second). However, when I stick the same code (roughly) in a bokeh server, it is unbearably slow (multiple minutes).

I am making a lineplot with many lines, and a lot of them overlap (could be causing a rendering issue?)
I have grouped all these lines into 7 lines in total (as I have read it is better to draw fewer larger lines than more small ones).

A shortened example of the data looks like this:

xs = [np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
   np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
   np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
   np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
   np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
   np.array([np.nan, np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,
             np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,11.18082192, 12.02739726, 13.25205479, 14.22739726,np.nan,np.nan,np.nan, 6.55616438, 7.53150685, 8.52054795,
           9.47123288, 10.44109589,np.nan]),
  np.array([np.nan,np.nan,np.nan, 0.70410959, 1.63835616,
           2.73972603, 3.64931507,np.nan,np.nan,np.nan,np.nan, 4.00821918, 5.04383562, 6.00821918, 7.05479452,
          np.nan,np.nan,np.nan,np.nan, 4.56164384,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,11.18082192,np.nan,np.nan,np.nan,np.nan,np.nan, 5.94794521, 6.55616438, 7.53150685, 8.52054795,
          np.nan,np.nan,np.nan])]

ys = [np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
   np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
   np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
   np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
   np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
          np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
   np.array([ np.nan, np.nan, np.nan, np.nan, np.nan,
                  np.nan, np.nan, np.nan, np.nan, np.nan,
                  np.nan, np.nan, np.nan, np.nan, np.nan,
                  np.nan, np.nan, np.nan, np.nan, np.nan,
                  np.nan, np.nan, np.nan, np.nan, np.nan,
                  np.nan, np.nan, np.nan, np.nan, np.nan,
                  np.nan, np.nan, np.nan, np.nan, np.nan,
          -0.15652901, 0.14953203, 0.62195036, 0.64414847, np.nan,
                  np.nan, np.nan, -0.33739475, -0.27092199, -0.32020045,
          -0.35019554, -0.21857558, np.nan]),
   np.array([ np.nan, np.nan, np.nan, -0.42062806, -0.50175937,
          -0.39375614, -0.45259168, np.nan, np.nan, np.nan,
                  np.nan, -0.38755729, -0.45590074, -0.38985249, -0.30375873,
                  np.nan, np.nan, np.nan, np.nan, -0.10799712,
                  np.nan, np.nan, np.nan, np.nan, np.nan,
                  np.nan, np.nan, np.nan, np.nan, np.nan,
                  np.nan, np.nan, np.nan, np.nan, np.nan,
          -0.15652901, np.nan, np.nan, np.nan, np.nan,
                  np.nan, -0.2219407 , -0.33739475, -0.27092199, -0.32020045,
                  np.nan, np.nan, np.nan])]

single_sources = [ColumnDataSource({'x_line': xs[i], 'y_line': ys[i]}) for i in range(7)]

As you can see the data contains a lot of nans, could this be the problem?

Finally I plot like this:
f = figure(toolbar_location=None, title='Planjaar alle wegen')
f.xaxis.axis_label='Leeftijd'
f.yaxis.axis_label='PCA_1'
for i,col,lbl in zip(range(7),colors_pljr,labels):
  r = f.line(x='x_line', y='y_line', alpha=0.5, line_width=2, source=single_sources[i], line_color=col, legend=lbl)
f.legend.location = "top_left"
f.legend.click_policy="hide"

NOTE: this example actually plots just fine, it is only when I try to make the full 40,000+ line plot that the rendering becomes unbearably long (multiple minutes).

I have also added a CheckboxGroup. In the full plot it again can take a minute or more before the callback is actually called.

Could anybody point out what I am missing?

--
You received this message because you are subscribed to the Google Groups "Bokeh Discussion - Public" group.
To unsubscribe from this group and stop receiving emails from it, send an email to bokeh+unsubscribe@continuum.io.
To post to this group, send email to bokeh@continuum.io.
To view this discussion on the web visit https://groups.google.com/a/continuum.io/d/msgid/bokeh/07b8e331-800a-4f94-8def-09ecb72f5790%40continuum.io\.
For more options, visit https://groups.google.com/a/continuum.io/d/optout\.

⌁   Link to post

End of archived discussion · Replies are disabled