๐ŸŒ Detecting your locationโ€ฆ

Python Data Visualization 2026: Matplotlib, Seaborn, Plotly and Streamlit

โฑ๏ธ6 min read  ยท  1,193 words

Python data visualization in 2026 spans from quick exploratory charts to publication-ready figures and interactive dashboards. Matplotlib, Seaborn, Plotly, and Altair each have their strengths. This guide shows you when to use each and how to produce professional results fast.

The Visualization Stack

  • Matplotlib โ€” foundation, full control, publication figures
  • Seaborn โ€” statistical plots, beautiful defaults, pandas integration
  • Plotly โ€” interactive charts for dashboards and web apps
  • Altair โ€” declarative grammar, excellent for exploratory analysis
  • Dash/Streamlit โ€” full interactive dashboards in Python

Matplotlib: Foundation

import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
import numpy as np

# Figure and axes
fig, ax = plt.subplots(figsize=(10, 6))

# Line plot
x = np.linspace(0, 10, 200)
ax.plot(x, np.sin(x), label='sin(x)', linewidth=2, color='#0066CC')
ax.plot(x, np.cos(x), label='cos(x)', linewidth=2, color='#FF6600', linestyle='--')

# Styling
ax.set_title('Trigonometric Functions', fontsize=16, fontweight='bold', pad=15)
ax.set_xlabel('x', fontsize=12)
ax.set_ylabel('f(x)', fontsize=12)
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.tight_layout()
plt.savefig('trig.png', dpi=300, bbox_inches='tight')
plt.show()

# Subplots
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
fig.suptitle('Multiple Plots', fontsize=16, fontweight='bold')

axes[0,0].hist(np.random.normal(0, 1, 1000), bins=30, color='steelblue', edgecolor='white')
axes[0,0].set_title('Normal Distribution')

axes[0,1].scatter(np.random.rand(50), np.random.rand(50), alpha=0.6, s=80)
axes[0,1].set_title('Scatter Plot')

x = ['A', 'B', 'C', 'D', 'E']
y = [23, 45, 12, 67, 34]
axes[1,0].bar(x, y, color=['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7'])
axes[1,0].set_title('Bar Chart')

axes[1,1].boxplot([np.random.normal(0, std, 100) for std in [1, 2, 3]])
axes[1,1].set_title('Box Plot')

plt.tight_layout()
plt.show()

Seaborn: Statistical Visualization

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

# Load sample dataset
tips = sns.load_dataset('tips')

# Set theme
sns.set_theme(style='whitegrid', palette='muted', font_scale=1.2)

# Distribution plots
fig, axes = plt.subplots(1, 3, figsize=(15, 5))

# Histogram + KDE
sns.histplot(tips['total_bill'], kde=True, ax=axes[0], color='steelblue')
axes[0].set_title('Total Bill Distribution')

# Box plot by category
sns.boxplot(data=tips, x='day', y='total_bill', hue='sex', ax=axes[1])
axes[1].set_title('Bills by Day and Gender')

# Violin plot
sns.violinplot(data=tips, x='time', y='tip', hue='smoker',
               split=True, inner='quart', ax=axes[2])
axes[2].set_title('Tips Distribution')
plt.tight_layout()
plt.show()

# Correlation heatmap
corr = tips.select_dtypes(include='number').corr()
plt.figure(figsize=(8, 6))
sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm',
            center=0, square=True, linewidths=0.5)
plt.title('Correlation Matrix')
plt.show()

# Pair plot
sns.pairplot(tips, hue='sex', plot_kws={'alpha': 0.6})
plt.suptitle('Pair Plot', y=1.02)
plt.show()

# FacetGrid โ€” multiple plots by category
g = sns.FacetGrid(tips, col='time', row='smoker', height=4)
g.map_dataframe(sns.scatterplot, x='total_bill', y='tip', alpha=0.6)
g.add_legend()
g.set_titles(col_template='{col_name}', row_template='{row_name}')
plt.show()

Plotly: Interactive Charts

import plotly.express as px
import plotly.graph_objects as go
import pandas as pd

# Simple line chart
df = px.data.gapminder().query("continent == 'Asia'")
fig = px.line(df, x='year', y='lifeExp', color='country',
              title='Life Expectancy in Asia',
              labels={'lifeExp': 'Life Expectancy', 'year': 'Year'})
fig.update_layout(
    plot_bgcolor='white',
    paper_bgcolor='white',
    font_family='Inter',
    showlegend=True,
)
fig.show()  # opens in browser

# Animated scatter plot
df = px.data.gapminder()
fig = px.scatter(df, x='gdpPercap', y='lifeExp',
                 animation_frame='year',
                 animation_group='country',
                 size='pop', color='continent',
                 hover_name='country',
                 log_x=True,
                 size_max=55,
                 range_x=[100, 100000],
                 range_y=[25, 90],
                 title='World Health and Wealth (1952-2007)')
fig.show()

# Custom chart with graph_objects
fig = go.Figure()
x = ['Q1', 'Q2', 'Q3', 'Q4']

fig.add_trace(go.Bar(name='2025', x=x, y=[23, 45, 56, 78], marker_color='#4C72B0'))
fig.add_trace(go.Bar(name='2026', x=x, y=[34, 52, 61, 89], marker_color='#DD8452'))
fig.add_trace(go.Scatter(name='Target', x=x, y=[30, 50, 65, 85],
                          mode='lines+markers', line=dict(color='red', dash='dash')))

fig.update_layout(
    title='Quarterly Revenue 2025 vs 2026',
    xaxis_title='Quarter',
    yaxis_title='Revenue ($M)',
    barmode='group',
    hovermode='x unified'
)
fig.show()

# Export to HTML
fig.write_html('chart.html')

# Export static image (requires kaleido)
fig.write_image('chart.png', width=1200, height=600, scale=2)

Streamlit: Instant Dashboards

pip install streamlit plotly pandas

# dashboard.py
import streamlit as st
import plotly.express as px
import pandas as pd

st.set_page_config(page_title='Sales Dashboard', layout='wide')
st.title('Sales Analytics Dashboard')

# Sidebar filters
with st.sidebar:
    st.header('Filters')
    year = st.selectbox('Year', [2024, 2025, 2026])
    region = st.multiselect('Region', ['North', 'South', 'East', 'West'],
                             default=['North', 'South'])

# KPI metrics
col1, col2, col3, col4 = st.columns(4)
col1.metric('Total Revenue', '$2.4M', '+12%')
col2.metric('Orders', '1,847', '+8%')
col3.metric('Avg Order Value', '$1,299', '+4%')
col4.metric('Satisfaction', '4.7/5', '+0.2')

# Charts in two columns
c1, c2 = st.columns(2)
with c1:
    fig = px.line(get_monthly_data(year), x='month', y='revenue',
                  title='Monthly Revenue')
    st.plotly_chart(fig, use_container_width=True)

with c2:
    fig = px.pie(get_regional_data(region), values='revenue',
                 names='region', title='Revenue by Region')
    st.plotly_chart(fig, use_container_width=True)

# Data table
st.subheader('Recent Orders')
df = get_orders(year, region)
st.dataframe(df, use_container_width=True)

# Run: streamlit run dashboard.py

Choosing the Right Tool

Task Best Tool
Publication figures Matplotlib
Statistical analysis Seaborn
Interactive web charts Plotly
Quick dashboards Streamlit
Grammar of graphics Altair
Production dashboards Dash

Python visualization in 2026 has never been more powerful. Use Seaborn for exploratory analysis, Plotly for interactive reports, and Matplotlib for publication-quality figures. Streamlit turns any analysis into a shareable dashboard in minutes.

MD Rafikul Islam

Written by

MD Rafikul Islam is a software developer and the editor of TechPulse. He writes about developer tooling, hardware, and the practical decisions that come up in day-to-day engineering work โ€” which laptop to buy, which framework to commit to, why a build broke at 2am. He tests the tools he writes about and says plainly when something is not worth the money. Corrections and corrections requests are welcome at rony.yf25@gmail.com.

โœ๏ธ Leave a Comment

Your email address will not be published. Required fields are marked *