import psutil
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random
# -----------------------------
# CONFIG
# -----------------------------
GRID_SIZE = 4 # 4x4 grid heat map
UPDATE_INTERVAL = 1000 # milliseconds
# -----------------------------
# Get CPU Temperature
# -----------------------------
def get_cpu_temp():
temps = psutil.sensors_temperatures()
# Try common sensor labels
for name in temps:
for entry in temps[name]:
if "cpu" in entry.label.lower() or "package" in entry.label.lower():
return entry.current
return None
# -----------------------------
# Generate Heat Map Data
# -----------------------------
def generate_heat_data():
temp = get_cpu_temp()
if temp is None:
# Simulate realistic CPU temperature (for unsupported systems)
base_temp = random.uniform(40, 70)
else:
base_temp = temp
# Create per-core variation
heat_map = np.random.normal(loc=base_temp, scale=2.0, size=(GRID_SIZE, GRID_SIZE))
return heat_map
# -----------------------------
# Visualization Setup
# -----------------------------
fig, ax = plt.subplots()
heat_data = generate_heat_data()
heatmap = ax.imshow(
heat_data,
cmap="inferno",
vmin=30,
vmax=90
)
cbar = plt.colorbar(heatmap)
cbar.set_label("CPU Temperature (°C)")
ax.set_title("Real-Time CPU Thermal Heat Map")
# -----------------------------
# Animation Update Function
# -----------------------------
def update(frame):
new_data = generate_heat_data()
heatmap.set_data(new_data)
avg_temp = np.mean(new_data)
ax.set_title(f"Real-Time CPU Thermal Heat Map | Avg Temp: {avg_temp:.2f}°C")
return [heatmap]
# -----------------------------
# Run Animation
# -----------------------------
ani = animation.FuncAnimation(
fig,
update,
interval=UPDATE_INTERVAL
)
plt.show()