Фасетная шкала «y» не работает с двойной осью

#r #ggplot2 #limit #facet-wrap

#r #ggplot2 #ограничение #перенос фасетов

Вопрос:

Я пытаюсь наложить 2 графика, я использовал свободную шкалу Y в фасете для правильного отображения данных:

 set.seed(123)

df <-data.frame(
    var1 = 15000   c(0, cumsum(runif(49, -10, 10))),
    var2 = rnorm(100, 10, 1),
    cate= factor(LETTERS[1:4]),
    date = seq(as.Date("2002-01-01"), by="1 month", length.out=100))

df$var1[df$cate=="A"]=rnorm(25, 10,1)

 ggplot(df, aes(x=date))  
 geom_line(data=df, aes(y=var1, color="red"), size=1) 
 theme(legend.position="")  
 facet_wrap(facets = ~cate, scale="free_y")  
 theme(
         axis.text.x = element_text(
         angle = 45, face = "bold", hjust = 0.85, 
         color="black", size=11))

 ggplot(df, aes(x=date))  
 geom_line(data=df, aes(y=var2), size=1, color="blue") 
 theme(legend.position="")  
 facet_wrap(facets = ~cate, scale="free_y")  
 theme(
         axis.text.x = element_text(
         angle = 45, face = "bold", hjust = 0.85, 
         color="black", size=11))
 

Как наложить?

Я попытался наложить оба графика, используя вторую ось. Я использовал свободную шкалу Y с использованием фасета. К сожалению, моя первая ось (левая сторона) не отображает должным образом данные или изменения, потому что эта проблема (пределы левой стороны не в порядке).

Я немного скорректировал (умножил) вторую ось, чтобы получить правильный масштаб. для этого я получил максимальное значение из var1 и var2, согласно:

https://whatalnk.github.io/r-tips/ggplot2-secondary-y-axis.nb.html

 summary(df)

      var1                var2        cate        date           
 Min.   :    7.642   Min.   : 6.962   A:25   Min.   :2002-01-01  
 1st Qu.:11227.279   1st Qu.: 9.170   B:25   1st Qu.:2004-01-24  
 Median :14994.614   Median : 9.965   C:25   Median :2006-02-15  
 Mean   :11254.102   Mean   : 9.888   D:25   Mean   :2006-02-14  
 3rd Qu.:15008.424   3rd Qu.:10.579          3rd Qu.:2008-03-08  
 Max.   :15035.587   Max.   :12.367          Max.   :2010-04-01  
> 


 ggplot(df, aes(x=date))  
 geom_line(data=df, aes(y=var1, color="blue"), size=1) 
 geom_line(data=df, aes(y=var2*15035/12.367, color="red"), size=1)  
 theme(legend.position="")  
 facet_wrap(facets = ~cate, scale="free_y")  
 theme(
         axis.text.x = element_text(
         angle = 45, face = "bold", hjust = 0.85, 
         color="black", size=11)) 
 scale_y_continuous(
    sec.axis = sec_axis(~ .*12.367/15035, name="var2"))
 

пример

**РЕДАКТИРОВАТЬ: **

Если я не умножу, я получу это:

  ggplot(df, aes(x=date))  
 geom_line(data=df, aes(y=var1, color="blue"), size=1) 
 geom_line(data=df, aes(y=var2, color="red"), size=1)  
 theme(legend.position="")  
 facet_wrap(facets = ~cate, scale="free_y")  
 theme(
         axis.text.x = element_text(
         angle = 45, face = "bold", hjust = 0.85, 
         color="black", size=11)) 
 scale_y_continuous(
    sec.axis = sec_axis(~ ., name="var2"))
 

Не умножается

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

1. Я не знаю, что я полностью понимаю. Ваши var1 и var2 for cate=="A" имеют одинаковый порядок величины, поэтому при умножении var2*15070/12.150 получается гораздо большее число, чем var1 в этом аспекте. var1 в cate B, C и D варьируются от 14996 до 15070, тогда как в A он варьируется от 7,5 до 11,6. Это само по себе является проблемой для сохранения масштаба и тому подобного между гранями, я не уверен, как это может быть иначе.

2. Да, я согласен, фасет «A» в порядке, если я не умножаю, строки выглядят нормально, но остальные не отображают правильно var1 или var2. Но если я добавлю scales= «free_y», я предполагаю, что масштабы различны для каждого аспекта, тогда я должен правильно видеть данные в каждом аспекте. Я добавляю этот график, только var1

3. Я предполагаю, что вопрос, который необходимо решить, заключается (пока) не в том, как освободить масштабы, это то, что вы намерены показать, когда ваши данные явно несовместимы с сохранением визуальной перспективы с разными порядками величины. Если возможно, было бы очень полезно, если бы вы вручную создали изображение того, как, по вашему мнению, будут выглядеть эти данные образца (будь то с ggplot помощью, base plot или просто наброска салфетки).

4. Спасибо, я добавляю ожидаемые результаты.

5. Это обеспечивает необходимую четкость. К сожалению, sec_axis требуется, чтобы все фасеты имели одинаковые масштабы расширения и вторичные масштабы. Когда у вас такие разрозненные масштабы, одним из вариантов было бы разбить его на cate и использовать patchwork для объединения нескольких графиков. Это, конечно, не идеальное решение (и я надеюсь, что кто-нибудь еще найдет то, что я не смог найти), но если вам нужно, чтобы они были рядом, и диапазон значений такой, по крайней patchwork мере, приблизит вещи (с некоторой смазкой для локтя).