Переупорядочить ось ggplot по одному значению, отобразить метки из другого - PullRequest
1 голос
/ 22 апреля 2020

Ситуация следующая:
У меня много имен и много соответствующих кодов для этих имен.
Все разные имена имеют уникальный код, но не все разные коды имеют уникальное имя.

Это создало проблему при построении данных, поскольку мне нужно group_by(code) и reorder(name,code) при построении, но коды бессмысленны, и я хочу отобразить имена. Поскольку некоторые коды имеют общие имена, это создает небольшую проблему.

Пример для иллюстрации ниже:

library(tidyverse)
set.seed(1)

# example df
df <- tibble("name" = c('apple','apple','pear','pear','pear',
                        'orange','banana','peach','pie','soda',
                        'pie','tie','beer','picnic','cigar'),
             "code" = seq(1,15),
             "value" = round(runif(15,0,100)))
df %>% 
  ggplot(aes(x=reorder(name,value)))+
  geom_bar(aes(y=value),
           stat='identity')+
  coord_flip()+
  ggtitle("The axis labels I want, but the order I don't")

plot example 1

df %>% 
  ggplot(aes(x=reorder(code,value)))+
  geom_bar(aes(y=value),
           stat='identity')+
  coord_flip()+
  ggtitle("The order I want, but the axis labels I don't")

enter image description here


Не совсем уверен, как заставить ggplot сохранить отображение и порядок второго графика, при этом можно заменить метки оси именами из первого графика.

1 Ответ

2 голосов
/ 22 апреля 2020

Как насчет использования interaction для привязки имен и кода и в scale_x_discrete заменить метки на соответствующие, такие как следующие:

df %>% 
  ggplot(aes(x=interaction(reorder(name, value),reorder(code,value))))+
  geom_bar(aes(y=value),
             stat='identity')+
  scale_x_discrete(labels = function(x) sub("\\..*$","",x), name = "name")+
  coord_flip()

enter image description here

это то, что вы ищете?

...