Как создать многофакторную горизонтальную пропорциональную гистограмму с нулевой линией посередине? - PullRequest
0 голосов
/ 06 января 2019

Я хочу создать график в R (см. Изображение Каждый горизонтальный столбец представляет выбор из двух вариантов и количества или пропорций таких случаев ). Я попробовал пакет likert, здесь есть возможность работать только с одной категориальной переменной в одном столбце, но мне нужно две (счетные или пропорциональные) переменные в одном столбце. Данные, которые я пытаюсь найти ниже. Каждая строка - один столбец, растение 1 - слева, растение 2 - справа, Общее количество случаев для отображения, Насекомое - это общее название для всех. Не могли бы вы порекомендовать мне подходящий код или пакет?

+--------+---------+--------+--------------+--------------+
| Insect | Plant1  | Plant2 | Total plant1 | Total plant2 |
+--------+---------+--------+--------------+--------------+
| SF     | Maize   | Cotton |           38 |           12 |
| SF     | Cabbage | Cotton |           40 |           10 |
| SF     | Cabbage | Maize  |           42 |            8 |
+--------+---------+--------+--------------+--------------+

1 Ответ

0 голосов
/ 07 января 2019

Вы можете сделать это с ggplot2.

Пример участка с кодом:

data <- tibble(
  Plant1 = c('Maize', 'Cabbage', 'Cabbage'),
  Plant2 = c('Cotton', 'Cotton', 'Maize'),
  TotalPlant1 = c(38, 40, 42),
  TotalPlant2 = c(12, 10, 8)
)

data %>%
  mutate(row = row_number()) %>%
  gather('x', 'Plant', c(Plant1, Plant2)) %>%
  mutate(
    Total = if_else(x == 'Plant1', TotalPlant1, -TotalPlant2),
    lab_pos = if_else(x == 'Plant1', Total + max(Total) * .02, Total - max(Total) * .02),
    hj = if_else(x == 'Plant1', 0, 1)
  ) %>%
  select(row, Plant, Total, lab_pos, hj) %>%
  ggplot(aes(
    x = row,
    y = Total
  )) +
  geom_col(fill = 'transparent', color = 'black') +
  geom_text(aes(
    y = lab_pos,
    hjust = hj,
    label = Plant
  )) +
  geom_hline(yintercept = 0) +
  coord_flip() +
  xlab('') +
  ylab('') +
  scale_y_continuous(
    breaks = seq(-20, 40, 10),
    labels = seq(-20, 40, 10) %>% abs(),
    expand = expand_scale(mult = c(.2, .2))
  ) +
  theme(
    axis.text.y = element_blank(),
    axis.ticks.y = element_blank(),
    panel.background = element_blank(),
    axis.line.x = element_line()
  )

введите описание изображения здесь

...