I want to set limits to the x-axis of the plot of the output of the mixfit
function of the mixR
package. This output is of class mixfitEM
.
Reproducable example: First I simulate a mixture of log normals.
rm(list=ls())
library(mixR)
library("tidyverse")
set.seed(07062022)
N <- 1000
lbda=.5
mu1=1
Del=3
mu2=mu1+Del
components <- sample(1:2,prob=c((1-lbda), lbda),size=N,replace=TRUE)
mus <- c(mu1,mu2)
sds <- sqrt(c(1,.5))
Y <- rlnorm(n=N,meanlog=mus[components],sdlog=sds[components])
Then I try to fit two log normals into this data using mixfit()
from mixR
. In the first attempt I tried to use the plot()
function from the base
package; but plot
ignores the xlim
argument.
mod4 <- mixfit(Y, ncomp = 2, family = 'lnorm')
plot(mod4, title = 'Log-Normal Mixture (2 components)', xlim=c(0,200))
Then I tried to plot with ggplot, which, in theory should be possible according to the mixR manual. But ggplot does not understand the mixfitEM
class.
ggplot(mod4)+
+ coord_cartesian(xlim = c(0, 200))
produces the following error:
> ggplot(data.frame(mod4))+
+ + coord_cartesian(xlim = c(0, 200))
Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) :
cannot coerce class ‘"mixfitEM"’ to a data.frame
> ggplot(mod4)+
+ + coord_cartesian(xlim = c(0, 200))
Error in `fortify()`:
! `data` must be a data frame, or other object coercible by `fortify()`, not an S3 object with class mixfitEM.
Run `rlang::last_error()` to see where the error occurred.
When you call plot
on the mixfitEM
object, you are creating a ggplot. The reason for this is that plot
is a generic function, so when package authors create a new class, they are free to use whatever method they want to draw the plot. In this case, if you examine the source code of mixR:::plot.mixfitEM
you will see it actually uses ggplot to draw its output. This means you can use ggplot syntax to modify the output:
plot(mod4, title = 'Log-Normal Mixture (2 components)') + xlim(c(0, 200))