Dear R helpers, I have following data.frame giving asset class (i.e. bank, corporate, sovereign etc. as there could be number of classes) and rating-wise default frequency. I need to plot graphs for each of these classes i.e. bank, corporate and sovereign where I will be plotting ratings (AAA, AA, etc) on the x-axis and their respective default probabilities on Y-axis. I have tried to write a function as given below, but it produces only one graph and that too just a straight line. I have recently started my R venture and trying to learn through the help I receive from various R forum helpers and through old R mails which are achieved. My code is as given below. library(plyr) df = data.frame(basel_asset_class c("bank","bank","bank","bank","bank","bank","bank","corporate","corporate","corporate","corporate","corporate","corporate","corporate","sovereign","sovereign","sovereign","sovereign","sovereign","sovereign","sovereign"), ratings c("AAA","AA","A","BBB","BB","B","CCC","AAA","AA","A","BBB","BB","B","CCC","AAA","AA","A","BBB","BB","B","CCC"), default_probability c(0.0027,0.0029,0.0031,0.0034,0.0037,0.004,0.0043,0.0025,0.0024,0.0024,0.0023,0.0022,0.0021,0.0021,0.003,0.0031,0.0032,0.0033,0.0034,0.0035,0.0036)) n_name = as.character(unique(df$basel_asset_class)) IPD = df$default_probability internal_category = c(1:7) # Total types of ratings DP_yearly_graphs = function(class, ratings, IPD) { flname = paste("Exponential Curve For " , n_name) png(filename=sprintf("%s%s%s%s%s", "Curve ", "( ", n_name," )", ".png"),width=480,height=480) par('bg'= "#FFFFCC") par(xaxt="n") plot(internal_category, IPD, "b", ylab="PD", xlab="Rating", fg"#804000", font.main=2,cex.main=1,col="Red",col.main"black",col.axis="black" ,col.lab = "black") title("Exponential Curve", sub = paste("(", n_name,")"), cex.main 1.2, font.main= 2, col.main= "black", cex.sub = 1, font.sub = 2, col.sub "black") par(xaxt="s") axis(1,at=1:7) box(which="outer",bty = "o", col = "#804000") dev.off() } output_graph <- ddply(.data=ons1, .variables = "basel_asset_class", .fun=function(x) DP_yearly_graphs(class = x$n_name, ratings=x$ratings, IPD = x$IPD)) Don't understand where I am going wrong. Will be too grateful if someone can guide me through. Thanking in advance. Regards Akshata [[alternative HTML version deleted]]
Dear sir, Thanks a lot for your great help. The graph is amazing. However, considering the number of classes (Here for an example purpose I have taken only 3 and in reality I will be dealing with even 25 classes), will it be possible (a) to generate separate graphs for each of these classes? (b) How do I draw a line connecting the plot points? Kindly advise. Thanks again sir. Regards Akshata On Tue, Mar 8, 2011 at 7:16 PM, John Kane <jrkrideau@yahoo.ca> wrote:> I renamed your dataset to df1 (df is a reserved word and changed the column > names to make typing easier. > > Using gggplot2 does this give you something like what you want? > ================================================================> library(ggplot2) > names(df1) <- c("class", "rate", "default") > > p <- ggplot(df1, aes(rate, default)) + geom_point() + facet_grid(class ~.) > p > =================================================================> > > > --- On Tue, 3/8/11, Akshata Rao <akshata.rao1908@gmail.com> wrote: > > > From: Akshata Rao <akshata.rao1908@gmail.com> > > Subject: [R] How to plot multiple graphs? > > To: r-help@r-project.org > > Received: Tuesday, March 8, 2011, 7:40 AM > > Dear R helpers, > > > > I have following data.frame giving asset class (i.e. bank, > > corporate, > > sovereign etc. as there could be number of classes) and > > rating-wise default > > frequency. > > > > I need to plot graphs for each of these classes i.e. bank, > > corporate and > > sovereign where I will be plotting ratings (AAA, AA, etc) > > on the x-axis and > > their respective default probabilities on Y-axis. > > > > I have tried to write a function as given below, but it > > produces only one > > graph and that too just a straight line. I have recently > > started my R > > venture and trying to learn through the help I receive from > > various R forum > > helpers and through old R mails which are achieved. > > > > My code is as given below. > > > > library(plyr) > > > > df = data.frame(basel_asset_class > > > c("bank","bank","bank","bank","bank","bank","bank","corporate","corporate","corporate","corporate","corporate","corporate","corporate","sovereign","sovereign","sovereign","sovereign","sovereign","sovereign","sovereign"), > > ratings > > > c("AAA","AA","A","BBB","BB","B","CCC","AAA","AA","A","BBB","BB","B","CCC","AAA","AA","A","BBB","BB","B","CCC"), > > default_probability > > > c(0.0027,0.0029,0.0031,0.0034,0.0037,0.004,0.0043,0.0025,0.0024,0.0024,0.0023,0.0022,0.0021,0.0021,0.003,0.0031,0.0032,0.0033,0.0034,0.0035,0.0036)) > > > > n_name = as.character(unique(df$basel_asset_class)) > > > > IPD = df$default_probability > > > > internal_category = c(1:7) # Total > > types of ratings > > > > DP_yearly_graphs = function(class, ratings, IPD) > > > > { > > flname = paste("Exponential Curve For " , > > n_name) > > png(filename=sprintf("%s%s%s%s%s", "Curve ", > > "( ", n_name," )", > > ".png"),width=480,height=480) > > > > par('bg'= "#FFFFCC") > > par(xaxt="n") > > > > plot(internal_category, IPD, "b", ylab="PD", > > xlab="Rating", fg> > "#804000", font.main=2,cex.main=1,col="Red",col.main> > "black",col.axis="black" ,col.lab = "black") > > title("Exponential Curve", sub = paste("(", > > n_name,")"), cex.main > > 1.2, font.main= 2, col.main= "black", > > cex.sub = 1, font.sub = 2, col.sub > > "black") > > par(xaxt="s") > > axis(1,at=1:7) > > box(which="outer",bty = "o", col > > "#804000") > > dev.off() > > > > } > > > > output_graph <- ddply(.data=ons1, .variables > > "basel_asset_class", > > .fun=function(x) DP_yearly_graphs(class = x$n_name, > > ratings=x$ratings, IPD = x$IPD)) > > > > Don't understand where I am going wrong. Will be too > > grateful if someone can > > guide me through. > > > > Thanking in advance. > > > > Regards > > > > Akshata > > > > [[alternative HTML version deleted]] > > > > ______________________________________________ > > R-help@r-project.org > > mailing list > > https://stat.ethz.ch/mailman/listinfo/r-help > > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > > and provide commented, minimal, self-contained, > > reproducible code. > > > > >[[alternative HTML version deleted]]
Hi Akshata, This is really a mess, but I'll try to "guide you through" (see below). On Tue, Mar 8, 2011 at 7:40 AM, Akshata Rao <akshata.rao1908 at gmail.com> wrote:> Dear R helpers, > > I have following data.frame giving asset class (i.e. bank, corporate, > sovereign etc. as there could be number of classes) and rating-wise default > frequency. > > I need to plot graphs for each of these classes i.e. bank, corporate and > sovereign where I will be plotting ratings (AAA, AA, etc) on the x-axis and > their respective default probabilities on Y-axis.OK, good description of the goal.> > I have tried to write a function as given below, but it produces only one > graph and that too just a straight line. I have recently started my R > venture and trying to learn through the help I receive from various R forum > helpers and through old R mails which are achieved. > > My code is as given below. > > library(plyr) > > df = data.frame(basel_asset_class > c("bank","bank","bank","bank","bank","bank","bank","corporate","corporate","corporate","corporate","corporate","corporate","corporate","sovereign","sovereign","sovereign","sovereign","sovereign","sovereign","sovereign"), > ratings > c("AAA","AA","A","BBB","BB","B","CCC","AAA","AA","A","BBB","BB","B","CCC","AAA","AA","A","BBB","BB","B","CCC"), > default_probability > c(0.0027,0.0029,0.0031,0.0034,0.0037,0.004,0.0043,0.0025,0.0024,0.0024,0.0023,0.0022,0.0021,0.0021,0.003,0.0031,0.0032,0.0033,0.0034,0.0035,0.0036)) >Good, thanks for including the example data set.> n_name = as.character(unique(df$basel_asset_class)) > > IPD = df$default_probabilityWhy do you copy this information to IPD? You don't really need to copies of it, and it just makes things more confusing.> > internal_category = c(1:7) ? ? ?# Total types of ratings > > DP_yearly_graphs = function(class, ratings, IPD) > > { > ? ?flname = paste("Exponential Curve For " , n_name) > ? ?png(filename=sprintf("%s%s%s%s%s", "Curve ", "( ", n_name," )", > ".png"),width=480,height=480) > > ? ?par('bg'= "#FFFFCC") > ? ?par(xaxt="n") > > ? ?plot(internal_category, IPD, "b", ylab="PD", xlab="Rating", ?fg> "#804000", font.main=2,cex.main=1,col="Red",col.main> "black",col.axis="black" ,col.lab = "black") > ? ?title("Exponential Curve", sub = paste("(", n_name,")"), cex.main > 1.2, ? font.main= 2, col.main= "black", cex.sub = 1, font.sub = 2, col.sub > "black") > ? ?par(xaxt="s") > ? ?axis(1,at=1:7) > ? ?box(which="outer",bty = "o", col = "#804000") > ? ?dev.off() > > } >Several problems here: 1) You never use the variables "class" or "ratings" in the function at all. You do use IPD, but that seems to be incidental rather than intentional. 2) You also initialize "flname" inside your function, but never use it. 3) I'm not sure the plotting command do what you think they do. I never learned base graphics so I'm not going to be much help with this one -- I'm just noticing the you labeled the graphes "Exponential curve", but that doesn't seem descriptive of the actual result. You should consult a manual on writing R functions as well as basic 'intro to R" kinds of tutorials. (see the official and contributed documentation on CRAN).> output_graph <- ddply(.data=ons1, .variables = "basel_asset_class", > .fun=function(x) DP_yearly_graphs(class = x$n_name, > ratings=x$ratings, IPD = x$IPD))There are several problems with this as well: 1) ddply is the wrong tool for the job. ddply takes a data.frame as input, and returns a data.frame as output. You don't want a data.frame as output, you want figures. The proper way to do this with plyr is with the d_ply function which returns nothing. See ?ddply and ?d_ply 2) What is ons1? You never define it! I guess you want .data=df 3) within the ddply call x refers to the subset of .data based on .variables. If .data = df, there is no n_name in x. Same goes for x$IPD. OK, so here is a fixed version. Note that we don't need to make separate IPD, n_name, or internal_category variables. # Get rid of clutter: rm(list=c("df", "internal_category", "IPD", "n_name")) # name the data dat instead of df dat <- structure(list(basel_asset_class = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("bank", "corporate", "sovereign"), class = "factor"), ratings = structure(c(3L, 2L, 1L, 6L, 5L, 4L, 7L, 3L, 2L, 1L, 6L, 5L, 4L, 7L, 3L, 2L, 1L, 6L, 5L, 4L, 7L), .Label = c("A", "AA", "AAA", "B", "BB", "BBB", "CCC"), class = "factor"), default_probability = c(0.0027, 0.0029, 0.0031, 0.0034, 0.0037, 0.004, 0.0043, 0.0025, 0.0024, 0.0024, 0.0023, 0.0022, 0.0021, 0.0021, 0.003, 0.0031, 0.0032, 0.0033, 0.0034, 0.0035, 0.0036 )), .Names = c("basel_asset_class", "ratings", "default_probability" ), row.names = c(NA, -21L), class = "data.frame") # Fix the function DP_yearly_graphs <- function(Data=dat, class.var="basel_asset_class", ratings="ratings", IPD="default_probability") { class <- unique(as.character(Data[[class.var]]))[1] png(filename=sprintf("%s%s%s%s%s", "Curve ", "( ", class," )",".png"), width=480,height=480) par('bg'= "#FFFFCC") par(xaxt="n") plot(as.numeric(factor(Data[[ratings]])), Data[[IPD]], "b", ylab="PD", xlab="Rating", fg="#804000", font.main=2,cex.main=1,col="Red", col.main="black",col.axis="black" ,col.lab = "black") title("Exponential Curve", sub = paste("(", class,")"), cex.main=1.2, font.main= 2, col.main= "black", cex.sub = 1, font.sub = 2, col.sub ="black") par(xaxt="s") axis(1,at=1:7) box(which="outer",bty = "o", col = "#804000") dev.off() } # Make the graphs d_ply(dat, .(basel_asset_class), DP_yearly_graphs) # I prefer this alternate *ply syntax, but up to you. HTH, Ista> > Don't understand where I am going wrong. Will be too grateful if someone can > guide me through. > > Thanking in advance. > > Regards > > Akshata > > ? ? ? ?[[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- Ista Zahn Graduate student University of Rochester Department of Clinical and Social Psychology http://yourpsyche.org