
![]()
21. yüzyılın petrolü veriyi anlamada en etkili yöntemlerden olan görselleştirmede farklı kütüphaneler kullanılabiliyor. Bu yazı serimizde Python 3.6 ortamında kullanacağımız ücretsiz Bokeh kütüphanesi ile interaktif veri görselleştirme nasıl yapılır örnekleriyle sizinle paylaşıyor olacağım.
Bokeh kütüphanesi, modern web tarayıcıları için etkileşimli bir Python görselleştirme kütüphanesidir. Büyük veya gerçek zamanlı veri kümeleri üzerinde yüksek performanslı etkileşim sağlar.
Bokeh kütüphanesinin bokeh.models (alt seviye) ve bokeh.plotting (ileri üst seviye) olmak üzere iki farklı arayüz seviyesi bulunmaktadır. Bu yazımızda bokeh.plotting üzerine yoğunlaşacağız.
Kurulum
Bokeh kütüphanesini bilgisayarınıza -işletim sistemi farketmez- kurmak için iki farklı yöntem bulunmaktadır. Anaconda kullanıyorsanız;
conda install bokeh
Pip ile indirmek istiyorsanız;
pip install bokeh
İlk Örneğimiz
Basit bir veri seti oluşturarak ilk interaktif görselimizi oluşturalım.
# Gerekli kütüphane
from bokeh.plotting import figure, output_file, show
# x ve y verilerimizi liste olarak oluşturalım
x = [1, 2, 3, 4, 5]
y = [6, 7, 2, 4, 5] # html olarak açılacak sayfamızın adını belirtelim
output_file("cizgi.html") # Görselimize başlık, ve eksen isimlerini verelim
p = figure(title="basit cizgi grafik", x_axis_label='x', y_axis_label='y')
# Cizgi olarak x ve y eksenlerini ciz
# legend adı: Sicaklik
# Çizgi kalınlığı: 2
p.line(x, y, legend_label="Sicaklik.", line_width=2)
# Çizimi göster
show(p)Kodumuz yeni bir web arayüzünde aşağıdaki görseli verecektir:

Çoklu Veri Görselleştirme
Aşağıdaki kod bloğunda üç farklı y değişkeninin farklı gösterim şekilleriyle görselleştirilmesi sağlanmıştır. Kodu satır satır anlamaya çalışmanızı tavsiye ediyoruz.
# Gerekli kütüphane
from bokeh.plotting import figure, output_file, show
# verilerimizi oluşturalım
x = [0.1, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0]
y0 = [i**2 for i in x]
y1 = [10**i for i in x]
y2 = [10**(i**2) for i in x]
# html sayfamızın adı
output_file("log_cizgi.html")
# cizimi olustur
# tools ile hangi araclar eklenecek belirtiyoruz
# y_axis_type ile y eksenimizin logaritmik artacağı
# y_range ile eksen aralığı belirtiliyor
# diğerlerini üst kodda anlatmıştık
p = figure(
tools="pan,box_zoom,reset,save",
y_axis_type="log", y_range=[0.001, 10**11], title="logaritmik gösterim",
x_axis_label='x ekseni', y_axis_label='y ekseni'
)
# Görsellerimizi çizgi ve scatter (nokta) türleriyle oluşturalım
p.line(x, x, legend_label="y=x")
p.circle(x, x, legend_label="y=x", fill_color="white", size=8)
p.line(x, y0, legend_label="y=x^2", line_width=3)
p.line(x, y1, legend_label="y=10^x", line_color="red")
p.circle(x, y1, legend_label="y=10^x", fill_color="red", line_color="red", size=6)
p.line(x, y2, legend_label="y=10^x^2", line_color="orange", line_dash="4 4")
# Çizimi göster
show(p)Kodumuzun çıktısı

Biraz Daha Zengin İçerik
Aşağıdaki kod örneğinde görselimize ilave araçlar ekliyoruz:
# Gerekli kütüphaneler
import numpy as np
from bokeh.plotting import figure, output_file, show
# Veriyi oluşturalım
N = 4000
x = np.random.random(size=N) * 100
y = np.random.random(size=N) * 100
radii = np.random.random(size=N) * 1.5
# Görseli renk olarak zenginleştirelim
colors = [
"#%02x%02x%02x" % (int(r), int(g), 150) for r, g in zip(50+2*x, 30+2*y)
]
# html sayfamız
output_file("color_scatter.html", title="color_scatter.py example", mode="cdn")
# Görsel için ekleyeceğimiz tool'lar
# lütsen görselde herbir tool'u tıklayarak hangi işlevi yerine
# getirdiğini gözlemleyin
TOOLS = "crosshair,pan,wheel_zoom,box_zoom,reset,box_select,lasso_select"
# p görselini aralık ve tool'ları ile oluştur
p = figure(tools=TOOLS, x_range=(0, 100), y_range=(0, 100))
# scatter (nokta)
p.circle(x, y, radius=radii, fill_color=colors, fill_alpha=0.6, line_color=None)
# show the results
show(p)Kodu çalıştırdığımızda yeni bir web sayfasında aşağıdaki gibi interaktif görsel oluşacaktır.

Birden Fazla Grafik Çizme
Aşağıdaki örnekte birden fazla grafik çizme kodlanmaktadır:
# Gerekli kütüphaneler
import numpy as np
from bokeh.layouts import gridplot
from bokeh.plotting import figure, output_file, show
# verimizi oluşturalım
N = 100
x = np.linspace(0, 4*np.pi, N)
y0 = np.sin(x)
y1 = np.cos(x)
y2 = np.sin(x) + np.cos(x)
# html sayfamız
output_file("linked_panning.html")
# 1. çizim
s1 = figure(width=250, plot_height=250, title=None)
s1.circle(x, y0, size=10, color="navy", alpha=0.5)
# 2. çizim
s2 = figure(width=250, height=250, x_range=s1.x_range, y_range=s1.y_range, title=None)
s2.triangle(x, y1, size=10, color="firebrick", alpha=0.5)
# 3. çizim
s3 = figure(width=250, height=250, x_range=s1.x_range, title=None)
s3.square(x, y2, size=10, color="olive", alpha=0.5)
# gridplot ile çizimleri beraber olarak alma
p = gridplot([[s1, s2, s3]], toolbar_location=None)
# çizimleri gösterelim
show(p)Kodumuzun çıktısı

Grafiğe Slider ekleme
Aşağıdaki kodda slider eklenerek grafiğimize etkileşim katılmıştır:
from bokeh.plotting import figure, ColumnDataSource
from bokeh.io import output_file, show
from bokeh.models import Slider, CustomJS
from bokeh.layouts import row, widgetbox
import numpy as np
sr = 44100
x = np.linspace(0,1,sr)
y = np.sin(2*1*np.pi*x)
source = ColumnDataSource(data=dict(x=x,y=y))
# DIKKAT: veri kumemizi bir sozuk formatina cevirip
# sonra ColumnDataSource olusturmamiz gerekiyor.
# Burasi yapilmazsa JS tarafinda veriye erisim saglayamiyorsunuz.
fig = figure(x_axis_label = "Time", y_axis_label="Amplitude")
fig.line('x','y',source=source)
# x,y olarak direk vermek yerine Source'u ve Sourcedaki sozluk yapisinin anahtarlarini veriyoruz
# Yukarida dict(x=x,y=y) seklinde tanimladik.
# customJS callback icine bir veri kumesi bir de JavaScript kodu vermemiz gerekiyor
callback = CustomJS(args=dict(source=source), code="""
var data = source.data; // elimize gecen veri
var F = freq.value; // burayi asagida anlatacagim.
x = data['x']; // sozlukten x anahtarini al
y = data['y']; // y anahtarini al
for(var i=0;i<x.length;i++){
y[i] = Math.sin(x[i]*F*2*Math.PI); // F degerine uygun bir sinus dalgasi olustur
}
console.log(y);
source.change.emit(); // degisiklik oldugunu bildir.
""")
# Slider olustur. 1 ile 10 arasinda birer birer artsin.
# Ve yukarida yazdigimiz callback'i calistirsin
slider = Slider(start=1,end=10,value=1,step=1.,title="Frequency",callback=callback)
callback.args["freq"] = slider # Asagida anlatacagim dedigim kisim burasi
# slider oynadikca bir freq degiskeni callback'in icine gidiyor. biz de onun
# freq.value diyerek degerini okuyoruz ve gorsellestirmeyi degistiriyoruz.
output_file("sample_plot.html")
layout = row(fig,widgetbox(slider))
show(layout)Kodumuzun çıktısı

Bokeh kütüphanesi bir çok interaktif ve kullanıcı dostu özellikleriyle kullanıcısının hizmetine sunulmaktadır. Yazı serimizin 2. sinde görüşmek dileğiyle..
Bokeh ile kalın
KAYNAKLAR
1- https://docs.bokeh.org/en/latest/docs/user_guide/quickstart.html
2- https://medium.com/@sddkal/bokeh-ile-g%C3%B6rselle%C5%9Ftirme-ll-8e8a35cedb67
3- https://towardsdatascience.com/data-visualization-with-bokeh-in-python-part-one-getting-started-a11655a467d4