Как создать фактор на основе нескольких столбцов для построения - PullRequest
0 голосов
/ 11 октября 2019

Я хочу создать барплот с двумя категориями a и b, где цвет столбца зависит от категории. Для них обоих у меня есть строки x, которые определяют порядок категорий. Значение в x может встречаться в обеих категориях. Теперь я хочу найти способ построения столбцов на основе двух вещей: сначала все элементы x, которые принадлежат категории 'a' в их лексикологическом порядке, затем то же самое для элементов, которые принадлежат категории b. В идеале без создает искусственный столбец x вдоль линий str_c(x, y), поскольку они уже закодированы в легенде. Кроме того, фасетирование не является опцией, поскольку это уже сделано для другого столбца.

Я нашел решение , которое явно перекрывает x-метки теми метками, которые я хочу, но я бы хотелчтобы увидеть менее хакерский и потенциально подверженный ошибкам способ!

library(tidyverse)
set.seed(1)

df <-
  tibble(
    x = c('1', '0', '0', '1'),
    y = c('a', 'a', 'b', 'b'),
    z = runif(4)
  )


df %>%
  arrange(y, x) %>%
  mutate(ordering = str_c(y, '_', x)) %>%
  {
    ggplot(., aes(ordering, z, fill = y)) +
    geom_col() +
    scale_x_discrete(labels = pull(., x))
  }

1 Ответ

0 голосов
/ 11 октября 2019

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

df %>%
  arrange(y, x) %>%      
  ggplot(aes(interaction(x, y), z, fill = y)) +
  geom_col() +
  scale_x_discrete(labels = parse_number)

enter image description here

labels также может принимать функцию, а не только символьный вектор. Таким образом, здесь я передаю parse_number, который анализирует ввод как число, тем самым удаляя любые символы. Вместо создания нового столбца ordering вы можете использовать interaction.

Если вы используете не числа, а что-то еще, вы можете извлечь исходные значения x с помощью

my_df %>%
  arrange(y, x) %>%
  ggplot(aes(interaction(x, y, sep = "_"), z, fill = y)) +
  geom_col() +
  scale_x_discrete("x-axis", 
                   labels = function(x) str_remove(x, "_.*$"))

По умолчанию sep в interaction представляет собой точку, которой может соответствовать \\. в функции str_remove, но вы также можете указать любой другой символ, который не является частью ваших меток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...