Last Updated : 23 Jul, 2025
Bokeh is an interactive visualization library that helps us to create a visual representation of data set and interact with it. You can create various types of visualizations such as bar charts, horizontal plots,time-series, etc. There are various methods to include Bokeh apps and widgets into web apps and pages.
In this tutorial, we are going to create a basic bokeh graph and embed it into our Django web app. For that, we will be importing components from bokeh.embed which returns the individual components. The function bokeh.embed.components() returns a script that contains that data for your plot with a <div> tag in which the plot view is loaded. We will look in detail at the step-by-step procedure.
Step 1: Setting up a basic Django projectFor this project, we are using PyCharm IDE. PyCharm is one of the most popular IDE used for the python Scripting language.
pip install django
pip install bokehStep 2: Create the Django project
django-admin startproject BokehDjango
cd BokehDjango
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver
python manage.py startapp BokehApp
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'BokehApp', ]
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("BokehApp.urls")),
]
from django.urls import path
from . import views
urlpatterns = [path("", views.home, name="home")]
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def home(request):
return HttpResponse("Welcome to home page")
Great! So this was all about setting our Django website.
Step 3:Complete Bokeh Setup into our project:bokeh.__version__
<link href=”https://cdn.pydata.org/bokeh/release/bokeh-2.3.2.min.css
" rel=”stylesheet” type=”text/css”>
<link href=”https://cdn.pydata.org/bokeh/release/bokeh-widgets-2.3.2.min.css"
rel=”stylesheet” type=”text/css”>
<script src="https://cdn.bokeh.org/bokeh/release/bokeh-2.3.2.min.js"></script>
<script src="https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.2.min.js"></script>
<script src="https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.2.min.js"></script>
<script src="https://cdn.bokeh.org/bokeh/release/bokeh-api-2.3.2.min.js"></script>
<html>
<head>
<link href=”https://cdn.pydata.org/bokeh/release/bokeh-2.3.2.min.css
" rel=”stylesheet” type=”text/css”>
<link href=”https://cdn.pydata.org/bokeh/release/bokeh-widgets-2.3.2.min.css"
rel=”stylesheet” type=”text/css”>
</head>
<body>
<h1>Our first Bokeh Graph</h1>
{{div| safe}}
</body>
<script src="https://cdn.bokeh.org/bokeh/release/bokeh-2.3.2.min.js"></script>
<script src="https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.2.min.js"></script>
<script src="https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.2.min.js"></script>
<script src="https://cdn.bokeh.org/bokeh/release/bokeh-api-2.3.2.min.js"></script>
{{script| safe}}
</html>
from django.shortcuts import render
from django.http import HttpResponse
from bokeh.plotting import figure
from bokeh.embed import components
# Create your views here.
def home(request):
#create a plot
plot = figure(plot_width=400, plot_height=400)
# add a circle renderer with a size, color, and alpha
plot.circle([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], size=20, color="navy", alpha=0.5)
script, div = components(plot)
return render(request, 'base.html', {'script': script, 'div': div})
So let us refresh our page after saving all the files and the output will be as shown below.
To enhancing the look of the page we are adding bootstrap to our base.html file. We have added a few of the components and the final HTML will be as shown below:
HTML
<html>
<head>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x"
crossorigin="anonymous">
<link href=”https://cdn.pydata.org/bokeh/release/bokeh-2.3.2.min.css
" rel=”stylesheet” type=”text/css”>
<link href=”https://cdn.pydata.org/bokeh/release/bokeh-widgets-2.3.2.min.css"
rel=”stylesheet” type=”text/css”>
</head>
<body>
<ul class="nav nav-tabs">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">Active</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#" tabindex="-1"
aria-disabled="true">Disabled</a>
</li>
</ul>
<h1 align="center">Data Visualization using Bokeh and Django</h1>
<div class="container overflow-hidden">
<div class="row gx-5">
<div class="col">
<div class="p-3 border bg-light">Bokeh is a data
visualization library for Python. Unlike Matplotlib and
Seaborn, they are also Python packages for data visualization,
Bokeh renders its plots using HTML and
JavaScript. Hence, it proves to be extremely useful
for developing web based dashboards.
The Bokeh project is sponsored by NumFocus
https://numfocus.org/ NumFocus also supports PyData, an
educational program, involved in development of
important tools such as NumPy, Pandas and more.
Bokeh can easily connect with these tools and
produce interactive plots, dashboards and data applications.
Features
Bokeh primarily converts the data source into a JSON file
which is used as input for BokehJS, a JavaScript library,
which in turn is written in TypeScript and renders the
visualizations in modern browsers.
Some of the important features of Bokeh are as follows −
Flexibility
Bokeh is useful for common plotting requirements as
well as custom and complex use-cases.
Productivity
Bokeh can easily interact with other popular Pydata
tools such as Pandas and Jupyter notebook.
Interactivity
This is an important advantage of Bokeh over Matplotlib and
Seaborn, both produce static plots. Bokeh
creates interactive plots that change when the user
interacts with them. You can give your audience a
wide range of options and tools for inferring and
looking at data from various angles so that user can
perform “what if” analysis.
Powerful
By adding custom JavaScript, it is possible to generate
visualizations for specialised use-cases.
Sharable
Plots can be embedded in output of Flask or Django
enabled web applications. They can also be rendered in
Jupyter notebooks.
Open source
Bokeh is an open source project. It is distributed under
Berkeley Source Distribution (BSD) license. Its
source code is available on https://github.com/bokeh/bokeh
</div>
</div>
<div class="col">
<div class="p-3 border bg-light">
<h1>Simple Bokeh Graph</h1>
{{ div| safe}}
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js"
integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4"
crossorigin="anonymous"></script>
</body>
<script src="https://cdn.bokeh.org/bokeh/release/bokeh-2.3.2.min.js"></script>
<script src="https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.2.min.js"></script>
<script src="https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.2.min.js"></script>
<script src="https://cdn.bokeh.org/bokeh/release/bokeh-api-2.3.2.min.js"></script>
{{script| safe}}
</html>
Output:
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4