We use mysql backend, so I can work around some of these limitations by using queries for more complex data such as your point above regarding % changes, it works well for our needs. (quick example below)
Never have managed to work out the css for chart colours but I agree it is much needed to keep on brand.
I have used Zoho Analytics previously which is great but never tried embedding into Noloco.
Shows current month to date (23/06/25) compared to same period in previous years (23/06/24 etc etc)
SELECT
FLOOR(RAND() * 1000000) AS ghlid,
‘This Month’ AS period,
SUM(CASE WHEN YEAR(Compdate) = YEAR(CURDATE())
AND MONTH(Compdate) = MONTH(CURDATE())
AND DAY(Compdate) <= DAY(CURDATE()) THEN IFNULL(pension_fee,0) + IFNULL(broker_fee,0) + IFNULL(comms,0) + IFNULL(commissionFee,0) + IFNULL(investment_fee,0) + IFNULL(conveyancing_fee,0) ELSE 0 END) AS Fees,
COUNT(CASE WHEN YEAR(Compdate) = YEAR(CURDATE()) 
         AND MONTH(Compdate) = MONTH(CURDATE()) 
         AND DAY(Compdate) <= DAY(CURDATE()) THEN 1 END) AS count_value
FROM tbl_lead
UNION ALL
SELECT
FLOOR(RAND() * 1000000) AS ghlid,
‘Last Year’ AS period,
SUM(CASE WHEN YEAR(Compdate) = YEAR(CURDATE()) - 1
AND MONTH(Compdate) = MONTH(CURDATE())
AND DAY(Compdate) <= DAY(CURDATE()) THEN IFNULL(pension_fee,0) + IFNULL(broker_fee,0) + IFNULL(comms,0) + IFNULL(commissionFee,0) + IFNULL(investment_fee,0) + IFNULL(conveyancing_fee,0) ELSE 0 END) AS Fees,
COUNT(CASE WHEN YEAR(Compdate) = YEAR(CURDATE()) - 1
AND MONTH(Compdate) = MONTH(CURDATE())
AND DAY(Compdate) <= DAY(CURDATE()) THEN 1 END) AS count_value
FROM tbl_lead
UNION ALL
SELECT
FLOOR(RAND() * 1000000) AS ghlid,
‘2 years ago’ AS period,
SUM(CASE WHEN YEAR(Compdate) = YEAR(CURDATE()) - 2
AND MONTH(Compdate) = MONTH(CURDATE())
AND DAY(Compdate) <= DAY(CURDATE()) THEN IFNULL(pension_fee,0) + IFNULL(broker_fee,0) + IFNULL(comms,0) + IFNULL(commissionFee,0) + IFNULL(investment_fee,0) + IFNULL(conveyancing_fee,0) ELSE 0 END) AS Fees,
COUNT(CASE WHEN YEAR(Compdate) = YEAR(CURDATE()) - 2
AND MONTH(Compdate) = MONTH(CURDATE())
AND DAY(Compdate) <= DAY(CURDATE()) THEN 1 END) AS count_value
FROM tbl_lead