Arquivo

Posts Tagged ‘eixo’

Gráfico com escala logarítmica em notação de potência

Gráfico (verde) em escala logarítmica com notação de potência.

O pacote latticeExtra traz funções que permitem aprimorar as funções gráficas disponíveis no pacote lattice, ambos desenvolvidos por Deepayan Sarkar. Recentemente precisei confeccionar gráficos em escala logarítmica para os quais eu tinha um enorme roteiro de funções construídas à custo de muita dedicação e tempo. Felizmente, hoje não preciso mais reaprender as implementações que fiz porque a latticeExtra fornece funções para escrever as escalas dos eixos em notação de potência.

As funções disponibilizadas são: xscale.components.logpower, xscale.components.fractions, xscale.components.log10ticks, xscale.components.log10.3 e
xscale.components.subticks, todas elas na versão para o eixo y também. Essas funções permitem, por exemplo, eixos escritos com potência e fração e os traços marcas (tick) para datas considerando o diferente número de dias de cada mês. Tudo isso você pode conferir rodando os exemplos das funções. Até a próxima ridícula.

#-----------------------------------------------------------------------------

require(lattice)

data(Earthquake, package="MEMSS")

p1 <-
  xyplot(accel~distance, data=Earthquake, pch=19, lwd=2,
         prepanel=prepanel.loess, col="blue",
         type=c("p", "g", "smooth"), scales=list(log=2),
         xlab="Distância do epicentro (km)",
         ylab="Aceleração máxima horizontal (g)")

require(latticeExtra)

p2 <-
  xyplot(accel~distance, data=Earthquake, pch=19, lwd=2,
         prepanel=prepanel.loess, col="forestgreen",
         type=c("p", "g", "smooth"), scales=list(log=2),
         xlab="Distância do epicentro (km)",
         ylab="Aceleração máxima horizontal (g)",
         xscale.components=xscale.components.logpower,
         yscale.components=yscale.components.logpower)

#png("f011.png", w=500, h=300)
print(p1, split=c(1,1,2,1), more=TRUE)
print(p2, split=c(2,1,2,1))
#dev.off()

#-----------------------------------------------------------------------------
Anúncios

Gráficos de funções e suas derivadas

Nessa dica vou apresentar o CMR (código mínimo reproduzível) para fazer gráfico de funções, obter derivadas simbólicas de funções, adicionar o gráfico das derivadas das funções com escala no eixo das abcissas da direita com as expressões na legenda do gráfico (ver figura abaixo).

Gráfico da função e sua primeira derivada.

 

A curve() é a função do R que faz gráficos no plano cartesiano de função paramétrica de uma variável. Diversas opções estão disponíveis para essa função, como os tipos de linhas, cores e demais parâmetros gráficos.

A D() é a função do R que retorna a expressão das derivadas (simbólicas) de uma função. O resultado desta e um objeto de classe language. Essa função funciona de maneira recursiva como você pode observar ao obter a derivada de segunda ordem. Infelizmente, o resultado da derivação não é simplificado matematicamente.

A sobreposição de gráficos é feita nas linhas [16,25,29] e a adição de uma escala para o eixo das abcissas foi colocada no lado direito do gráfico com o comando das linhas [18,28].

A função do.call() foi usada para tornar o procedimento mais automático no sentido de que com um objeto especificando a função obteremos todos os mesmos resultados. Saber automatizar os processos é importante quando tem que e avaliar diversas funções. Imagina ficar dando copia e cola o tempo todo? Vamos deixar isso para pessoas que usam programas (em geral pagos) que não oferecem os recursos que temos com o R. Tempo é dinheiro!

Com a função uniroot() obtemos as raízes da nossa função e representamos no gráfico com uma reta vertical.

Finalmente, confeccionamos uma figura para a publicação com rótulos em todos os eixos e legenda dentro do gráfico com a expressão de cada função.

#-----------------------------------------------------------------------------
# gráfico da função, um polinômio de ordem 3 com limites em x de -10 a 10

curve(1+1/2*x+1/3*x^2+1/4*x^3, -10, 10)

#-----------------------------------------------------------------------------
# derivada de primeira e segunda order dessa expressão com relação à x

D(expression(1+1/2*x+1/3*x^2+1/4*x^3), "x")
D(D(expression(1+1/2*x+1/3*x^2+1/4*x^3), "x") ,"x")

#-----------------------------------------------------------------------------
# sobre posição do gráfico da derivada primeira adicionando um novo eixo y

curve(1+1/2*x+1/3*x^2+1/4*x^3, -10, 10)
par(new=TRUE)
curve(1/2+1/3*(2*x)+1/4*(3*x^2), -10, 10, xlab="", ylab="", col=2, axes=FALSE)
axis(4, col=2)

#-----------------------------------------------------------------------------
# procedimento mais automático, atribuindo a expressão a um objeto

expr <- expression(1+1/2*x+1/3*x^2+1/4*x^3)
do.call(curve, list(parse(text=as.character(expr)), -10, 10, ylab=expr))
par(new=TRUE)
do.call(curve, list(D(expr, "x"), -10, 10,
                    xlab="", ylab="", col=2, axes=FALSE))
axis(4, col=2)
par(new=TRUE)
do.call(curve, list(D(D(expr, "x"), "x"), -10, 10,
                    xlab="", ylab="", col=3, axes=FALSE))

#-----------------------------------------------------------------------------
# adicionando a linha da raízes do polinômio

ro <- uniroot(function(x) 1+1/2*x+1/3*x^2+1/4*x^3, c(-10, 10))
str(ro)

curve(1+1/2*x+1/3*x^2+1/4*x^3, -10, 10)
abline(v=ro$root, col=1, h=0, lty=3)

#-----------------------------------------------------------------------------
# confeccionando uma figura para publicação, para salvar descomente

#png("f002.png", w=500, h=300);
par(mar=c(5.1,4.1,2.1,4.1))
expr <- expression(1+1/2*x+1/3*x^2+1/4*x^3)
do.call(curve, list(parse(text=as.character(expr)), -10, 10,
                    ylab=expression(f(x))))
par(new=TRUE)
do.call(curve, list(D(expr, "x"), -10, 10,
                    xlab="", ylab="", lty=2, axes=FALSE))
axis(4)
mtext(side=4, line=3, text=expression(df(x)/dx))
legend("topleft", bty="n", lty=1:2,
       legend=c(paste(expression(f(x)), "=", expr),
         paste(expression(df(x)/dx), "=", capture.output(D(expr, "x")))))
#dev.off()

#-----------------------------------------------------------------------------

Veja a documentação dessas funções para um melhor aproveitamento. Deixe suas sugestões/dúvidas nos comentários. Até a próxima Ridícula!