0

I have a ggplot chart that uses faceting and a manual colour assignment. I would like to define the variables outside the call itself so that I don't have to go digging in scale_colour_manual and other areas to change the values used in breaks or values call of scale_colour_manual.

Let's say these are the variables.

var1 <- 'series.a'
var1.label <- "Series A result"
var2 <- 'series.b'
var2.label <- "Series B result"

In the values or breaks I can use something like this:

c('Series A result' = alpha("blue", 0.5),'Series B result' = alpha("red",0.5))

This plots fine, because the code above generates the following output:

Series A result Series B result 
    "#0000FF80"     "#FF000080"

Whereas this code:

c(var1.label = alpha("blue", 0.5), var2.label = alpha("red",0.5))

does not plot because it produces this, in which the names of the elements do not match the values we are using for colour i.e. 'Series A result' and 'Series B result':

 var1.label  var2.label 
"#0000FF80" "#FF000080"

So the question seems to be: how I can get c() to use the values of the variables rather than their names?

I have looked at eval, parse and even force but they don't seem to do what I want. I suspect this is a really simple piece of R but it's not a problem I have yet bumped into. Example code follows if needed.

require(ggplot2)
require(reshape)
require(scales)

# Create data
set.seed(78910)
mydf <- data.frame(
                   mydate = seq(as.Date('2013-01-01'), 
                       as.Date('2013-01-10'), by = 'day'),
                   series.a = runif(10, 100, 200),
                   series.b = runif(10, 2000, 3000))
tail(mydf)
mymelt <- melt(mydf, id.var = 'mydate')

# Define user variables
var1 <- 'series.a'
var1.label <- "Series A result"
var2 <- 'series.b'
var2.label <- "Series B result"

# Which makes creating labels for the faceting easier
mymelt$label.col <- ifelse(mymelt$variable == var1, var1.label, var2.label)
tail(mymelt)

# Plots without problems
ggplot(mymelt, aes(y = value, x = mydate)) +
    geom_line(aes(colour = label.col)) +
    scale_colour_manual("",
                        breaks = c('Series A result','Series B result'),
                        values = c('Series A result' = alpha("blue", 0.5),
                        'Series B result' = alpha("red",0.5))) +
    facet_wrap(~ label.col, ncol = 1, scale = "free_y")

# Does not plot
ggplot(mymelt, aes(y = value, x = mydate)) +
    geom_line(aes(colour = label.col)) +
    scale_colour_manual("",
                        breaks = c(var1.label, var2.label),
                        values = c(var1.label = alpha("blue", 0.5),
                        var2.label = alpha("red",0.5))) +
    facet_wrap(~ label.col, ncol = 1, scale = "free_y")

# Not plotting because names in second case are not correct
c('Series A result' = alpha("blue", 0.5),'Series B result' = alpha("red",0.5))
c(var1.label = alpha("blue", 0.5), var2.label = alpha("red",0.5))

The desired result is this kind of image:

screenshot

2
  • 1
    Have you considered scale_colour_identity? Commented Jan 22, 2013 at 2:13
  • @sebastian-c Thanks, I wasn't even aware of the existence of scale_colour_identity! It looks very handy and I may use this in future. Commented Jan 22, 2013 at 2:49

1 Answer 1

2
v <- c(alpha("blue", 0.5), alpha("red",0.5))
names(v) <- c(var1.label, var2.label)

> v
## Series A result Series B result 
##     "#0000FF80"     "#FF000080" 

then use values = v in the code.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks, I was hoping to be able to do something within the ggplot call itself but tweaking it beforehand like this certainly works and has resolved the problem.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.