Update bubble-chart.component.ts
This commit is contained in:
parent
ad57f11f8a
commit
8853cf75cf
@ -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,
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user