Not the most efficient way but it works, put this in your theme’s functions.php
function author_post_breakdown($author_id){
//get all post of this author
$n = get_posts(array(
'author' => $author_id,
'posts_per_page' => -1,
'fields' => 'ids'
)
);
$cats= array();
//loop over all post of this author and get the categories for each post
foreach((array)$n as $id){
$cs = wp_get_object_terms($id, 'category');
//loop over each category of the post and add the counter
foreach($cs as $c){
if (isset($cats[$c->slug])){
$cats[$c->slug]['count'] = $cats[$c->slug]['count'] + 1;
}else{
$cats[$c->slug]['count'] = 0;
$cats[$c->slug]['name'] = $c->name;
}
}
}
foreach($cats as $sl => $arr)
$retVal="<li><a href="".get_term_link($slug, 'category').'">'.$arr['name'].'('.$arr['count'].')</a></li>';
return $retVal;
}
and in your author.php
add this:
$curauth = (isset($_GET['author_name'])) ? get_user_by('slug', $_GET['author_name']) : get_userdata($_GET['author']);
echo '<ul>'.author_post_breakdown($curauth->ID).'</ul>';