нанесення на підмножину згрупованих даних у ggplot2

Я намагаюся створити графік із значенням (+/- SD) ( ID = загальна кількість за рядок) Explorations на осі у, а потім групувати за як pp , так і тип на осі x.

That is, I want to generate something that looks like this (hand-drawn and made up graph): enter image description here

Нижче наведено структуру структури даних (доступно тут ).

pp crossingtype    km type  ID
0     Complete  80.0  DCC  10
1     Complete  80.0  DCC   4
0  Exploration  80.0  DCC  49
1  Exploration  80.0  DCC   4
0     Complete 144.0  DWC 235
1     Complete 144.0  DWC  22
0  Exploration 144.0  DWC 238
1  Exploration 144.0  DWC  18
1  Exploration  84.0   PC  40
0     Complete 107.0   PC  43
1     Complete 107.0   PC  22
0  Exploration 107.0   PC 389

Я хочу використовувати ggplot2 і спробував цей код:

ggplot(expMean, aes(x=as.factor(pp), y=crossingtype, color=factor(type),group=factor(type))) 
    + geom_point(shape=16,cex=3) 
    + geom_smooth(method=lm) 
    + facet_grid(.~type)

But it gives me this figure (which is not what I am trying to make). enter image description here

Як використовувати ggplot2 для створення першого сюжету?

0
Коли ви говорите "середнє число досліджень", це звучить так, як ви хочете отримати середнє значення стовпця ідентифікатора, але лише для рядків, де перетинає тип "Дослідження". Це правильно?
додано Автор joran, джерело

6 Відповіді

Ось підхід, який я використав. Використовується колір замість подвійної осі x.

Зауважте, що я завантажив дані до мого робочого каталогу, тому команду read.table може бути потрібно змінити

library(dplyr)
library(ggplot2)
dat <- read.table("figshare.txt")

dat <- droplevels(filter(dat, crossingtype == "Exploration"))
dat <- dat %>%
  group_by(pp, type) %>% 
  summarise(val = mean(ID),
        SD = sd(ID))

ggplot(dat, aes(x = type, y = val, colour = as.factor(pp), group = 
     as.factor(pp))) +
  geom_point(size = 3, position = position_dodge(width = 0.2)) +
  geom_errorbar(aes(ymax = val + SD, ymin = val - SD), position = 
     position_dodge(width = 0.2), width = 0.2) +
  labs(y = "Mean # of explorations (+/- SD", colour = "pp")

enter image description here

1
додано
Так, досить справедливо. Ви завжди можете замінити аргументи color вище для форми , а потім друкувати сірим кольором
додано Автор Conor Neilson, джерело
Я намагався уникнути кольору для подання журналу. Але ваша пропозиція була корисною!
додано Автор Blundering Ecologist, джерело

Ось підхід, який я використав. Використовується колір замість подвійної осі x.

Зауважте, що я завантажив дані до мого робочого каталогу, тому команду read.table може бути потрібно змінити

library(dplyr)
library(ggplot2)
dat <- read.table("figshare.txt")

dat <- droplevels(filter(dat, crossingtype == "Exploration"))
dat <- dat %>%
  group_by(pp, type) %>% 
  summarise(val = mean(ID),
        SD = sd(ID))

ggplot(dat, aes(x = type, y = val, colour = as.factor(pp), group = 
     as.factor(pp))) +
  geom_point(size = 3, position = position_dodge(width = 0.2)) +
  geom_errorbar(aes(ymax = val + SD, ymin = val - SD), position = 
     position_dodge(width = 0.2), width = 0.2) +
  labs(y = "Mean # of explorations (+/- SD", colour = "pp")

enter image description here

1
додано
Так, досить справедливо. Ви завжди можете замінити аргументи color вище для форми , а потім друкувати сірим кольором
додано Автор Conor Neilson, джерело
Я намагався уникнути кольору для подання журналу. Але ваша пропозиція була корисною!
додано Автор Blundering Ecologist, джерело

Is this what you want? This filters the data to only include Exploration, uses ID as the y variable, groups by pp and facets on type

tbl <- read_table2(
  "pp crossingtype  km  type ID
  0     Complete  80.0  DCC  10
  1     Complete  80.0  DCC   4
  0  Exploration  80.0  DCC  49
  1  Exploration  80.0  DCC   4
  0     Complete 144.0  DWC 235
  1     Complete 144.0  DWC  22
  0  Exploration 144.0  DWC 238
  1  Exploration 144.0  DWC  18
  1  Exploration  84.0   PC  40
  0     Complete 107.0   PC  43
  1     Complete 107.0   PC  22
  0  Exploration 107.0   PC 389"
) %>%
  mutate(pp = factor(pp))

ggplot(data = tbl %>% filter(crossingtype == "Exploration")) +
  geom_boxplot(aes(x = pp, y = ID)) + 
  facet_wrap(~type)

Для запуску цього коду на зв'язаному наборі даних я ввів цей код:

Boxplot for entire linked dataset

1
додано
Це було тільки про те, що я шукав. Дякуємо за вашу пропозицію.
додано Автор Blundering Ecologist, джерело

Is this what you want? This filters the data to only include Exploration, uses ID as the y variable, groups by pp and facets on type

tbl <- read_table2(
  "pp crossingtype  km  type ID
  0     Complete  80.0  DCC  10
  1     Complete  80.0  DCC   4
  0  Exploration  80.0  DCC  49
  1  Exploration  80.0  DCC   4
  0     Complete 144.0  DWC 235
  1     Complete 144.0  DWC  22
  0  Exploration 144.0  DWC 238
  1  Exploration 144.0  DWC  18
  1  Exploration  84.0   PC  40
  0     Complete 107.0   PC  43
  1     Complete 107.0   PC  22
  0  Exploration 107.0   PC 389"
) %>%
  mutate(pp = factor(pp))

ggplot(data = tbl %>% filter(crossingtype == "Exploration")) +
  geom_boxplot(aes(x = pp, y = ID)) + 
  facet_wrap(~type)

Для запуску цього коду на зв'язаному наборі даних я ввів цей код:

Boxplot for entire linked dataset

1
додано
Це було тільки про те, що я шукав. Дякуємо за вашу пропозицію.
додано Автор Blundering Ecologist, джерело

Ви можете зробити статистичні перетворення в межах ggplot() , але мені спочатку потрібно обробити дані, а потім сформулювати результати.

library(tidyverse)
expMean %>% 
  filter(crossingtype == "Exploration") %>% 
  group_by(type, pp) %>% 
  summarise(Mean = mean(ID), SD = sd(ID)) %>% 
  ggplot(aes(factor(pp), Mean)) + 
    geom_pointrange(aes(ymax = Mean + SD, 
                        ymin = Mean - SD)) + 
    facet_wrap(~type) +
    theme_bw()

enter image description here

1
додано
Просто використовуйте тему + (panel.border = element_blank ()) , щоб видалити поля навколо кожного аспекту. Інший варіант - використовувати + theme_minimal() замість theme_bw() . Щоб перемістити позначки смуги фаски, використовуйте facet_wrap (~ тип, switch = "x") .
додано Автор neilfws, джерело
Це було дуже корисно. У мене є два наступних запитання про естетику фігури при використанні ggplot() . 1) Чи є спосіб видалити коробки, що розділяють три ділянки? (Коли я використовую тему (panel.border = element_blank (), panel.grid.major = element_blank (), panel.grid.minor = element_blank ()) все йде.) чи є спосіб перемістити заголовки (DCC, DWC, PC) нижче?
додано Автор Blundering Ecologist, джерело
Я продовжив пошук і знайшов відповідь на питання №2, який ви надали на запитання користувача в іншому місці. .com/questions/43268416/& hellip;
додано Автор Blundering Ecologist, джерело

Ви можете зробити статистичні перетворення в межах ggplot() , але мені спочатку потрібно обробити дані, а потім сформулювати результати.

library(tidyverse)
expMean %>% 
  filter(crossingtype == "Exploration") %>% 
  group_by(type, pp) %>% 
  summarise(Mean = mean(ID), SD = sd(ID)) %>% 
  ggplot(aes(factor(pp), Mean)) + 
    geom_pointrange(aes(ymax = Mean + SD, 
                        ymin = Mean - SD)) + 
    facet_wrap(~type) +
    theme_bw()

enter image description here

1
додано
Просто використовуйте тему + (panel.border = element_blank ()) , щоб видалити поля навколо кожного аспекту. Інший варіант - використовувати + theme_minimal() замість theme_bw() . Щоб перемістити позначки смуги фаски, використовуйте facet_wrap (~ тип, switch = "x") .
додано Автор neilfws, джерело
Це було дуже корисно. У мене є два наступних запитання про естетику фігури при використанні ggplot() . 1) Чи є спосіб видалити коробки, що розділяють три ділянки? (Коли я використовую тему (panel.border = element_blank (), panel.grid.major = element_blank (), panel.grid.minor = element_blank ()) все йде.) чи є спосіб перемістити заголовки (DCC, DWC, PC) нижче?
додано Автор Blundering Ecologist, джерело
Я продовжив пошук і знайшов відповідь на питання №2, який ви надали на запитання користувача в іншому місці. .com/questions/43268416/& hellip;
додано Автор Blundering Ecologist, джерело