Bokeh - Lọc dữ liệu
Thông thường, bạn có thể muốn lấy một biểu đồ liên quan đến một phần dữ liệu thỏa mãn các điều kiện nhất định thay vì toàn bộ tập dữ liệu. Đối tượng của lớp CDSView được xác định trong mô-đun bokeh.models trả về một tập hợp con của ColumnDatasource đang được xem xét bằng cách áp dụng một hoặc nhiều bộ lọc trên nó.
IndexFilter là loại bộ lọc đơn giản nhất. Bạn phải chỉ định chỉ số của những hàng đó từ tập dữ liệu mà bạn muốn sử dụng trong khi vẽ đồ thị.
Ví dụ sau minh họa việc sử dụng IndexFilter để thiết lập CDSView. Hình kết quả cho thấy một glyph dòng giữa chuỗi dữ liệu x và y của ColumnDataSource. Đối tượng dạng xem có được bằng cách áp dụng bộ lọc chỉ mục trên nó. Chế độ xem được sử dụng để vẽ biểu đồ hình tròn do IndexFilter.
Thí dụ
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)
Đầu ra
Để chỉ chọn những hàng đó từ nguồn dữ liệu, thỏa mãn điều kiện Boolean nhất định, hãy áp dụng BooleanFilter.
Một cài đặt Bokeh điển hình bao gồm một số tập dữ liệu mẫu trong thư mục dữ liệu mẫu. Ví dụ sau, chúng tôi sử dụngunemployment1948tập dữ liệu được cung cấp dưới dạng thất nghiệp1948.csv. Nó lưu trữ tỷ lệ thất nghiệp khôn ngoan hàng năm ở Hoa Kỳ kể từ năm 1948. Chúng tôi muốn tạo một biểu đồ chỉ cho năm 1980 trở đi. Với mục đích đó, một đối tượng CDSView có được bằng cách áp dụng BooleanFilter trên nguồn dữ liệu đã cho.
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)
Đầu ra
Để thêm tính linh hoạt trong việc áp dụng bộ lọc, Bokeh cung cấp một lớp CustomJSFilter với sự trợ giúp của nguồn dữ liệu có thể được lọc bằng hàm JavaScript do người dùng xác định.
Ví dụ dưới đây sử dụng cùng một dữ liệu thất nghiệp của Hoa Kỳ. Xác định một CustomJSFilter để vẽ các số liệu thất nghiệp của năm 1980 trở về sau.
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)