import { fetchVisualizations } from './api.js';
export async function loadVisualizations() {
const visDiv = document.getElementById('visualizations');
if (!visDiv) return;
visDiv.innerHTML = '
';
try {
const data = await fetchVisualizations();
visDiv.innerHTML = '';
renderVisualizations(data);
} catch (error) {
console.error('Error loading visualizations:', error);
visDiv.innerHTML = 'Error loading visualizations.
';
}
}
function renderVisualizations(data) {
const visDiv = document.getElementById('visualizations');
visDiv.innerHTML = `
Data Insights
`;
// Adjust chart sizes dynamically
const chartHeight = window.innerWidth < 768 ? 250 : 350;
createBarChart('genreChart', data.genre_distribution, 'bar', 'Top 10 Most Common Genres', chartHeight);
createPieChart('typeChart', data.type_distribution, 'Distribution of Movies vs. TV Shows');
createBarChart('countryChart', data.top_countries, 'horizontalBar', 'Top 5 Countries Producing Content', chartHeight);
}
function createBarChart(elementId, chartData, orientation, title, chartHeight = 350) {
if (!chartData || !chartData.data || Object.keys(chartData.data).length === 0) {
console.warn(`Missing or empty data for ${title}`);
return;
}
const ctx = document.getElementById(elementId).getContext('2d');
new Chart(ctx, {
type: orientation === 'horizontalBar' ? 'bar' : 'bar',
data: {
labels: Object.keys(chartData.data),
datasets: [{
label: chartData.y_label || 'Count',
data: Object.values(chartData.data),
backgroundColor: orientation === 'horizontalBar' ? 'rgba(255, 159, 64, 0.6)' : 'rgba(75, 192, 192, 0.6)',
borderWidth: 1
}]
},
options: {
maintainAspectRatio: false,
responsive: true,
indexAxis: orientation === 'horizontalBar' ? 'y' : 'x',
scales: {
x: { beginAtZero: true, title: { display: true, text: chartData.x_label || 'Category' } },
y: {
title: { display: true, text: chartData.y_label || 'Count' },
ticks: { autoSkip: false, maxRotation: 0, minRotation: 0, font: { size: 12 } } // Improves readability
}
},
plugins: {
title: { display: true, text: title, font: { size: 16 } },
tooltip: { enabled: true }
}
}
});
// Adjust canvas height
document.getElementById(elementId).style.height = `${chartHeight}px`;
}
function createPieChart(elementId, chartData, title) {
if (!chartData || !chartData.data || Object.keys(chartData.data).length === 0) {
console.warn(`Missing or empty data for ${title}`);
return;
}
const ctx = document.getElementById(elementId).getContext('2d');
new Chart(ctx, {
type: 'pie',
data: {
labels: Object.keys(chartData.data),
datasets: [{
data: Object.values(chartData.data),
backgroundColor: ['#FF6384', '#36A2EB', '#FFCE56'],
borderWidth: 1
}]
},
options: {
maintainAspectRatio: false,
responsive: true,
plugins: {
title: { display: true, text: title, font: { size: 16 } },
tooltip: { enabled: true },
legend: { position: 'top' }
}
}
});
// Adjust pie chart size for smaller screens
document.getElementById(elementId).style.height = window.innerWidth < 768 ? '250px' : '350px';
}