Получить xlim из графика в R

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

myPlot <- plot(density(m[,1])), main="", xlab="", ylab="")
par(new=TRUE)

Oldxlim <- myPlot$xlim
Oldylim <- myPlot$ylim

hist(m[,3],xlim=Oldxlim,ylim=Oldylim,prob=TRUE)

но я не могу получить доступ к xlim и ylim myPlot.

Есть ли способ получить их из myPlot? Что еще я должен сделать вместо этого?


person jimifiki    schedule 12.12.2012    source источник
comment
Вы можете использовать hist(..., add = TRUE) для рисования на том же графике.   -  person liuminzhao    schedule 12.12.2012
comment
@liuminzhao Я бы, наверное, сделал ваш комментарий принятым ответом   -  person jimifiki    schedule 12.12.2012


Ответы (5)


Рассматривали ли вы возможность указать свои собственные xlim и ylim на первом графике (установив для них соответствующие значения), а затем снова использовать эти значения, чтобы установить пределы гистограммы на втором графике?

Просто построив график плотности самостоятельно, вы сможете определить разумные значения для минимальных и максимальных значений для обеих осей, а затем заменить xmin, xmax, ymin и ymax на эти значения в приведенном ниже коде.

что-то вроде;

myPlot <- plot(density(m[,1])), main="", xlab="", ylab="", xlim =c(xmin, xmax), ylim = c(ymin, ymax)

par(new=TRUE)

hist(m[,3],xlim=c(min, max),ylim=c(min, max),prob=TRUE)
person Adam Kimberley    schedule 12.12.2012

Использование par(new=TRUE) редко, если вообще когда-либо, является лучшим решением. Многие функции построения графиков имеют такую ​​опцию, как add=TRUE, которая добавляется к существующему графику (включая функцию построения гистограмм, как указано в комментариях).

Если вам действительно нужно сделать это таким образом, посмотрите на аргумент usr функции par, выполнение mylims <- par("usr") даст пределы x и y существующего графика в пользовательских координатах. Однако, когда вы используете эту информацию на новом графике, обязательно установите xaxs='i', иначе фактические координаты, используемые на новом графике, будут расширены на 4% по сравнению с указанными вами.

Также полезно знать функции grconvertX и grconvertY. Их можно использовать и для этой цели, но они, вероятно, излишни по сравнению с par("usr"), но они могут быть полезны для нахождения пределов в других системах координат или нахождения таких значений, как середина области построения в пользовательских координатах.

person Greg Snow    schedule 12.12.2012

Если по какой-либо причине вы не можете использовать range() для получения ограничений, я бы последовал предложению @Greg. Это будет работать только в том случае, если для параметров par "xaxs" и "yaxs" установлено значение "s" (по умолчанию), а диапазон координат расширен на 4%:

plot(seq(0.8,9.8,1), 10:19)
usr <- par('usr')
xr <- (usr[2] - usr[1]) / 27 # 27 = (100 + 2*4) / 4
yr <- (usr[4] - usr[3]) / 27
xlim <- c(usr[1] + xr, usr[2] - xr)
ylim <- c(usr[3] + yr, usr[4] - yr)
person dojuba    schedule 31.10.2013

Я думаю, что лучшее решение — исправить их при построении плотности.

В противном случае в коде plot.default (plot.R)

xlab=""
ylab=""
log =""
xy <- xy.coords(x, y, xlab, ylab, log)
xlim1 <- range(xy$x[is.finite(xy$x)])
ylim1 <- range(xy$y[is.finite(xy$y)])

или использовать приведенный выше код для генерации xlim и ylim, а затем вызвать свой график для плотности

dd <- density(c(-20,rep(0,98),20))
plot(dd,xlim=xlim1,ylim=ylim1)
x <- rchisq(100, df = 4)
hist(x,xlim=xlim1,ylim=xlim1,prob=TRUE,add=TRUE)

введите здесь описание изображения

person agstudy    schedule 12.12.2012

Почему бы не использовать ggplot2?

library(ggplot2)

set.seed(42)
df <- data.frame(x = rnorm(500,mean=10,sd=5),y = rlnorm(500,sdlog=1.1))

p1 <- ggplot(df) + 
  geom_histogram(aes(x=y,y = ..density..),binwidth=2) +
  geom_density(aes(x=x),fill="green",alpha=0.3) 
print(p1)

плотность и история

person Roland    schedule 12.12.2012