windows(width=1200, height=600) layout(t(1:2)) # palette("Okabe-Ito") palette("R3") library(HistData) library(plotrix) # Data Nightingale # 'data.frame': 24 obs. of 10 variables: # $ Date : Date, format: "1854-04-01" "1854-05-01" "1854-06-01" "1854-07-01" ... # $ Month : Ord.factor w/ 12 levels "Jan"<"Feb"<"Mar"<..: 4 5 6 7 8 9 10 11 12 1 ... # $ Year : int 1854 1854 1854 1854 1854 1854 1854 1854 1854 1855 ... # $ Army : int 8571 23333 28333 28722 30246 30290 30643 29736 32779 32393 ... # $ Disease : int 1 12 11 359 828 788 503 844 1725 2761 ... # $ Wounds : int 0 0 0 0 1 81 132 287 114 83 ... # $ Other : int 5 9 6 23 30 70 128 106 131 324 ... # $ Disease.rate: num 1.4 6.2 4.7 150 328.5 ... # $ Wounds.rate : num 0 0 0 0 0.4 ... # $ Other.rate : num 7 4.6 2.5 9.6 11.9 27.7 50.1 42.8 48 120 ... # Using *.rate # Rose chart of Nightingale should be shown as the area being proportionate to the numbers. # Therefore, radial.extents in radial.pie() should be given as radius of circular sector. radius <- function(X) { if (is.vector(X)) { ret <- numeric(length(X)) } else { ret <- numeric(nrow(X)) } for (i in 1:length(ret)) { ret[i] <- ifelse(is.vector(X), sapply(X[i]/pi*12, sqrt), sapply(rowSums(X[i,])/pi*12, sqrt)) } return(ret) } # From April 1854 to March 1855 scales1 <- pretty(seq(0, max(radius(Nightingale[1:12, 8:10])), len=5)) radial.pie(radius(Nightingale[1:12,8:10]), sector.colors=rep("lightblue",12), radial.lim=scales1, radial.labels=NA, labels=Nightingale[12:1, 1], clockwise=TRUE, start=0) radial.pie(radius(Nightingale[1:12,9:10]), sector.colors=rep("darkgreen",12), radial.labels=NA, clockwise=TRUE, start=0, add=TRUE) radial.pie(radius(Nightingale[1:12,9]), sector.colors=rep("darkred",12), radial.labels=NA, clockwise=TRUE, start=0, add=TRUE) legend("bottomright", fill=c("lightblue", "darkgreen", "darkred"), legend=c("Disease", "Other", "Wounds")) # From April 1855 to March 1856 # The scale of the chart below should be the same as above # For that, radial.lim=c(0, max(rowSums(Nightingale[1:24, 8:10]))) can be used. # However, due to the inappropriate implementation in radial.pie(), that is, # if (!add) { ... maxrad <- max(unlist(radial.extents)) # It shoule be # if (!add) { ... maxrad <- max(radial.lim) scales2 <- pretty(seq(0, max(radius(Nightingale[13:24, 8:10])), len=5)) radial.pie(radius(Nightingale[13:24,8:10]), sector.colors=rep("lightblue",12), radial.lim=scales2, radial.labels=NA, labels=Nightingale[24:13, 1], clockwise=TRUE, start=0) radial.pie(radius(Nightingale[13:24,9:10]), sector.colors=rep("darkgreen",12), radial.labels=NA, clockwise=TRUE, start=0, add=TRUE) radial.pie(radius(Nightingale[13:24,9]), sector.colors=rep("darkred",12), radial.labels=NA, clockwise=TRUE, start=0, add=TRUE)