2016-11-18 6 views
-3

Я построил график с месячными данными о температуре со следующей командой. Здесь мне нужно добавить легенду с определенной формой (16, 17, 18 ...), тип линии (1,1,2, ....) и метки (1977, 1978, 1979 ....). Я пробовал разные способы, но не повезло, что это не привело к какой-либо ошибке.Полная ручная легенда с формой, типом линии, этикетками, определенными в ggplot2

здесь раздел моих данных

structure(list(month = structure(1:12, .Label = c("Jan", "Feb", 
"Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", 
"Dec"), class = "factor"), X1977 = c(10.3, 11.8, 15.4, 18.7, 
20.3, 22, 23.5, 24.5, 20.1, 17.2, 15.2, 16.5), X1978 = c(10.3, 
8, 10.8, 16.9, 20.2, 20.3, 20, 20, 17.9, 16.4, 11.4, 12.9), X1979 = c(13.9, 
12, 13.4, 17.5, 19.6, 20.3, 19.3, 19.3, 18.3, 16.1, 14.5, 10.6 
)), .Names = c("month", "X1977", "X1978", "X1979"), class = "data.frame",row.names = c(NA, 
-12L)) 


    p <- ggplot(t.df, aes(month, X1977)) 
    p 
    p <-p + geom_point(aes(month, X1977),shape=16) + geom_line(aes(x=1:12, y= X1977)) 
    p <- p+ geom_point(aes(month, X1978),shape=17) + geom_line(aes(x=1:12, y= X1978)) 
    p <- p+ geom_point(aes(month, X1979),shape=18) + geom_line(aes(x=1:12, y= X1979), linetype=2) 
    p2 <- p+ labs(x="Month", y="Mean Temperature") 
    p2 

    p2 + theme(legend.position = "right")+ 
     scale_fill_manual(labels=c("1977", "1978", "1979"))+ 
     scale_linetype_manual(1,1,2)+ scale_shape_manual(16,17,19) 
    # this code does not yield error but legend is not added on the plot 
+1

Вы можете поделиться небольшим образцом воспроизводимых данных? –

+0

scale_shape_manual (values ​​= c (16,17,19)) правильный способ вызова? Аналогично для linetype_manual() –

+0

Привет, я добавил раздел моих данных в свой пост. – MKS

ответ

0

Первый появляются ваши данные, чтобы быть в широком формате (ваши временные ряды в отдельных столбцах). ggplot2 работает лучше всего с длинным форматом, где ваши данные находятся в паре ключей. Вы можете преобразовать свои данные с помощью пакета tidyr, в частности, используя функции gather и spread.

Второй вопрос заключается в том, что если вы хотите, shapefill и linetype появляются в легендах, вам необходимо включить их в вашем aes() вызова. В вашем коде у вас нет fill aes, поэтому вам нужно включить это.

Раствор ниже:

library(tidyr) 
library(ggplot2) 

plot_data <- gather(df, year, temperature, X1977, X1978, X1979) 


ggplot(plot_data, aes(x = month, y = temperature, color = year)) + 
    geom_point(aes(shape = year)) + 
    geom_line(aes(linetype = year, group = year)) + 
    labs(x = "Month", y = "Mean Temperature") + 
    theme(legend.position = "right") + 
    scale_fill_manual(labels = c("1977", "1978","1979"), breaks = c("X1977","X1978","X1979"), values = c("red","green","blue")) + 
    scale_linetype_manual(values = c("X1977" = 1, "X1978" = 1, "X1979" = 2)) + 
    scale_shape_manual(values = c("X1977" = 16, "X1978" = 17, "X1979" = 18)) 

enter image description here

Обратите внимание, как используются весы. ggplot2 documentation site имеет фантастические примеры.

+0

Спасибо. Я добавил свои данные. извините, коды, которые вы создали, не работали над моей структурой данных. Могу ли я запросить у вас обновление своих кодов в соответствии с моим набором данных. Большое спасибо. – MKS

+0

Очень легко обновить код, чтобы он соответствовал вашим переменным. Обязательно попробуйте сделать это самостоятельно, прежде чем обращаться за помощью. Обновлен код выше –