Update bubble-chart.component.ts
This commit is contained in:
		
							parent
							
								
									8853cf75cf
								
							
						
					
					
						commit
						1dec787062
					
				| @ -63,7 +63,20 @@ export class BubbleChartComponent implements OnInit, OnChanges { | |||||||
|       tooltip: { |       tooltip: { | ||||||
|         enabled: true, |         enabled: true, | ||||||
|         mode: 'point', |         mode: 'point', | ||||||
|         intersect: false |         intersect: false, | ||||||
|  |         callbacks: { | ||||||
|  |           label: function(context: any) { | ||||||
|  |             const point: any = context.raw; | ||||||
|  |             if (point && point.hasOwnProperty('y') && point.hasOwnProperty('r')) { | ||||||
|  |               const yValue = parseFloat(point.y); | ||||||
|  |               const rValue = parseFloat(point.r); | ||||||
|  |               if (!isNaN(yValue) && !isNaN(rValue)) { | ||||||
|  |                 return `Value: ${yValue.toFixed(2)}, Size: ${rValue.toFixed(1)}`; | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |             return context.dataset.label || ''; | ||||||
|  |           } | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     animation: { |     animation: { | ||||||
| @ -73,8 +86,8 @@ export class BubbleChartComponent implements OnInit, OnChanges { | |||||||
|     // Enable individual point styling
 |     // Enable individual point styling
 | ||||||
|     elements: { |     elements: { | ||||||
|       point: { |       point: { | ||||||
|         hoverRadius: 10, |         hoverRadius: 12, | ||||||
|         hoverBorderWidth: 2 |         hoverBorderWidth: 3 | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   }; |   }; | ||||||
| @ -514,6 +527,21 @@ export class BubbleChartComponent implements OnInit, OnChanges { | |||||||
|     }; |     }; | ||||||
|   } |   } | ||||||
|    |    | ||||||
|  |   // Helper function to calculate logarithmic scaling
 | ||||||
|  |   private logScale(value: number, min: number, max: number, minRadius: number, maxRadius: number): number { | ||||||
|  |     if (min === max) return (minRadius + maxRadius) / 2; | ||||||
|  |      | ||||||
|  |     // Normalize value to 0-1 range
 | ||||||
|  |     const normalized = (value - min) / (max - min); | ||||||
|  |      | ||||||
|  |     // Apply logarithmic scaling (base 10)
 | ||||||
|  |     // Add 1 to avoid log(0) and scale to 1-10 range
 | ||||||
|  |     const logValue = Math.log10(normalized * 9 + 1); | ||||||
|  |      | ||||||
|  |     // Scale to desired radius range
 | ||||||
|  |     return minRadius + (logValue / Math.log10(10)) * (maxRadius - minRadius); | ||||||
|  |   } | ||||||
|  |    | ||||||
|   // 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
 | ||||||
| @ -551,6 +579,46 @@ export class BubbleChartComponent implements OnInit, OnChanges { | |||||||
|       console.log('yValues length:', yValues.length); |       console.log('yValues length:', yValues.length); | ||||||
|       console.log('First few yValues:', yValues.slice(0, 5)); |       console.log('First few yValues:', yValues.slice(0, 5)); | ||||||
|        |        | ||||||
|  |       // Find min and max values for scaling
 | ||||||
|  |       let minValue = Infinity; | ||||||
|  |       let maxValue = -Infinity; | ||||||
|  |       const validYValues = []; | ||||||
|  |        | ||||||
|  |       // First pass: collect valid values and find min/max
 | ||||||
|  |       for (let i = 0; i < yValues.length; i++) { | ||||||
|  |         let y; | ||||||
|  |         if (typeof yValues[i] === 'string') { | ||||||
|  |           y = parseFloat(yValues[i]); | ||||||
|  |         } else { | ||||||
|  |           y = yValues[i]; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         if (!isNaN(y)) { | ||||||
|  |           validYValues.push(y); | ||||||
|  |           minValue = Math.min(minValue, y); | ||||||
|  |           maxValue = Math.max(maxValue, y); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |        | ||||||
|  |       console.log('Value range:', { minValue, maxValue }); | ||||||
|  |        | ||||||
|  |       // Adjust radius range based on number of data points
 | ||||||
|  |       // For fewer points, we can use larger bubbles; for more points, smaller bubbles to prevent overlap
 | ||||||
|  |       const dataPointCount = Math.min(labels.length, yValues.length); | ||||||
|  |       let minRadius = 3; | ||||||
|  |       let maxRadius = 30; | ||||||
|  |        | ||||||
|  |       // Adjust radius range based on data point count
 | ||||||
|  |       if (dataPointCount > 50) { | ||||||
|  |         minRadius = 2; | ||||||
|  |         maxRadius = 20; | ||||||
|  |       } else if (dataPointCount > 20) { | ||||||
|  |         minRadius = 3; | ||||||
|  |         maxRadius = 25; | ||||||
|  |       } | ||||||
|  |        | ||||||
|  |       console.log('Radius range:', { minRadius, maxRadius, dataPointCount }); | ||||||
|  |        | ||||||
|       // 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 bubbleColors = []; | ||||||
| @ -577,8 +645,10 @@ export class BubbleChartComponent implements OnInit, OnChanges { | |||||||
|           continue; |           continue; | ||||||
|         } |         } | ||||||
|          |          | ||||||
|         // Calculate radius based on the y-value
 |         // Calculate radius based on the y-value with logarithmic scaling
 | ||||||
|         const r = Math.max(5, Math.min(30, Math.abs(y) / 10)); |         const r = this.logScale(y, minValue, maxValue, minRadius, maxRadius); | ||||||
|  |          | ||||||
|  |         console.log(`Value: ${y}, Radius: ${r}`); | ||||||
|          |          | ||||||
|         // 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; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user