John Kane
2006-Mar-26 18:59 UTC
[R] Problem with names() in a plot after ordering a data.frame. Syntax or stupidity?
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
Gabor Grothendieck
2006-Mar-26 19:52 UTC
[R] Problem with names() in a plot after ordering a data.frame. Syntax or stupidity?
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 <jrkrideau at yahoo.ca> 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 > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html >
Deepayan Sarkar
2006-Mar-26 22:27 UTC
[R] Problem with names() in a plot after ordering a data.frame. Syntax or stupidity?
On 3/26/06, John Kane <jrkrideau at yahoo.ca> 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