Hola, El problema con la propuesta de Olivier es que los intervalos son diferentes para cada variable. La forma sencilla y rápida es: spplot(zm["part88"], col.regions=plotclr, at=class$brks) Pero para que quede más elegante hay que dar algunos pasos más: ## Intervalos en forma character op <- options(digits=4) tab <- print(class) options(op) intChar <- names(tab) ## Indice de correspondencia entre elemento e intervalo idxP88 <- findCols(class) ## Es sólo un wrapper alrededor de findIntervals. Lo anterior para otra variable es: idxP93 <- findInterval(zm$part93, class$brks, all.inside = TRUE) ## Nueva variable categórica zm$classP88 <- factor(intChar[idxP88]) zm$classP93 <- factor(intChar[idxP93]) ## A pintar spplot(zm[c("classP88", "classP93")], col.regions=plotclr) Saludos. Oscar. ----------------------------------------------------------------- Oscar Perpiñán Lamigueiro Dpto. Ingeniería Eléctrica (ETSIDI-UPM) Grupo de Sistemas Fotovoltaicos (IES-UPM) URL: http://oscarperpinan.github.io Twitter: @oscarperpinan El día 6 de mayo de 2014, 9:21, "Olivier Nuñez" <onunez en unex.es> escribió:> El segundo argumento en spplot ha de definir el número/nombre del intervalo al que > pertenece el area a pintar. > Este código debería funcionar: > > zm$class88=findCols(classIntervals(zm$part88, nclr, style="quantile")) > zm$class93=findCols(classIntervals(zm$part93, nclr, style="quantile")) > > spplot(zm, c("class88","class93"), col.regions=plotclr, cuts=(nclr-1), > key.space="bottom") > > Un saludo. Olivier > >> Hola, no me funciona: >> >> Te contesto lo mismo que le contesté a otro compañero de la lista, espero ser más >> claro. >> >> Les comparto la carpeta con la capa y los datos que estoy usando. >> >> https://www.dropbox.com/s/umy0evt3qm1wr4d/dissolve.zip >> >> Esto es lo que estoy haciendo: >> >> library(rgdal) >> library(maptools) >> library(sp) >> library(classInt) >> library(RColorBrewer) >> zm <- readOGR(?.?, ?zmdis?) >> data <- read.csv(?part_pot.csv?, header=T, sep=?,?, dec=?.?) >> zm en data=data.frame(data) >> plotvar88 <- zm$part88 >> nclr <- 8 >> plotclr <- brewer.pal(nclr, ?Blues?) >> class <- classIntervals(plotvar88, nclr, style=?quantile?) >> colcode <- findColours(class, plotclr) >> plot(zm) >> plot(zm, col=colcode, add=T) >> legend(3777189,2249615, legend=names(attar(colcode, ?table?)), fill=attr(colcode, >> ?palette?), cex=0.6, bty=?n?) >> >> Entonces obtengo el mapa como lo quiero (Me falta la división política, pero para >> este ejemplo la omití): >> >> https://www.dropbox.com/s/w3ps61o4jr1ciy5/part88.tiff >> >> Cuando lo hago con spplot: >> >> spplot(zm, "part88", col.regions=plotclr, cuts=nclr, key.space="bottom?) >> >> Me regresa lo siguiente: >> >> https://www.dropbox.com/s/2cgiua5ra2tx4a0/part88_spplot.tiff >> >> Entonces lo que quiero es usar el spplot para pintar dos variables c(?part88?, >> ?part93?), que el mismo ?legend? aplique para ambas. >> >> Saludos cordiales >> El 05/05/2014, a las 10:39, Olivier Nuñez <onunez en unex.es> escribió: >> >>> No resulta fácil contestarte con la información que proporcionas. >>> Sobre la base de las variables que definiste, intuyó que lo siguiente debería >>> funcionar: >>> >>> zm$clases <- class >>> spplot(zm, "clases" , col.regions=plotclr) >>> >>> Un saludo. Olivier >>> >>>> Hola, >>>> >>>> Intento representar en un mapa participaciones porcentuales de los sectores >>>> económicos y no logro hacerlo con spplot. >>>> >>>> He intentado con spplot(zm, c(?part88?, ?part93?), cuts=4, >>>> col.regions=brewer.pal(4, >>>> ?Set3?)) >>>> >>>> Lo pude hacer utilizando el base graphics de R, definiendo: >>>> >>>>> plotvar88 <- zm$part88 >>>>> nclr <- 8 >>>>> plotclr <- brewer.pal(nclr, "PuOr") >>>>> plotclr <- plotclr[nclr:1] >>>>> class <- classIntervals(plotvar88, nclr, style="quantile") >>>>> colcode <- findColours(class, plotclr) >>>>> plot(zm) >>>>> plot(zm, col=colcode, add=T) >>>>> legend(3377189,2249615, legend=names(attr(colcode, "table")), fill=attr(colcode, >>>>> "palette"), cex=0.6, bty="n?) >>>> >>>> Después intenté meter algunos de esos argumentos utilizando spplot >>>> >>>> spplot(zm, c(?part88?, ?part93?), col.regions=plotclr, cuts=nclr) >>>> >>>> y tampoco funcionó. >>>> >>>> Tengo algunas nociones de cómo hacerlo en spplot, pero no sé cómo, pues >>>> desconozco >>>> la forma en utilizar los argumentos por ejemplo usando ?cuts?, ?at?. He revisado >>>> la >>>> ayuda que provee el paquete y sigo sin poder concretarlo. >>>> >>>> Agradecería un poco de orientación. >>>> >>>> Saludos cordiales. >>>> >>>> Rolando Valdez >>>> >>>> _______________________________________________ >>>> R-help-es mailing list >>>> R-help-es en r-project.org >>>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>>> >>> >>> >>> -- >>> ____________________________________ >>> >>> >>> Olivier G. Nuñez >>> Email: onunez en unex.es >>> http://kolmogorov.unex.es/~onunez >>> Tel : +34 663 03 69 09 >>> Departamento de Matemáticas >>> Universidad de Extremadura >>> >>> >>> ____________________________________ >>> >>> >>> >> >> Rolando Valdez >> >> >> >> > > > -- > ____________________________________ > > > Olivier G. Nuñez > Email: onunez en unex.es > http://kolmogorov.unex.es/~onunez > Tel : +34 663 03 69 09 > Departamento de Matemáticas > Universidad de Extremadura > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es
Oscar tiene razn, con mi solucin los dos mapas no son equiparables. Un saludo. Olivier> Hola, > > El problema con la propuesta de Olivier es que los intervalos son > diferentes para cada variable. > > La forma sencilla y rpida es: > > spplot(zm["part88"], col.regions=plotclr, at=class$brks) > > Pero para que quede ms elegante hay que dar algunos pasos ms: > > ## Intervalos en forma character > op <- options(digits=4) > tab <- print(class) > options(op) > intChar <- names(tab) > ## Indice de correspondencia entre elemento e intervalo > idxP88 <- findCols(class) > ## Es slo un wrapper alrededor de findIntervals. Lo anterior para > otra variable es: > idxP93 <- findInterval(zm$part93, class$brks, all.inside = TRUE) > > ## Nueva variable categrica > zm$classP88 <- factor(intChar[idxP88]) > zm$classP93 <- factor(intChar[idxP93]) > > ## A pintar > spplot(zm[c("classP88", "classP93")], col.regions=plotclr) > > Saludos. > > Oscar. > ----------------------------------------------------------------- > Oscar Perpin Lamigueiro > Dpto. Ingeniera Elctrica (ETSIDI-UPM) > Grupo de Sistemas Fotovoltaicos (IES-UPM) > URL: http://oscarperpinan.github.io > Twitter: @oscarperpinan > > > El da 6 de mayo de 2014, 9:21, "Olivier Nuez" <onunez en unex.es> escribi: >> El segundo argumento en spplot ha de definir el nmero/nombre del intervalo al >> que >> pertenece el area a pintar. >> Este cdigo debera funcionar: >> >> zm$class88=findCols(classIntervals(zm$part88, nclr, style="quantile")) >> zm$class93=findCols(classIntervals(zm$part93, nclr, style="quantile")) >> >> spplot(zm, c("class88","class93"), col.regions=plotclr, cuts=(nclr-1), >> key.space="bottom") >> >> Un saludo. Olivier >> >>> Hola, no me funciona: >>> >>> Te contesto lo mismo que le contest a otro compaero de la lista, espero ser >>> ms >>> claro. >>> >>> Les comparto la carpeta con la capa y los datos que estoy usando. >>> >>> https://www.dropbox.com/s/umy0evt3qm1wr4d/dissolve.zip >>> >>> Esto es lo que estoy haciendo: >>> >>> library(rgdal) >>> library(maptools) >>> library(sp) >>> library(classInt) >>> library(RColorBrewer) >>> zm <- readOGR(., zmdis) >>> data <- read.csv(part_pot.csv, header=T, sep=,, dec=.) >>> zm en data=data.frame(data) >>> plotvar88 <- zm$part88 >>> nclr <- 8 >>> plotclr <- brewer.pal(nclr, Blues) >>> class <- classIntervals(plotvar88, nclr, style=quantile) >>> colcode <- findColours(class, plotclr) >>> plot(zm) >>> plot(zm, col=colcode, add=T) >>> legend(3777189,2249615, legend=names(attar(colcode, table)), >>> fill=attr(colcode, >>> palette), cex=0.6, bty=n) >>> >>> Entonces obtengo el mapa como lo quiero (Me falta la divisin poltica, pero >>> para >>> este ejemplo la omit): >>> >>> https://www.dropbox.com/s/w3ps61o4jr1ciy5/part88.tiff >>> >>> Cuando lo hago con spplot: >>> >>> spplot(zm, "part88", col.regions=plotclr, cuts=nclr, key.space="bottom) >>> >>> Me regresa lo siguiente: >>> >>> https://www.dropbox.com/s/2cgiua5ra2tx4a0/part88_spplot.tiff >>> >>> Entonces lo que quiero es usar el spplot para pintar dos variables >>> c(part88, >>> part93), que el mismo legend aplique para ambas. >>> >>> Saludos cordiales >>> El 05/05/2014, a las 10:39, Olivier Nuez <onunez en unex.es> escribi: >>> >>>> No resulta fcil contestarte con la informacin que proporcionas. >>>> Sobre la base de las variables que definiste, intuy que lo siguiente debera >>>> funcionar: >>>> >>>> zm$clases <- class >>>> spplot(zm, "clases" , col.regions=plotclr) >>>> >>>> Un saludo. Olivier >>>> >>>>> Hola, >>>>> >>>>> Intento representar en un mapa participaciones porcentuales de los sectores >>>>> econmicos y no logro hacerlo con spplot. >>>>> >>>>> He intentado con spplot(zm, c(part88, part93), cuts=4, >>>>> col.regions=brewer.pal(4, >>>>> Set3)) >>>>> >>>>> Lo pude hacer utilizando el base graphics de R, definiendo: >>>>> >>>>>> plotvar88 <- zm$part88 >>>>>> nclr <- 8 >>>>>> plotclr <- brewer.pal(nclr, "PuOr") >>>>>> plotclr <- plotclr[nclr:1] >>>>>> class <- classIntervals(plotvar88, nclr, style="quantile") >>>>>> colcode <- findColours(class, plotclr) >>>>>> plot(zm) >>>>>> plot(zm, col=colcode, add=T) >>>>>> legend(3377189,2249615, legend=names(attr(colcode, "table")), >>>>>> fill=attr(colcode, >>>>>> "palette"), cex=0.6, bty="n) >>>>> >>>>> Despus intent meter algunos de esos argumentos utilizando spplot >>>>> >>>>> spplot(zm, c(part88, part93), col.regions=plotclr, cuts=nclr) >>>>> >>>>> y tampoco funcion. >>>>> >>>>> Tengo algunas nociones de cmo hacerlo en spplot, pero no s cmo, pues >>>>> desconozco >>>>> la forma en utilizar los argumentos por ejemplo usando cuts, at. He >>>>> revisado >>>>> la >>>>> ayuda que provee el paquete y sigo sin poder concretarlo. >>>>> >>>>> Agradecera un poco de orientacin. >>>>> >>>>> Saludos cordiales. >>>>> >>>>> Rolando Valdez >>>>> >>>>> _______________________________________________ >>>>> R-help-es mailing list >>>>> R-help-es en r-project.org >>>>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>>>> >>>> >>>> >>>> -- >>>> ____________________________________ >>>> >>>> >>>> Olivier G. Nuez >>>> Email: onunez en unex.es >>>> http://kolmogorov.unex.es/~onunez >>>> Tel : +34 663 03 69 09 >>>> Departamento de Matemticas >>>> Universidad de Extremadura >>>> >>>> >>>> ____________________________________ >>>> >>>> >>>> >>> >>> Rolando Valdez >>> >>> >>> >>> >> >> >> -- >> ____________________________________ >> >> >> Olivier G. Nuez >> Email: onunez en unex.es >> http://kolmogorov.unex.es/~onunez >> Tel : +34 663 03 69 09 >> Departamento de Matemticas >> Universidad de Extremadura >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es en r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es >-- ____________________________________ Olivier G. Nuez Email: onunez en unex.es http://kolmogorov.unex.es/~onunez Tel : +34 663 03 69 09 Departamento de Matemticas Universidad de Extremadura
Hola, Primero que nada, muchas gracias por tu tiempo y por tu ayuda. Primero probé con la opción sencilla y rápida, obteniendo un resultado algo extraño. Lo muestro en el siguiente link: https://www.dropbox.com/s/xujqcz0o9kqfrku/intervals.tiff Después intenté ir replicando el resto de pasos que me propones y al llegar al momento de definir una nueva variable categórica, me arroja el siguiente error:> zm$classP88 <- factor(intChar[idxP88])Error in `[[<-.data.frame`(`*tmp*`, name, value = integer(0)) : replacement has 0 rows, data has 56 ¿A qué se debe este error? Reitero mi agradecimiento El 06/05/2014, a las 06:31, Oscar Perpiñan <oscar.perpinan en upm.es> escribió:> Hola, > > El problema con la propuesta de Olivier es que los intervalos son > diferentes para cada variable. > > La forma sencilla y rápida es: > > spplot(zm["part88"], col.regions=plotclr, at=class$brks) > > Pero para que quede más elegante hay que dar algunos pasos más: > > ## Intervalos en forma character > op <- options(digits=4) > tab <- print(class) > options(op) > intChar <- names(tab) > ## Indice de correspondencia entre elemento e intervalo > idxP88 <- findCols(class) > ## Es sólo un wrapper alrededor de findIntervals. Lo anterior para > otra variable es: > idxP93 <- findInterval(zm$part93, class$brks, all.inside = TRUE) > > ## Nueva variable categórica > zm$classP88 <- factor(intChar[idxP88]) > zm$classP93 <- factor(intChar[idxP93]) > > ## A pintar > spplot(zm[c("classP88", "classP93")], col.regions=plotclr) > > Saludos. > > Oscar. > ----------------------------------------------------------------- > Oscar Perpiñán Lamigueiro > Dpto. Ingeniería Eléctrica (ETSIDI-UPM) > Grupo de Sistemas Fotovoltaicos (IES-UPM) > URL: http://oscarperpinan.github.io > Twitter: @oscarperpinan > > > El día 6 de mayo de 2014, 9:21, "Olivier Nuñez" <onunez en unex.es> escribió: >> El segundo argumento en spplot ha de definir el número/nombre del intervalo al que >> pertenece el area a pintar. >> Este código debería funcionar: >> >> zm$class88=findCols(classIntervals(zm$part88, nclr, style="quantile")) >> zm$class93=findCols(classIntervals(zm$part93, nclr, style="quantile")) >> >> spplot(zm, c("class88","class93"), col.regions=plotclr, cuts=(nclr-1), >> key.space="bottom") >> >> Un saludo. Olivier >> >>> Hola, no me funciona: >>> >>> Te contesto lo mismo que le contesté a otro compañero de la lista, espero ser más >>> claro. >>> >>> Les comparto la carpeta con la capa y los datos que estoy usando. >>> >>> https://www.dropbox.com/s/umy0evt3qm1wr4d/dissolve.zip >>> >>> Esto es lo que estoy haciendo: >>> >>> library(rgdal) >>> library(maptools) >>> library(sp) >>> library(classInt) >>> library(RColorBrewer) >>> zm <- readOGR(?.?, ?zmdis?) >>> data <- read.csv(?part_pot.csv?, header=T, sep=?,?, dec=?.?) >>> zm en data=data.frame(data) >>> plotvar88 <- zm$part88 >>> nclr <- 8 >>> plotclr <- brewer.pal(nclr, ?Blues?) >>> class <- classIntervals(plotvar88, nclr, style=?quantile?) >>> colcode <- findColours(class, plotclr) >>> plot(zm) >>> plot(zm, col=colcode, add=T) >>> legend(3777189,2249615, legend=names(attar(colcode, ?table?)), fill=attr(colcode, >>> ?palette?), cex=0.6, bty=?n?) >>> >>> Entonces obtengo el mapa como lo quiero (Me falta la división política, pero para >>> este ejemplo la omití): >>> >>> https://www.dropbox.com/s/w3ps61o4jr1ciy5/part88.tiff >>> >>> Cuando lo hago con spplot: >>> >>> spplot(zm, "part88", col.regions=plotclr, cuts=nclr, key.space="bottom?) >>> >>> Me regresa lo siguiente: >>> >>> https://www.dropbox.com/s/2cgiua5ra2tx4a0/part88_spplot.tiff >>> >>> Entonces lo que quiero es usar el spplot para pintar dos variables c(?part88?, >>> ?part93?), que el mismo ?legend? aplique para ambas. >>> >>> Saludos cordiales >>> El 05/05/2014, a las 10:39, Olivier Nuñez <onunez en unex.es> escribió: >>> >>>> No resulta fácil contestarte con la información que proporcionas. >>>> Sobre la base de las variables que definiste, intuyó que lo siguiente debería >>>> funcionar: >>>> >>>> zm$clases <- class >>>> spplot(zm, "clases" , col.regions=plotclr) >>>> >>>> Un saludo. Olivier >>>> >>>>> Hola, >>>>> >>>>> Intento representar en un mapa participaciones porcentuales de los sectores >>>>> económicos y no logro hacerlo con spplot. >>>>> >>>>> He intentado con spplot(zm, c(?part88?, ?part93?), cuts=4, >>>>> col.regions=brewer.pal(4, >>>>> ?Set3?)) >>>>> >>>>> Lo pude hacer utilizando el base graphics de R, definiendo: >>>>> >>>>>> plotvar88 <- zm$part88 >>>>>> nclr <- 8 >>>>>> plotclr <- brewer.pal(nclr, "PuOr") >>>>>> plotclr <- plotclr[nclr:1] >>>>>> class <- classIntervals(plotvar88, nclr, style="quantile") >>>>>> colcode <- findColours(class, plotclr) >>>>>> plot(zm) >>>>>> plot(zm, col=colcode, add=T) >>>>>> legend(3377189,2249615, legend=names(attr(colcode, "table")), fill=attr(colcode, >>>>>> "palette"), cex=0.6, bty="n?) >>>>> >>>>> Después intenté meter algunos de esos argumentos utilizando spplot >>>>> >>>>> spplot(zm, c(?part88?, ?part93?), col.regions=plotclr, cuts=nclr) >>>>> >>>>> y tampoco funcionó. >>>>> >>>>> Tengo algunas nociones de cómo hacerlo en spplot, pero no sé cómo, pues >>>>> desconozco >>>>> la forma en utilizar los argumentos por ejemplo usando ?cuts?, ?at?. He revisado >>>>> la >>>>> ayuda que provee el paquete y sigo sin poder concretarlo. >>>>> >>>>> Agradecería un poco de orientación. >>>>> >>>>> Saludos cordiales. >>>>> >>>>> Rolando Valdez >>>>> >>>>> _______________________________________________ >>>>> R-help-es mailing list >>>>> R-help-es en r-project.org >>>>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>>>> >>>> >>>> >>>> -- >>>> ____________________________________ >>>> >>>> >>>> Olivier G. Nuñez >>>> Email: onunez en unex.es >>>> http://kolmogorov.unex.es/~onunez >>>> Tel : +34 663 03 69 09 >>>> Departamento de Matemáticas >>>> Universidad de Extremadura >>>> >>>> >>>> ____________________________________ >>>> >>>> >>>> >>> >>> Rolando Valdez >>> >>> >>> >>> >> >> >> -- >> ____________________________________ >> >> >> Olivier G. Nuñez >> Email: onunez en unex.es >> http://kolmogorov.unex.es/~onunez >> Tel : +34 663 03 69 09 >> Departamento de Matemáticas >> Universidad de Extremadura >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es en r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-esRolando Valdez
Hola,> Primero probé con la opción sencilla y rápida, obteniendo un resultado algo extraño. Lo muestro en el siguiente link: > > https://www.dropbox.com/s/xujqcz0o9kqfrku/intervals.tiffSí, es lo que debe salir porque los intervalos no son iguales. Por eso te proponía la solución más elaborada.> Después intenté ir replicando el resto de pasos que me propones y al llegar al momento de definir una nueva variable categórica, me arroja el siguiente error: > >> zm$classP88 <- factor(intChar[idxP88]) > Error in `[[<-.data.frame`(`*tmp*`, name, value = integer(0)) : > replacement has 0 rows, data has 56Vaya, pues no lo sé, porque lo probé con tus datos. Si lo estás haciendo con los mismos datos que nos enviaste, debiera funcionar sin problemas. ¿Que obienes en intChar y en idxP88? Oscar.