When building interactive visualizations with Bokeh, data management is just as important as chart design. While you can pass Python lists directly to plotting functions, Bokeh's ColumnDataSource provides a more powerful and flexible way to organize, update, and share data across multiple visualizations.
ColumnDataSource acts as the central data container for Bokeh applications. It allows charts to share the same dataset, enables interactive selections, supports live updates, and simplifies the development of dynamic dashboards.
In this tutorial, you'll learn how ColumnDataSource works, how to create and modify it, and how to use it effectively in real-world Python visualization projects.
What Is ColumnDataSource?
A ColumnDataSource is Bokeh's primary data structure for storing visualization data.
It organizes data into named columns, where each column contains values of the same length.
For example:
| Month | Sales |
|---|---|
| January | 120 |
| February | 145 |
| March | 168 |
Each column becomes accessible by its name when creating glyphs.
Instead of passing raw lists, glyphs reference column names stored inside the data source.
Why Use ColumnDataSource?
Using ColumnDataSource provides many advantages:
- Centralized data management
- Shared data across multiple plots
- Interactive selections
- Hover tool support
- Efficient updates
- Streaming data
- Real-time dashboards
- Better scalability
It is considered the recommended approach for nearly all professional Bokeh applications.
Creating a ColumnDataSource
Import the required class.
from bokeh.models import ColumnDataSourceCreate a data source using a dictionary.
source = ColumnDataSource(data={
"month":["Jan","Feb","Mar","Apr"],
"sales":[120,145,160,180]
})Each key becomes a named column.
Using ColumnDataSource with a Plot
Reference column names instead of Python lists.
from bokeh.plotting import figure, show
plot = figure(
x_range=source.data["month"],
width=700,
height=400
)
plot.vbar(
x="month",
top="sales",
width=0.6,
source=source
)
show(plot)Notice that the glyph receives column names ("month" and "sales") rather than the actual data values.
Creating a Source from a Pandas DataFrame
ColumnDataSource integrates seamlessly with Pandas.
import pandas as pd
from bokeh.models import ColumnDataSource
df = pd.DataFrame({
"Month":["Jan","Feb","Mar"],
"Revenue":[120,155,180]
})
source = ColumnDataSource(df)This is one of the most common workflows in data science and business analytics.
Accessing Data
Retrieve data from the source.
print(source.data)Access a specific column.
print(source.data["sales"])The data property returns a dictionary where each key corresponds to a column.
Updating Existing Data
Replace an entire column.
source.data["sales"] = [130,150,175,195]The chart automatically reflects the updated values when rendered.
This makes it easy to refresh dashboards without recreating the entire figure.
Updating the Entire Dataset
Replace every column at once.
source.data = {
"month":["May","Jun","Jul"],
"sales":[200,215,240]
}This approach is useful when switching between datasets.
Streaming New Data
For real-time applications, use the stream() method.
source.stream({
"month":["Aug"],
"sales":[260]
})Streaming appends new rows while keeping the existing data intact.
Common use cases include:
- Live sensor monitoring
- Stock market dashboards
- IoT devices
- Server monitoring
- Financial trading systems
Updating Part of the Data with patch()
The patch() method updates only selected values.
source.patch({
"sales":[(1,165)]
})This changes only the second value in the sales column.
Patching is more efficient than replacing an entire dataset.
Sharing Data Between Multiple Charts
One of the biggest advantages of ColumnDataSource is sharing data across plots.
plot1.circle(
x="month",
y="sales",
source=source
)
plot2.line(
x="month",
y="sales",
source=source
)Both charts remain synchronized because they use the same data source.
Selections and updates automatically affect every linked visualization.
Adding Hover Tooltips
ColumnDataSource works seamlessly with hover tools.
from bokeh.models import HoverTool
hover = HoverTool(
tooltips=[
("Month","@month"),
("Sales","@sales")
]
)
plot.add_tools(hover)The @ syntax references columns stored inside the data source.
Filtering Data
Although filtering is often performed with Pandas, you can prepare filtered data before creating a new data source.
filtered = df[df["Revenue"] > 150]
source = ColumnDataSource(filtered)Displaying filtered datasets improves focus and performance.
Using ColumnDataSource with Multiple Glyphs
A single data source can drive many glyphs.
plot.line(
x="month",
y="sales",
source=source
)
plot.circle(
x="month",
y="sales",
size=10,
source=source
)
plot.vbar(
x="month",
top="sales",
width=0.4,
source=source
)This ensures every visualization stays synchronized.
Styling the Visualization
Create a polished appearance.
plot.title.text_font_size = "18pt"
plot.xaxis.axis_label = "Month"
plot.yaxis.axis_label = "Sales"
plot.background_fill_color = "#f8f9fa"
plot.grid.grid_line_alpha = 0.4Consistent styling improves readability and presentation quality.
Best Practices
When using ColumnDataSource:
- Use descriptive column names.
- Keep all columns the same length.
- Prefer DataFrames for structured data.
- Reuse a single source across related plots.
- Use
stream()for live updates. - Use
patch()for small changes. - Avoid duplicating datasets unnecessarily.
- Validate data before updating the source.
These practices improve maintainability and performance.
Common Mistakes
Avoid these common issues:
- Columns with different lengths.
- Rebuilding the data source too often.
- Forgetting to update all required columns.
- Mixing incompatible data types.
- Creating unnecessary duplicate sources.
- Ignoring data validation.
A well-managed data source results in faster and more reliable applications.
Real-World Applications
ColumnDataSource is widely used in:
- Business intelligence dashboards
- Financial analytics
- Scientific research
- Healthcare reporting
- Manufacturing monitoring
- Machine learning dashboards
- Marketing analytics
- Geographic visualization
- Real-time IoT systems
It serves as the foundation for many interactive Bokeh applications.
Performance Tips
For large datasets:
- Update only the necessary columns.
- Use
patch()instead of replacing all data. - Stream new records incrementally.
- Minimize redundant data sources.
- Filter data before plotting.
- Reuse existing objects whenever possible.
Efficient data management keeps applications responsive.
Conclusion
ColumnDataSource is the core data model behind Bokeh's interactive visualization system. It provides a centralized way to organize, share, update, and synchronize data across multiple charts, making it an essential tool for building professional dashboards and analytical applications.
By mastering ColumnDataSource, along with techniques such as streaming, patching, linked plots, and Pandas integration, you'll be able to create scalable, responsive, and highly interactive visualizations that effectively communicate insights from your data.


0 Comments