-
Notifications
You must be signed in to change notification settings - Fork 0
/
plot.crosstab.R
90 lines (76 loc) · 3.04 KB
/
plot.crosstab.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#' @title Plot a crosstab object
#' @description This function plots the results of a calculated two-way
#' frequency table.
#' @param x An object of class \code{crosstab}
#' @param size numeric. Size of bar text labels.
#' @param ... no currently used.
#' @return a ggplot2 graph
#' @rdname plot.crosstab
#' @import ggplot2
#' @export
#' @examples
#' tbl <- crosstab(cars74, cyl, gear, type = "freq")
#' plot(tbl)
#'
#' tbl <- crosstab(cars74, cyl, gear, type = "colpercent")
#' plot(tbl)
plot.crosstab <- function(x, size=3.5, ...) {
if(!inherits(x, "crosstab")) stop("Object must be of type crosstab")
title <- paste(x$rowname, " by ", x$colname)
plotdata <- as.data.frame(x$table)
if (x$type == "freq"){
plotdata$lbl <- as.character(plotdata$Freq)
plotdata$lbl <- ifelse(plotdata$lbl == "0", "", plotdata$lbl)
rowvar <- names(plotdata)[1]
colvar <- names(plotdata)[2]
p <- ggplot(plotdata,
aes_string(x=rowvar, y="Freq", fill=colvar)) +
geom_bar(stat="identity", position="stack") +
geom_text(aes(label=.data[["lbl"]]), size=size,
position=position_stack(vjust=0.5)) +
labs(y="Frequency", title=title, subtitle="cell counts")
}
if (x$type == "percent"){
plotdata$lbl <- paste(round(plotdata$Freq * 100), "%", sep="")
plotdata$lbl <- ifelse(plotdata$lbl == "0%", "", plotdata$lbl)
rowvar <- names(plotdata)[1]
colvar <- names(plotdata)[2]
p <- ggplot(plotdata,
aes_string(x=rowvar, y="Freq", fill=colvar)) +
geom_bar(stat="identity", position="stack") +
geom_text(aes(label=.data[["lbl"]]), size=size,
position=position_stack(vjust=0.5)) +
labs(y="Percent", title=title, subtitle="cell percents")
}
if (x$type == "rowpercent"){
plotdata$lbl <- paste(round(plotdata$Freq * 100), "%", sep="")
plotdata$lbl <- ifelse(plotdata$lbl == "0%", "", plotdata$lbl)
rowvar <- names(plotdata)[1]
colvar <- names(plotdata)[2]
p <- ggplot(plotdata,
aes_string(x=rowvar, y="Freq", fill=colvar)) +
geom_bar(stat="identity", position="fill") +
geom_text(aes(label=.data[["lbl"]]), size=size,
position=position_stack(vjust=0.5)) +
scale_y_continuous(labels=c("0%", "25%", "50%", "75%", "100%")) +
labs(y="Percent", title=title, subtitle="row percents") +
coord_flip()
}
if (x$type == "colpercent") {
plotdata$lbl <- paste(round(plotdata$Freq * 100), "%", sep="")
plotdata$lbl <- ifelse(plotdata$lbl == "0%", "", plotdata$lbl)
rowvar <- names(plotdata)[2]
colvar <- names(plotdata)[1]
p <- ggplot(plotdata,
aes_string(x=rowvar, y="Freq", fill=colvar)) +
geom_bar(stat="identity", position="fill") +
geom_text(aes(label=.data[["lbl"]]), size=size,
position=position_stack(vjust=0.5)) +
scale_y_continuous(labels=c("0%", "25%", "50%", "75%", "100%")) +
labs(y="Percent", title=title, subtitle="column percents")
}
if (!is.null(x$chisquare)){
p <- p + labs(caption=x$chisquare)
}
return(p)
}