Как сделать гистограмму из путаницы - PullRequest
1 голос
/ 13 апреля 2020

У меня есть две категориальные переменные, которые я хочу сравнить с помощью кросс-табуляции. Я сделал фиктивный пример расширенной квадратной таблицы на случай непредвиденных обстоятельств, где категории X находятся в строках таблицы, а та же последовательность категорий для Y - в столбцах таблицы. Таблица суммирует связь между X и Y.

Диагональные записи таблицы дают количество наблюдений, для которых категория X соответствует категории Y, и в этом случае наблюдения являются попаданиями для этой категории. Каждая недиагональная запись является ложной тревогой для категории X и пропуском для категории Y.

расширенная квадратная таблица сопряженности

Graph1

Я хочу создать столбчатую диаграмму в виде столбца, которая будет отображать каждую строку таблицы с заполненными цветами из столбцов (переменная 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()
  ) 

Plot1 показывает результат. Проблема в том, что порядок компонентов в составных столбцах не прав. Буду признателен, если кто-нибудь сможет объяснить Как я могу расположить компоненты бара?

Для построения 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))

plot2 Я доволен этим сюжетом. Но то, что я хочу, это иметь и plot1, и plot 2 на одном графике, как показано на графике1. Может ли кто-нибудь предоставить руководство о том, как рисовать графики с накоплением столбцов из разных фреймов данных. Или есть лучший способ сделать graph1.

1 Ответ

0 голосов
/ 13 апреля 2020

«Как я могу расположить компоненты бара?»

Хитрость заключается в том, чтобы использовать атрибут levels столбца типа (например, категории здесь) , Нужно, чтобы приказ был отменен.

Я хочу, чтобы и сюжет 1, и сюжет 2 были на одном графике, как показано на графике 1.

Если вы хотите просто воспроизвести Graph1 с Ваш код, это работает:

#-------------------
#Data wrangling
colnames(g1.df)[1] <-categories; colnames(g1.df)[2] <- variable; #change the names similar to 2nd df
g1.df1.m[,3] <- as.numeric(g1.df1.m[,3]);# changing column type from character to numeric as the correpsonding column in `g1.df` is numeric.
g1.dfCombined <- g1.df %>% bind_rows(g1.df1.m); #merging two dfs.
#this is the part that reverses the order:
g1.dfCombined$categories <- factor(g1.dfCombined$categories, rev(levels(g1.dfCombined$categories)))

#-------------------
#Plotting: (all same except dropped `scale_x_discrete(limit = c("D", "C", "B", "A"))`)
ggplot(data=g1.dfCombined, mapping=aes(fill=categories, y=value, x=variable, 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_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())

enter image description here

ПРИМЕЧАНИЕ: Вероятно, будет хорошей идеей использовать разные значения (например, использовать 1,2,3, ... вместо A,B,C, поскольку последний используется дважды с двумя разными переменными categories & variable, что может создать путаницу.)

...