Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ggplot 2 "Error: Discrete value supplied to continuous scale"

Tags:

r

ggplot2

I would like to ask how to fix this bug described in question title? Just yesterday, the code was working fine and the plotting routine produced the desired graph. Woke up today and tried to add some features and then got the error message.

Any clue as why and how to fix this?

Thx

Data link: Data.csv

code:

    # Loading data
    morStats <- read.csv(file = "F:/Purdue University/RA_Position/PhD_ResearchandDissert/PhD_Draft/DissertationDraft/MoroccoCGE-CC_Stats.csv", header=TRUE, sep=",", na.string="NA", dec=".", strip.white=TRUE)

    # Transferring the .csv data into data frames
    moroccostats <- as.data.frame(morStats)

    # Changing the data in the dataframe to "as.numeric"
    moroccostats[3:38] <- sapply(moroccostats[3:38],as.numeric)
    moroccostats <- droplevels(moroccostats)

    # reorder 
    moroccostats <- transform(moroccostats,year=factor(year,levels=unique(year)))

    # Load packages
    library(reshape2)
    library(ggplot2)
    library(lattice)
    library(grid)
    library(plyr)
    library(gridExtra)
    library(scales)

    #----------------------------------------------------------------------
    # Figure 1: Evolution of population (in absolute terms) 1960-2050
    #---------------------------------------------------------------------

    #_Code_Begin...

    moroccostats.f <- melt(moroccostats, id="year")
    morstats.pop <- moroccostats.f[moroccostats.f$variable %in% c("pop_t","pop_ur","pop_ru"),]

    Figure1 <- ggplot(data=morstats.pop,aes(x=factor(year), y=value,colour=variable))
    Figure1 + geom_line(aes(group=factor(variable)),size=1) + geom_point() + scale_colour_manual("Population",labels=c("Total","Urban","Rural"),values = c("black","red","blue")) +
    labs(y="Population (in 1000)") + 
    theme(axis.text.x = element_text(colour = 'black', angle = 90, size = 13, hjust = 1, vjust = 0.5),axis.title.x = element_blank()) + 
    theme(axis.text.y = element_text(colour = 'black', size = 13, hjust = 0.5, vjust = 0.5), axis.title.y = element_text(size = 10, hjust = 0.5, vjust = 0.2, face = 'bold')) +
    scale_x_discrete(breaks = seq(1960, 2050, by=2)) +
    scale_y_continuous(breaks = seq(0, 42000, by=5000))

    #_Code_End...
like image 543
iouraich Avatar asked May 13 '13 18:05

iouraich


1 Answers

moroccostats has the structure

> str(moroccostats)
'data.frame':   91 obs. of  38 variables:
 $ year            : Factor w/ 91 levels "1960","1961",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ periodframe     : Factor w/ 4 levels "0","Phase 1 (1965 to 1985)",..: 1 1 1 1 1 2 2 2 2 2 ...
 $ pop_t           : num  11635 11897 12177 12473 12785 ...
 $ pop_ur          : num  3395 3547 3703 3862 4026 ...
 ...

When you melt that by year to get moroccostats.f, you get

> str(moroccostats.f)
'data.frame':   3367 obs. of  3 variables:
 $ year    : Factor w/ 91 levels "1960","1961",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ variable: Factor w/ 37 levels "periodframe",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ value   : chr  "0" "0" "0" "0" ...

Note that value is a character because periodframe was a factor. I'm guessing what changed was that periodframe went from being a number to a character (the "Phase 1 (1965 to 1985)" bits).

Since you are only plotting the pop_t and pop_ur and pop_ru columns, pull those out before melting

morstats.pop <- melt(moroccostats[c("year","pop_t","pop_ur","pop_ru")], id="year")

then you don't have to worry about coercions to other types dues to irrelevant columns.

like image 126
Brian Diggs Avatar answered Oct 03 '22 00:10

Brian Diggs