Используя ggplot2, как я могу представить точку и линию в легенде

Используя ggplot2, я рисую несколько функций и ряд точек. Я не могу понять, как представить точки на легенде. Я понимаю, что мне нужно использовать функцию aes(), но я не совсем понимаю, как это сделать. Прошу прощения, что пример такой длинный, но я не знаю, как еще его проиллюстрировать.

## add ggplot2
library(ggplot2)

# Declare Chart values
y_label = expression("y_axis"~~bgroup("(",val / km^{2},")"))
x_label = "x_axis"

#############################
## Define functions
# Create a list to hold the functions
funcs <- list()
funcs[]

# loop through to define functions
for(k in 1:21){

# Make function name
funcName <- paste('func', k, sep = '' )

# make function
func = paste('function(x){exp(', k, ') * exp(x*0.01)}', sep = '')

funcs[[funcName]] = eval(parse(text=func))

}

    # Specify values
    yval = c(1:20)                              
    xval = c(1:20)                                

    # make a dataframe
    d = data.frame(xval,yval)

    # Specify Range
    x_range <- range(1,51)

# make plot
p <-qplot(data = d,
        x=xval,y=yval,        
        xlab = x_label, 
        ylab = y_label,
        xlim = x_range
        )+ geom_point(colour="green")


for(j in 1:length(funcs)){

p <- p + stat_function(aes(y=0),fun = funcs[[j]], colour="blue", alpha=I(1/5))

}

# make one function red
p <- p + stat_function(fun = funcs[[i]], aes(color="red"), size = 1) +
    scale_colour_identity("", breaks=c("red", "green","blue"),
    labels=c("Fitted Values", "Measured values","All values")) 

# position legend and make remove frame
p <- p + opts(legend.position = c(0.85,0.7), legend.background = theme_rect(col = 0)) 

print(p)     

Заранее спасибо - за последние несколько дней я многому научился в этом сообществе.


person djq    schedule 12.02.2010    source источник


Ответы (3)


Решение смотрите ниже. Основная идея заключается в следующем: представьте, что под точками находится невидимая линия, а под линиями — невидимые точки. Таким образом, каждая «серия» получает атрибуты цвета, формы и типа линии, и в конце мы вручную установим для них невидимые значения (0 для линий, NA для точек) по мере необходимости. ggplot2 автоматически объединит легенды для трех атрибутов.

# make plot 
p <- qplot(data = d, x=xval, y=yval, colour="Measured", shape="Measured",
          linetype="Measured",  xlab = x_label,   ylab = y_label, xlim = x_range,
          geom="point") 

#add lines for functions 
for(j in 1:length(funcs)){ 
   p <- p + stat_function(aes(colour="All", shape="All", linetype="All"), 
                          fun = funcs[[j]],  alpha=I(1/5), geom="line")  
} 

# make one function special 
p <- p + stat_function(fun = funcs[[1]], aes(colour="Fitted", shape="Fitted",
                       linetype="Fitted"), size = 1, geom="line")

# modify look 
 p <- p +  scale_colour_manual("", values=c("green", "blue", "red")) + 
           scale_shape_manual("", values=c(19,NA,NA)) + 
           scale_linetype_manual("", values=c(0,1,1)) 

print(p) 
person Aniko    schedule 18.02.2010
comment
Спасибо - это то, чего я хотел добиться. - person djq; 20.02.2010

Может помочь установка постоянной цветовой эстетики для каждого геометрического объекта. Вот небольшой пример:

require(ggplot2)
set.seed(666)
N<-20
foo<-data.frame(x=1:N,y=runif(N),z=runif(N))
p<-ggplot(foo)
p<-p+geom_line(aes(x,y,colour="Theory"))
p<-p+geom_point(aes(x,z,colour="Practice"))

#Optional, if you want your own colours
p<-p+scale_colour_manual("Source",c('blue','red'))

print(p)

альтернативный текст

person Jyotirmoy Bhattacharya    schedule 15.02.2010
comment
Можно ли получить это без очереди? Я надеялся просто поставить точку в легенде для категории «практика». Спасибо. - person djq; 15.02.2010
comment
Установите цвет в качестве опции, а не в качестве отображаемой эстетики для линии, т. е. измените три строки перед печатью на: p‹-p+geom_line(aes(x,y),col='blue'); p‹-p+geom_point(aes(x,z,color=red)); p‹-p+scale_color_identity(Легенда,метки=Практика,разрывы=красный) - person Jyotirmoy Bhattacharya; 15.02.2010
comment
Это все еще не то, чего я надеюсь достичь, поскольку это просто создает красную точку в легенде. Я хочу и теорию, и практику, но синюю линию для теории и красную точку для практики. Но спасибо за предложение. - person djq; 16.02.2010

Это изначально не поддерживается в ggplot2, но я надеюсь, что выясню, как это сделать в будущей версии.

person hadley    schedule 23.02.2010