Как изменить масштаб графика плотности по оси x в ggplot R?

#r #ggplot2

#r #ggplot2

Вопрос:

У меня есть следующие данные и коды, которые отображают график плотности:

 test_pos <- c(25L, 29L, 142L, 142L, 163L, 163L, 164L, 164L, 164L, 164L, 165L, 
              165L, 168L, 170L, 170L, 237L, 237L, 237L, 237L, 237L, 238L, 238L, 
              244L, 244L, 244L, 244L, 244L, 244L, 244L, 247L, 248L, 248L, 248L, 
              248L, 248L, 250L, 250L, 250L, 250L, 250L, 250L, 252L, 252L, 254L, 
              289L, 289L, 289L, 299L, 302L, 314L, 354L, 373L, 373L, 373L, 373L, 
              396L, 396L, 396L, 396L, 396L, 396L, 396L, 396L, 396L, 396L, 396L, 
              396L, 396L, 396L, 396L, 491L, 493L, 493L, 499L, 536L, 552L, 563L, 
              568L, 607L, 669L, 791L, 791L, 793L, 834L, 845L, 849L, 856L, 856L, 
              884L, 884L, 992L, 992L, 995L, 995L, 995L, 998L, 1005L, 1005L, 
              1064L, 1104L)

test_neg <- c(1100L, 1100L, 1272L, 1841L, 1965L, 1980L, 1980L, 2724L, 2744L, 
              2744L, 2744L, 2748L, 2907L, 2918L, 2918L, 2919L, 2920L, 2921L, 
              3050L, 3062L, 3065L, 3065L, 3077L, 3088L, 3088L, 3088L, 3088L, 
              3089L, 3089L, 3089L, 3089L, 3090L, 3105L, 3141L, 3182L, 3212L, 
              3212L, 3219L, 3219L, 3219L, 3220L, 3223L, 3223L, 3223L, 3224L, 
              3225L, 3225L, 3226L, 3227L, 3370L, 3394L, 3396L, 3398L, 3402L, 
              3403L, 3447L, 3456L, 3470L, 3522L, 3523L, 3524L, 3524L, 3524L, 
              3525L, 3607L, 3607L, 3607L, 3607L, 3618L, 3624L, 3624L, 3624L, 
              3629L, 3638L, 3638L, 3639L, 3639L, 3639L, 3639L, 3639L, 3641L, 
              3641L, 3641L, 3641L, 3641L, 3641L, 3641L, 3641L, 3642L, 3642L, 
              3642L, 3642L, 3642L, 3642L, 3642L, 3647L, 3647L, 3647L, 3647L, 
              3647L)



p <- ggplot()  
  geom_density(aes(x), data.frame(x = test_pos), fill = 'navy')  
  geom_density(aes(x, -stat(density)), data.frame(x = test_neg), fill = 'firebrick')


Chr1 <- 999
Chr2 <- Chr1   400  
Chr3 <- Chr2   900 
Chr4 <- Chr3   899
Chr5 <- Chr4    600


Ch1 <- 1:Chr1
Ch2 <- (Chr1 1):Chr2  
Ch3 <- (Chr2 1):Chr3 
Ch4 <- (Chr3 1):Chr4
Ch5 <- (Chr4 1):Chr5
  

Я хочу использовать диапазон от Ch1 до Ch5 и заменить числовые значения по оси X на Ch1, Ch2, Ch3, Ch4 и Ch5. Вот что я пробовал, но это не сработает:

 break.positions1 <- c(seq(1,5,1))
break.positions <- factor(break.positions1, levels = break.positions1)
p  scale_x_continuous("Chromosomes",breaks = c(Chr1,Chr2,Chr3,Chr4,Chr5),labels = as.character(break.positions), expand = c(0, 0), limits = c(1, 3798))
  

Ответ №1:

Использует немного dplyr

 data.frame(test_neg, test_pos) %>% 
  ggplot(aes(test_pos))   
  geom_density(fill = 'navy')  
  geom_density(aes(test_neg, -stat(density)), fill = 'firebrick')  
  scale_x_continuous(breaks = c(999, 1399, 2299, 3198, 3798),
                     labels = c('Chr1', 'Chr2', 'Chr3', 'Chr4', 'Chr5'))  
  expand_limits(x = c(0, 4300))
  

Если test_pos и test_neg имеют разную длину, используйте:

 ggplot(data.frame(test_pos), aes(test_pos))   
  geom_density(fill = 'navy')  
  geom_density(data = data.frame(test_neg), 
               aes(test_neg, -stat(density)), 
               fill = 'firebrick')  
  scale_x_continuous(breaks = c(999, 1399, 2299, 3198, 3798),
                     labels = c('Chr1', 'Chr2', 'Chr3', 'Chr4', 'Chr5'))  
  expand_limits(x = c(0, 4300))
  

Комментарии:

1. @B Williams Не уверен, почему я получаю эту ошибку в моем реальном наборе данных: Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) :cannot coerce class ‘"density"’ to a data.frame

2. Кроме того, длина test_pos и test_neg может отличаться.

3. скорректированный код для данных разной длины — что касается ошибки — обновлял ваши пакеты в последнее время? или что-то неправильно ввести? на моей машине работает нормально