One approach is this
union isfuzzy = true
(
SigninLogs
| where TimeGenerated between ( startofday(now(),-2) .. endofday(now(),-2) ) // results from previous day -2
| summarize prev_2=count() by UserPrincipalName, bin(TimeGenerated,1h)
)
,
(
SigninLogs
| where TimeGenerated between ( startofday(now(),-1) .. endofday(now(),-1) ) // results from yesterday
| summarize prev_1=count() by UserPrincipalName, bin(TimeGenerated,1h)
)
| order by TimeGenerated asc
// manipulate TimeGenerated, so that only one day is used
| extend TimeGenerated = iif (isnotempty(prev_2), TimeGenerated = TimeGenerated +1d, TimeGenerated)
| summarize by prev_1, prev_2, TimeGenerated
| render timechart
I used Signinlogs as an example
I think I prefer a columnchart, but a timechart works almost as well