У меня есть две категориальные переменные, которые я хочу сравнить с помощью кросс-табуляции. Я сделал фиктивный пример расширенной квадратной таблицы на случай непредвиденных обстоятельств, где категории X находятся в строках таблицы, а та же последовательность категорий для Y - в столбцах таблицы. Таблица суммирует связь между X и Y.
Диагональные записи таблицы дают количество наблюдений, для которых категория X соответствует категории Y, и в этом случае наблюдения являются попаданиями для этой категории. Каждая недиагональная запись является ложной тревогой для категории X и пропуском для категории Y.
расширенная квадратная таблица сопряженности
Я хочу создать столбчатую диаграмму в виде столбца, которая будет отображать каждую строку таблицы с заполненными цветами из столбцов (переменная Y). И последние два бара, показывающие пропуски и ложные тревоги для каждой категории.
Мне удалось сделать два отдельных графика. Код ниже генерирует первые четыре строки в графе 1.
# Create Dummy Input
sample.mtxx <- matrix(c(1,0,2,0,0,3,0,3,2,3,3,0,0,0,0,3), nrow = 4)
categories <- c("A","B","C","D")
colnames(sample.mtx) <- paste(categories)
rownames(sample.mtx) <- paste(categories)
# Change from wide to long format
g1.df <- melt(sample.mtx)
# Zero sizes were causing problem so I removed them.
g1.df <- g1.df[g1.df$value!=0,]
# Add a label column to show "Hit".
g1.df$label <- ifelse(g1.df$Var1==g1.df$Var2, "Hit", as.character(""))
# Plotting
plot1 <- ggplot(data=g1.df, mapping=aes(fill=Var2, y=value, x=Var1, label = label))+
geom_bar(width = 0.6, position="stack", stat="identity")+
labs(x="Table Feature", y="Entry size as the number of observations", title="Entry Size") +
geom_text(size = 4, position = position_stack(vjust = 0.5))+
coord_flip()+
theme_bw()+
scale_x_discrete(limit = c("D", "C", "B", "A"))+
scale_y_discrete(limits=seq(0,10,1))+
theme(plot.title = element_text(family = "Times", color = "#353535",
face = "bold", size = 12, hjust = 0.5))+
theme(legend.position = "bottom", legend.title = element_blank())+
theme(
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank()
)
показывает результат. Проблема в том, что порядок компонентов в составных столбцах не прав. Буду признателен, если кто-нибудь сможет объяснить Как я могу расположить компоненты бара?
Для построения Misses and False Alarms
я написал следующее:
# Hits, False Alarm, and Miss
hits <- diag(sample.mtx)
false.alarms <- rowSums(sample.mtx) - hits
misses <- colSums(sample.mtx) - hits
# Make a data frame
g1.df1 <- as.data.frame(cbind(categories, misses, false.alarms))
# Change it to long format and get rid of zero sizes.
g1.df1.m <- melt(g1.df1, id.vars="categories")
g1.df1.m <- g1.df1.m[g1.df1.m$value!=0,]
# Plotting
plot2 <- ggplot(data=g1.df1.m, inherit.aes = FALSE, mapping=aes(fill=categories, y=value, x=variable))+
geom_bar(width = 0.6, position="stack", stat="identity")+
coord_flip()+
theme_bw()+
theme(legend.position = "none")+
scale_x_discrete(limit = c("misses", "false.alarms"))+
scale_y_discrete(limits=seq(0,10,1))
Я доволен этим сюжетом. Но то, что я хочу, это иметь и plot1, и plot 2 на одном графике, как показано на графике1. Может ли кто-нибудь предоставить руководство о том, как рисовать графики с накоплением столбцов из разных фреймов данных. Или есть лучший способ сделать graph1.