Do you have a table with one record for each expense item (20 records total in your example) linked to your expense transactions?
If you had such a table, you could base your layout on that table, sort the records in descending order by total expense and omit the last 20 records from the found set.
There are also ways to use ExecuteSQL to produce delimited data for charting and there are ways to limit the data returned by ExecuteSQL to just the first 10 rows of data returned by this function.
I created 2 new fields
Client:::ExpenseRank which I set at 10
Created new relationship
Client::ExpenseRank greater than or equal to Expense::ExpenseRank
and then in a script I
Get Found set of Expenses
Sort by Total$ descending
This works great and I was already running script when going to this layout.