#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
forcate=="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
помощью, baseplot
или просто наброска салфетки).4. Спасибо, я добавляю ожидаемые результаты.
5. Это обеспечивает необходимую четкость. К сожалению,
sec_axis
требуется, чтобы все фасеты имели одинаковые масштабы расширения и вторичные масштабы. Когда у вас такие разрозненные масштабы, одним из вариантов было бы разбить его наcate
и использоватьpatchwork
для объединения нескольких графиков. Это, конечно, не идеальное решение (и я надеюсь, что кто-нибудь еще найдет то, что я не смог найти), но если вам нужно, чтобы они были рядом, и диапазон значений такой, по крайнейpatchwork
мере, приблизит вещи (с некоторой смазкой для локтя).