Update bubble-chart.component.ts

This commit is contained in:
string 2025-10-29 15:42:21 +05:30
parent ad57f11f8a
commit 8853cf75cf

View File

@ -69,6 +69,13 @@ export class BubbleChartComponent implements OnInit, OnChanges {
animation: { animation: {
duration: 800, duration: 800,
easing: 'easeInOutQuart' easing: 'easeInOutQuart'
},
// Enable individual point styling
elements: {
point: {
hoverRadius: 10,
hoverBorderWidth: 2
}
} }
}; };
@ -454,6 +461,59 @@ export class BubbleChartComponent implements OnInit, OnChanges {
this.fetchChartData(); this.fetchChartData();
} }
// Helper function to replace alpha value in RGBA color string
private replaceAlpha(color: string, newAlpha: number): string {
// Match rgba(r, g, b, a) format and replace alpha value
return color.replace(/rgba\((\d+),\s*(\d+),\s*(\d+),\s*[\d.]+\)/, `rgba($1, $2, $3, ${newAlpha})`);
}
// Function to generate different colors for bubbles
private generateBubbleColor(index: number, value: number, total: number): string {
// Generate colors based on index or value
// Using HSL color model for better color distribution
const hue = (index * 137.508) % 360; // Golden angle approximation for good distribution
const saturation = 80 + (index % 20); // High saturation for vibrant colors
const lightness = 40 + (index % 30); // Vary lightness for contrast
// Convert HSL to RGB
const h = hue / 360;
const s = saturation / 100;
const l = lightness / 100;
const rgb = this.hslToRgb(h, s, l);
return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.7)`;
}
// Helper function to convert HSL to RGB
private hslToRgb(h: number, s: number, l: number): { r: number, g: number, b: number } {
let r, g, b;
if (s === 0) {
r = g = b = l; // achromatic
} else {
const hue2rgb = (p: number, q: number, t: number) => {
if (t < 0) t += 1;
if (t > 1) t -= 1;
if (t < 1/6) return p + (q - p) * 6 * t;
if (t < 1/2) return q;
if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
return p;
};
const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
const p = 2 * l - q;
r = hue2rgb(p, q, h + 1/3);
g = hue2rgb(p, q, h);
b = hue2rgb(p, q, h - 1/3);
}
return {
r: Math.round(r * 255),
g: Math.round(g * 255),
b: Math.round(b * 255)
};
}
// Transform data to bubble chart format // Transform data to bubble chart format
private transformToBubbleData(labels: any[], data: any[]): ChartDataset[] { private transformToBubbleData(labels: any[], data: any[]): ChartDataset[] {
// For bubble charts, we need to transform the data into bubble format // For bubble charts, we need to transform the data into bubble format
@ -493,6 +553,7 @@ export class BubbleChartComponent implements OnInit, OnChanges {
// Create bubble points from labels (x) and data (y) // Create bubble points from labels (x) and data (y)
const bubblePoints = []; const bubblePoints = [];
const bubbleColors = [];
const minLength = Math.min(labels.length, yValues.length); const minLength = Math.min(labels.length, yValues.length);
console.log('Processing data points:', { labels, yValues, minLength }); console.log('Processing data points:', { labels, yValues, minLength });
@ -522,6 +583,12 @@ export class BubbleChartComponent implements OnInit, OnChanges {
// For x-value, we'll use the index position since labels are strings // For x-value, we'll use the index position since labels are strings
const x = i; const x = i;
// Generate a unique color for this bubble
const backgroundColor = this.generateBubbleColor(i, y, minLength);
// Store the color for the dataset
bubbleColors.push(backgroundColor);
// Add the point // Add the point
const point = { const point = {
x, x,
@ -534,6 +601,7 @@ export class BubbleChartComponent implements OnInit, OnChanges {
console.log('Generated bubble points:', bubblePoints); console.log('Generated bubble points:', bubblePoints);
console.log('Generated bubble points count:', bubblePoints.length); console.log('Generated bubble points count:', bubblePoints.length);
console.log('Generated bubble colors count:', bubbleColors.length);
// If we have no valid points, return empty array // If we have no valid points, return empty array
if (bubblePoints.length === 0) { if (bubblePoints.length === 0) {
@ -546,11 +614,11 @@ export class BubbleChartComponent implements OnInit, OnChanges {
{ {
data: bubblePoints, data: bubblePoints,
label: label, label: label,
backgroundColor: 'rgba(255, 99, 132, 0.6)', backgroundColor: bubbleColors,
borderColor: 'rgba(255, 99, 132, 1)', borderColor: bubbleColors.map(color => this.replaceAlpha(color, 1)), // Slightly more opaque border
hoverBackgroundColor: 'rgba(255, 99, 132, 0.8)', hoverBackgroundColor: bubbleColors.map(color => this.replaceAlpha(color, 0.9)),
hoverBorderColor: 'rgba(255, 99, 132, 1)', hoverBorderColor: 'rgba(255, 255, 255, 1)',
borderWidth: 1, borderWidth: 2,
pointHoverRadius: 10, pointHoverRadius: 10,
} }
]; ];