Bokeh - Filtraggio dei dati

Spesso, potresti voler ottenere un grafico relativo a una parte dei dati che soddisfa determinate condizioni invece dell'intero set di dati. L'oggetto della classe CDSView definita nel modulo bokeh.models restituisce un sottoinsieme di ColumnDatasource in esame applicando uno o più filtri su di esso.

IndexFilter è il tipo di filtro più semplice. È necessario specificare gli indici solo delle righe del set di dati che si desidera utilizzare durante il tracciamento della figura.

L'esempio seguente mostra l'uso di IndexFilter per configurare un CDSView. La figura risultante mostra un glifo di linea tra le serie di dati xey di ColumnDataSource. Un oggetto vista si ottiene applicando il filtro indice su di esso. La vista viene utilizzata per tracciare il glifo del cerchio come risultato di IndexFilter.

Esempio

from bokeh.models import ColumnDataSource, CDSView, IndexFilter
from bokeh.plotting import figure, output_file, show
source = ColumnDataSource(data = dict(x = list(range(1,11)), y = list(range(2,22,2))))
view = CDSView(source=source, filters = [IndexFilter([0, 2, 4,6])])
fig = figure(title = 'Line Plot example', x_axis_label = 'x', y_axis_label = 'y')
fig.circle(x = "x", y = "y", size = 10, source = source, view = view, legend = 'filtered')
fig.line(source.data['x'],source.data['y'], legend = 'unfiltered')
show(fig)

Produzione

Per scegliere solo le righe dell'origine dati che soddisfano una determinata condizione booleana, applicare un BooleanFilter.

Una tipica installazione Bokeh consiste in una serie di set di dati di esempio nella directory dei dati di campionamento. Per il seguente esempio, usiamounemployment1948set di dati fornito sotto forma di disoccupazione1948.csv. Memorizza la percentuale annuale di disoccupazione negli Stati Uniti dal 1948. Vogliamo generare un grafico solo per l'anno 1980 in poi. A tale scopo, un oggetto CDSView viene ottenuto applicando BooleanFilter sull'origine dati specificata.

from bokeh.models import ColumnDataSource, CDSView, BooleanFilter
from bokeh.plotting import figure, show
from bokeh.sampledata.unemployment1948 import data
source = ColumnDataSource(data)
booleans = [True if int(year) >= 1980 else False for year in
source.data['Year']]
print (booleans)
view1 = CDSView(source = source, filters=[BooleanFilter(booleans)])
p = figure(title = "Unemployment data", x_range = (1980,2020), x_axis_label = 'Year', y_axis_label='Percentage')
p.line(x = 'Year', y = 'Annual', source = source, view = view1, color = 'red', line_width = 2)
show(p)

Produzione

Per aggiungere maggiore flessibilità nell'applicazione del filtro, Bokeh fornisce una classe CustomJSFilter con l'aiuto della quale l'origine dati può essere filtrata con una funzione JavaScript definita dall'utente.

L'esempio fornito di seguito utilizza gli stessi dati sulla disoccupazione negli Stati Uniti. Definizione di un CustomJSFilter per tracciare i dati sulla disoccupazione dell'anno 1980 e successivi.

from bokeh.models import ColumnDataSource, CDSView, CustomJSFilter
from bokeh.plotting import figure, show
from bokeh.sampledata.unemployment1948 import data
source = ColumnDataSource(data)
custom_filter = CustomJSFilter(code = '''
   var indices = [];

   for (var i = 0; i < source.get_length(); i++){
      if (parseInt(source.data['Year'][i]) > = 1980){
         indices.push(true);
      } else {
         indices.push(false);
      }
   }
   return indices;
''')
view1 = CDSView(source = source, filters = [custom_filter])
p = figure(title = "Unemployment data", x_range = (1980,2020), x_axis_label = 'Year', y_axis_label = 'Percentage')
p.line(x = 'Year', y = 'Annual', source = source, view = view1, color = 'red', line_width = 2)
show(p)