Problem with names() in a plot after ordering a data.frame. Syntax or stupidity?

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Problem with names() in a plot after ordering a data.frame. Syntax or stupidity?

John Kane-2
I am a complete newbie in R .
   Using  R 2.2.0  Windows XP
 
This started as a simple exercise to see if I could
produce a simple
Cleveland style dotchart with a line from the '2' axis
to the dot rather
than a continuous line as  do "dotchart" and
"dotchart2".  At least I could not
find that option.

I got a crude program to work but it includes
unnecessary steps.
The data in Area (below) is sorted in reverse order to
how I want it displayed
I am doing to many 'sorts'  either a sort() or a rev()
to handle this problem.

When I change from sorting variables to using order()
on the data.frame I
lose my names() When I try to assign it, I get a NULL
return.  
It is probably a very simple error but I cannot find
it and I am not sure if
it is syntax error, a more serious misunderstanding of
the nature of the names()
function or a confusion about how a data.frame and
order() work.

Any help gratefully  received.  Thanks

#-----------------------Read in
Data--------------------------------------------

Name <- c( "Nunavut", "Québec", "Northwest
Territories", "British Columbia",
           "Ontario",  "Alberta",  "Saskatchewan",
"Manitoba", "Yukon",
         "Newfoundland",  "New Brunswick","Nova
Scotia", "Prince Edward Island")
         
Pcode <- c("NU","QC","NT","BC","ON",
"AB","SK","MB","YT","NL","NB","NS","PE")

Area <- c(1936113, 1365128, 1183085, 925186, 917741,
642317, 591670, 553556,
            474391, 373872, 71450, 53338, 5660)
 
 #  ------------------------Crude working
program------------------------------
 
provs <- data.frame(Name, Pcode, Area)
attach(provs)

numberProvs <- length(Pcode)

# This next step reverses the order of Pcode to make
# the names match the sorted Area

names(Area) <- rev(Pcode)      

Lines <- 1:numberProvs
plot(sort(Area), Lines, pch=20, col="red",  
      xlab = " Area", ylab= "Province or Territory",
axes=F)
axis( 2, at=Lines, labels=names(Area), las=1)
axis (1, labels= T)
xstart <- 0
xend <- Area
ystart <- rev(Lines)
yend <- rev(Lines)
arrows(xstart, ystart, xend, yend, col="red", length =
0)

# --------------End of Crude working
program-----------------------------

# --------------Revised program using order on the
data.frame-------------

provs <- data.frame(Name, Pcode, Area)
attach(provs)

numberProvs <- length(Pcode)

#  Reorder the dataframe
   
Sizes <- provs[order(Area),]
rm (provs)
Sizes

names(Sizes$Area) <- Sizes$Pcode)
Lines <- 1:numberProvs

plot(Sizes$Area, Lines, pch=20, col="red",  
      xlab = " Area", ylab= "Province or Territory",
axes=F)
axis( 2, at=Lines, labels=names(Sizes$Area), las=1)
axis (1, labels= T)
xstart <- 0
xend <- Area
ystart <- rev(Lines )
yend <- rev(Lines )
arrows(xstart, ystart, xend, yend, col="red", length =
0)

# -------------End of program using order()
John Kane, Kingston ON  Canada

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
Reply | Threaded
Open this post in threaded view
|

Re: Problem with names() in a plot after ordering a data.frame. Syntax or stupidity?

Gabor Grothendieck
Try this or suitable variation:

with(provs[order(provs$Area),], {
        idx <- seq(Pcode)
        plot(Area, idx, col = 2, yaxt = "n")
        segments(0, idx, Area, idx, col = 2)
        axis(2, idx, as.character(Pcode))
})


On 3/26/06, John Kane <[hidden email]> wrote:

> I am a complete newbie in R .
>   Using  R 2.2.0  Windows XP
>
> This started as a simple exercise to see if I could
> produce a simple
> Cleveland style dotchart with a line from the '2' axis
> to the dot rather
> than a continuous line as  do "dotchart" and
> "dotchart2".  At least I could not
> find that option.
>
> I got a crude program to work but it includes
> unnecessary steps.
> The data in Area (below) is sorted in reverse order to
> how I want it displayed
> I am doing to many 'sorts'  either a sort() or a rev()
> to handle this problem.
>
> When I change from sorting variables to using order()
> on the data.frame I
> lose my names() When I try to assign it, I get a NULL
> return.
> It is probably a very simple error but I cannot find
> it and I am not sure if
> it is syntax error, a more serious misunderstanding of
> the nature of the names()
> function or a confusion about how a data.frame and
> order() work.
>
> Any help gratefully  received.  Thanks
>
> #-----------------------Read in
> Data--------------------------------------------
>
> Name <- c( "Nunavut", "Québec", "Northwest
> Territories", "British Columbia",
>           "Ontario",  "Alberta",  "Saskatchewan",
> "Manitoba", "Yukon",
>         "Newfoundland",  "New Brunswick","Nova
> Scotia", "Prince Edward Island")
>
> Pcode <- c("NU","QC","NT","BC","ON",
> "AB","SK","MB","YT","NL","NB","NS","PE")
>
> Area <- c(1936113, 1365128, 1183085, 925186, 917741,
> 642317, 591670, 553556,
>            474391, 373872, 71450, 53338, 5660)
>
>  #  ------------------------Crude working
> program------------------------------
>
> provs <- data.frame(Name, Pcode, Area)
> attach(provs)
>
> numberProvs <- length(Pcode)
>
> # This next step reverses the order of Pcode to make
> # the names match the sorted Area
>
> names(Area) <- rev(Pcode)
>
> Lines <- 1:numberProvs
> plot(sort(Area), Lines, pch=20, col="red",
>      xlab = " Area", ylab= "Province or Territory",
> axes=F)
> axis( 2, at=Lines, labels=names(Area), las=1)
> axis (1, labels= T)
> xstart <- 0
> xend <- Area
> ystart <- rev(Lines)
> yend <- rev(Lines)
> arrows(xstart, ystart, xend, yend, col="red", length =
> 0)
>
> # --------------End of Crude working
> program-----------------------------
>
> # --------------Revised program using order on the
> data.frame-------------
>
> provs <- data.frame(Name, Pcode, Area)
> attach(provs)
>
> numberProvs <- length(Pcode)
>
> #  Reorder the dataframe
>
> Sizes <- provs[order(Area),]
> rm (provs)
> Sizes
>
> names(Sizes$Area) <- Sizes$Pcode)
> Lines <- 1:numberProvs
>
> plot(Sizes$Area, Lines, pch=20, col="red",
>      xlab = " Area", ylab= "Province or Territory",
> axes=F)
> axis( 2, at=Lines, labels=names(Sizes$Area), las=1)
> axis (1, labels= T)
> xstart <- 0
> xend <- Area
> ystart <- rev(Lines )
> yend <- rev(Lines )
> arrows(xstart, ystart, xend, yend, col="red", length =
> 0)
>
> # -------------End of program using order()
> John Kane, Kingston ON  Canada
>
> ______________________________________________
> [hidden email] mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
Reply | Threaded
Open this post in threaded view
|

Re: Problem with names() in a plot after ordering a data.frame. Syntax or stupidity?

Deepayan Sarkar
In reply to this post by John Kane-2
On 3/26/06, John Kane <[hidden email]> wrote:

> I am a complete newbie in R .
>    Using  R 2.2.0  Windows XP
>
> This started as a simple exercise to see if I could
> produce a simple
> Cleveland style dotchart with a line from the '2' axis
> to the dot rather
> than a continuous line as  do "dotchart" and
> "dotchart2".  At least I could not
> find that option.
>
> I got a crude program to work but it includes
> unnecessary steps.
> The data in Area (below) is sorted in reverse order to
> how I want it displayed
> I am doing to many 'sorts'  either a sort() or a rev()
> to handle this problem.
>
> When I change from sorting variables to using order()
> on the data.frame I
> lose my names() When I try to assign it, I get a NULL
> return.
> It is probably a very simple error but I cannot find
> it and I am not sure if
> it is syntax error, a more serious misunderstanding of
> the nature of the names()
> function or a confusion about how a data.frame and
> order() work.
>
> Any help gratefully  received.  Thanks
>
> #-----------------------Read in
> Data--------------------------------------------
>
> Name <- c( "Nunavut", "Québec", "Northwest
> Territories", "British Columbia",
>            "Ontario",  "Alberta",  "Saskatchewan",
> "Manitoba", "Yukon",
>          "Newfoundland",  "New Brunswick","Nova
> Scotia", "Prince Edward Island")
>
> Pcode <- c("NU","QC","NT","BC","ON",
> "AB","SK","MB","YT","NL","NB","NS","PE")
>
> Area <- c(1936113, 1365128, 1183085, 925186, 917741,
> 642317, 591670, 553556,
>             474391, 373872, 71450, 53338, 5660)
>
>  #  ------------------------Crude working
> program------------------------------
>
> provs <- data.frame(Name, Pcode, Area)

One possible solution (to your original problem) is

require(lattice)
dotplot(reorder(Name, Area) ~ Area, provs, type = c('p', 'h'))

-Deepayan

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html