In case of using Row aggregations additional None value rows get appended virtualRowData in place of aggregation rows. This renders virtualRowData (as is) not suitable for further use - creating plots, tabels etc.
In your callback with def func(rows) instead of using
df = pd.DataFrame(rows)
you can use:
valid_rows = [row for row in rows if isinstance(row, dict)]
df = pd.DataFrame(valid_rows)
to mitigate the problem.