R: изменить имя переменной в ggplot - PullRequest
1 голос
/ 20 марта 2019

Для имен переменных, записанных в форме «текст + число» (например, Day1, Day2, ...), возможно ли их отсортировать при использовании ggplot?

library(ggplot2)

dogname = paste0('dog', 1:20)
dt = as.data.frame(cbind(dogname, seq(1,10.5,0.5)))
colnames(dt) = c('name', 'age')

ggplot(dt, aes(x=name, y=age))+
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  geom_line() +
  geom_point()

Приведенный выше код генерирует следующий график, однако за dog1 следует dog10 вместо dog2. Можно ли было бы отсортировать его от малого до большого числа?

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Вот способ, использующий только tidyverse пакеты. Мы можем получить номер из имени с помощью str_extract, так как я представляю, что вам даны эти имена в некотором порядке, а не в том, чтобы создавать их с нуля. Затем мы можем использовать fct_reorder, чтобы упорядочить имя, отсортировав его по номеру как число , а не как строку. Вы можете видеть, что dt$name теперь является фактором с уровнями в правильном порядке.

library(tidyverse)
dt <- tibble(
  name = str_c("dog", 1:20),
  age = seq(1,10.5,0.5)
) %>%
  mutate(
    order = str_extract(name, "\\d+") %>% as.integer,
    name = fct_reorder(name, order)
  )
dt$name
#>  [1] dog1  dog2  dog3  dog4  dog5  dog6  dog7  dog8  dog9  dog10 dog11
#> [12] dog12 dog13 dog14 dog15 dog16 dog17 dog18 dog19 dog20
#> 20 Levels: dog1 dog2 dog3 dog4 dog5 dog6 dog7 dog8 dog9 dog10 ... dog20

ggplot(dt, aes(x=name, y=age))+
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  geom_line() +
  geom_point()
#> geom_path: Each group consists of only one observation. Do you need to
#> adjust the group aesthetic?

Создано в 2019-03-20 пакетом представ. (v0.2.1)

0 голосов
/ 20 марта 2019

Вот решение, использующее gtools для упорядочения значений.

library(gtools)
library(tidyverse)

dt %>% 
  mutate(name = factor(as.character(dt$name), 
                       levels = mixedsort(as.character(dt$name)))) %>% 
  ggplot(aes(x = name, y = age))+
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  geom_line() +
  geom_point()

Plot

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