R: Сопряжение наборов столбцов в geom_col для визуализации хи-квадрат? - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь соединить столбцы «Наблюдаемые» и «Ожидаемые» для количества пластиков c на каждом сайте, но не могу понять, как включить мои столбцы «Ожидаемые» в график geom_col. Мой отчет должен быть готов 30-го числа (ура!)

Я бы хотел что-нибудь похожее на это (см. Ниже), но без использования Excel (я провел 2 дня в R, пытаясь взломать его, и я полон решимости успешно!)

enter image description here

Мой фрейм данных выглядит следующим образом:

df <- data.frame(
  Site_name = c("Albermarle", "Cabo Douglas", "Punta Puntas", 
                "Floreana Black Beach", "Punta Cormoran", "Loberia"),       Plastic_pieces = c(44, 215, 29, 31, 42, 260),
  Expected = rep(c(103.5), times = 6))

Мой код geom_col пока что:

ggplot(df, aes(x=Site.Name, y=Plastic_pieces, fill = Site.Name ))+
  geom_col()+
  theme_classic()+
  labs(y="Number of macroplastic pieces", x="Site Name")+
  theme(axis.line.x = element_line(size = 0.3, colour = "black"),
        axis.line.y = element_line(size = 0.3, colour = "black"),
        axis.line = element_line(size=1, colour = "black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        text=element_text(size = 12),
        axis.text.x=element_text(colour="black", size = 8),
        axis.text.y=element_text(colour="black", size = 12),
        axis.text.x.bottom = element_blank(),
        axis.title.x = element_blank(),
        axis.ticks.x.bottom = element_blank())+
        scale_fill_discrete(name="Site Name")+
  geom_text(aes(label=Plastic_pieces), position=position_dodge(width=0.9), vjust=-0.25)

enter image description here

Я видел в Интернете код, который выглядел так, как будто он может помочь, но я получил почти тот же результат, что и выше, за исключением того, что полосы были в порядке убывания:

df %>%
  group_by(Plastic_pieces, Expected) %>%
  summarise(n=sum(Plastic_pieces, na.rm = TRUE)) %>%
  arrange(desc(Plastic_pieces)) %>%
  ggplot(aes(x=df$Site.Name, y=Plastic_pieces, fill = df$Site.Name)) +
  geom_col(position='dodge')

enter image description here

Если кто-то может помочь, я был бы очень признателен!

Ура!

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Вот простое и краткое решение для этого. Все, что вам нужно сделать, это использовать melt() для преобразования ваших данных и вызвать position = position_dodge() в вашем вызове geom_col().

См. Здесь код, который я использовал для построения ваших данных примера.

df <- data.frame(
  Site_name = c("Albermarle", "Cabo Douglas", "Punta Puntas", 
                "Floreana Black Beach", "Punta Cormoran", "Loberia"),       Plastic_pieces = c(44, 215, 29, 31, 42, 260),
  Expected = rep(c(103.5), times = 6))

library(reshape2)
df_melt = melt(df, id.vars = "Site_name")

ggplot(df_melt, aes(x = Site_name, y = value, fill = variable)) + 
  geom_col(position = position_dodge())
0 голосов
/ 18 июня 2020

Решение этого типа вопросов - многократно преобразовывать данные из широкого в длинный формат . Я сделаю это с пакетами dplyr и tidyr.

library(dplyr)
library(tidyr)
library(ggplot2)

df %>%
  pivot_longer(
    cols = -1,
    names_to = 'Group',
    values_to = 'Value'
  ) %>%
  ggplot(aes(Site_name, Value, fill = Group)) +
  geom_col(position = position_dodge()) +
  geom_text(aes(label = Value), position = position_dodge(width = 0.9), vjust = -0.25) +
  labs(y="Number of macroplastic pieces", x="Site Name") +
  theme_classic() +
  theme(axis.text.x = element_text(angle = 60,hjust = 1))

enter image description here

...