Как игнорировать один фактор при определении ylim с граненым графиком - PullRequest
0 голосов
/ 16 апреля 2011

В следующем (бессмысленном) примере я хотел бы построить кривые y1 и y2, но определить ylim согласно кривой y1, игнорируя y2.

Вот пример:

library(ggplot2)

curves <- data.frame(expand.grid(seq(-2,2,0.1), c(2,4), c(1,2)))
names(curves) <- c("x","p","c")

curves$y1 <- splat(function(x,p,c, ...) c * p * exp(- x^p))(curves)
curves$y2 <- splat(function(x,p,c, ...) c + x * p)(curves)
curves <- melt.data.frame(curves, id.vars=1:3)

ggplot(curves, aes(x, value, color = variable)) +
    geom_line() +
    facet_grid(p ~ c, scales="free_y")

Я бы хотел, чтобы в первом ряду был ylim (0,4), а во втором ряду - ylim (0,8).Какие-нибудь мысли?Желательно, чтобы ggplot определял правильные пределы, а не вводил их вручную?

Ответы [ 2 ]

2 голосов
/ 17 апреля 2011

Следующее работает, хотя и кажется неуклюжим.Без сомнения, вы можете улучшить это.

Мой обходной путь - удалить значения из data.frame, которые вы не хотите включать в график:

curves <- subset(curves, !(curves$p==2 & (curves$value>4 | curves$value<0)))
curves <- subset(curves, !(curves$p==4 & (curves$value>8 | curves$value<0)))

ggplot(curves, aes(x, value, color = variable)) +
        geom_line() +
        facet_grid(p ~ c, scales="free_y")

enter image description here

1 голос
/ 17 апреля 2011

Если вы закончите с этим довольно многословным кодом

ylimits <- c(  floor(min(curves$value[curves$variable == "y1"])),
             ceiling(max(curves$value[curves$variable == "y1"])) )

ggplot(curves, aes(x, value, color = variable)) +
    geom_line() +
    facet_grid(p ~ c, scales = "free_y") +
    scale_y_continuous(breaks = ylimits[1]:ylimits[2]) +
    coord_cartesian(ylim = ylimits) 

вы получите это,

Scale decided by red curves

, который основывает шкалу оси Y на кривой y1 (но не на ваших 4 и 8).

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