Skip to contents

This example shows the use of PieGlyph package to replace the points in a time series plot with pie charts showing the proportions of different variables. Generally, time series plots don’t have an aspect ratio of 1 as the width of the plot is very large compared to the height. Due to this wide nature of time series plots previous attempts at adding pie-charts to the plot resulted in the circular pie-charts getting flattened into ellipses. This could be rectified by forcing the user to make the plot have equal dimensions, however that caused more problems as the resultant plots then became squashed between white space. These issues rendered the plots uninterpretable.

The PieGlyph package attempts to solve this problem by creating axis invariant pie-charts which wouldn’t get squashed into ellipses and also wouldn’t get scaled along with the plot dimensions.

Load Packages

Load data

The data used for this example is the Seatbelts data which shows the monthly totals of car drivers and passengers killed or seriously injured from Jan 1969 to Dec 1984 in Great Britain.

Seatbelts <- data.frame(Seatbelts, time = time(Seatbelts))
head(Seatbelts)
#>   DriversKilled drivers front rear   kms PetrolPrice VanKilled law     time
#> 1           107    1687   867  269  9059   0.1029718        12   0 1969.000
#> 2            97    1508   825  265  7685   0.1023630         6   0 1969.083
#> 3           102    1507   806  319  9963   0.1020625        12   0 1969.167
#> 4            87    1385   814  407 10955   0.1008733         8   0 1969.250
#> 5           119    1632   991  454 11823   0.1010197        10   0 1969.333
#> 6           106    1511   945  427 12391   0.1005812        13   0 1969.417

For each month over the 15 years the variables DriversKillled gives the number of car drivers killed, drivers describes the number of car drivers killed or seriously injured, front gives the number of front-seat passengers killed or seriously injured and rear gives the number of rear-seat passengers killed or seriously injured, VanKilled contains the number of van (‘light goods vehicle’) drivers killed, kms gives the number of kilometers driven in the particular month while PetrolPrice contains the price of petrol. Finally, law describes whether or not it was compulsory to wear seat belts.

For the visualisation we’ll be using a subset of the Seatbelts data from Jan 1980 to Dec 1984.

plot_data <- Seatbelts[133:192, ]
head(plot_data)
#>     DriversKilled drivers front rear   kms PetrolPrice VanKilled law     time
#> 133           115    1665   748  306 14027   0.1037750         7   0 1980.000
#> 134            95    1361   593  263 14478   0.1071142         4   0 1980.083
#> 135            92    1506   720  323 16155   0.1073748        10   0 1980.167
#> 136           100    1360   646  310 16585   0.1116954         4   0 1980.250
#> 137            95    1453   765  424 18117   0.1106382         8   0 1980.333
#> 138           114    1522   820  403 17552   0.1118552         8   0 1980.417

The number of kilometers driven in each month changes over time. It would be difficult to visualise this change over time whilst also showing the proportion of drivers/passengers injured over the time period using a simple time series plot. However, if we replace the points in the plot with pie-charts we can simultaneously visualise both the distance traveled and the proportion of injuries over time.

Create Plots

Problems with existing techniques

Create a pie-chart plot for the Seatbelts data using the scatterpie R package.

p <- ggplot(plot_data, aes(x = time, y = kms))+
        geom_line(linewidth = 1)+
        geom_scatterpie(aes(x = time, y = kms), 
                        colour = 'black', 
                        data = plot_data,
                        cols = c('drivers','front', 'rear'))+
        theme_minimal()

As mentioned before the pie-charts are squished due to the wide nature of the plot and are illegible.

Using coord_fixed() to fix the plot dimensions worsens the problem further and renders the plot unintelligible.

Fixing the problems using PieGlyph

PieGlyph fixes this problem by creating the pie charts independently of the plot axes and thus the plot dimensions have no effects on the pie charts

pl <- ggplot(plot_data, aes(x = time, y = kms))+
        # Add the lines joining the pie-charts
        geom_line(linewidth = 1)+
        # Add pie-chart showing proportion of people injured
        geom_pie_glyph(colour = 'black',
                       slices = c('drivers', 'front', 'rear'))+
        # Change theme of plot
        theme_minimal()
pl    

We can also highlight the months where the seatbelt law was in effect, by mapping them to the pie-borders.

pl <- ggplot(plot_data, aes(x = time, y = kms))+
        # Add the lines joining the pie-charts
        geom_line(linewidth = 1)+
        # Add pie-chart showing proportion of people injured
        # Also map the pie-borders to show whether seatbelt law was present
        geom_pie_glyph(aes(linetype = as.factor(law)),
                       colour = 'black',
                       slices = c('drivers', 'front', 'rear'))+
        # Adjust the style of borders
        scale_linetype_manual(values = c(0, 1),
                              labels = c('No', 'Yes'))+
        # Plot theme
        theme_minimal()
pl    

We can then adjust any aesthetics of our choice in the plot using the usual ggplot functions.

pl + 
  # Colours of the pie-sectors
  scale_fill_manual(values = c('#56B4E9','#F0E442','#CC79A7'))+
  # Axis and legend titles
  labs(x = 'Year', y = 'Km driven',
       fill = 'People Injured', linetype = 'Law in Effect?')