KDE Plot
Monthly Electricity Bill Distribution
KDE of monthly electricity bills with seasonal consumption patterns.
Output
Python
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
np.random.seed(201)
bills = np.concatenate([
np.random.normal(80, 20, 300),
np.random.normal(150, 35, 200),
np.random.normal(200, 40, 150)
])
bills = bills[(bills > 20) & (bills < 350)]
kde = stats.gaussian_kde(bills)
x = np.linspace(20, 350, 500)
y = kde(x)
colors = ['#1e3a8a', '#3b82f6', '#22d3ee', '#fbbf24', '#f97316', '#dc2626']
fig, ax = plt.subplots(figsize=(12, 6), facecolor='#ffffff')
ax.set_facecolor('#ffffff')
for i in range(len(x)-1):
norm_val = (x[i] - 20) / 330
color_idx = int(norm_val * (len(colors) - 1))
color_idx = max(0, min(color_idx, len(colors)-1))
ax.fill_between(x[i:i+2], y[i:i+2], alpha=0.6, color=colors[color_idx])
ax.plot(x, y, color='#374151', linewidth=2.5)
thresholds = [(100, 'Low'), (175, 'Medium'), (250, 'High')]
for val, label in thresholds:
ax.axvline(val, color='#9ca3af', linestyle='--', linewidth=1.5, alpha=0.7)
ax.text(val+5, max(y)*0.9, label, color='#6b7280', fontsize=9, fontweight='bold')
mean_bill = np.mean(bills)
ax.axvline(mean_bill, color='#374151', linestyle='-', linewidth=2)
ax.text(mean_bill+5, max(y)*0.7, 'Avg: $' + str(int(mean_bill)), color='#374151', fontsize=10, fontweight='bold')
ax.set_xlabel('Monthly Bill ($)', fontsize=12, color='#1f2937', fontweight='500')
ax.set_ylabel('Density', fontsize=12, color='#1f2937', fontweight='500')
ax.set_title('Monthly Electricity Bill Distribution', fontsize=16, color='#1f2937', fontweight='bold', pad=15)
ax.tick_params(colors='#374151', labelsize=10)
for spine in ax.spines.values():
spine.set_color('#d1d5db')
ax.grid(True, alpha=0.3, color='#e5e7eb')
ax.set_xlim(20, 350)
plt.tight_layout()
plt.show()
Library
Matplotlib
Category
Statistical
☕