2015-08-14 3 views
2

Я пытаюсь построить 2 набора точек данных и одну строку в R, используя ggplot. Вопрос, который у меня есть, - это легенда. Как видно из прилагаемого изображения, легенда применяет линии ко всем 3 наборам данных, хотя только одна из них нанесена на график с помощью строки.Построение точек и линий отдельно в R с помощью ggplot

Я растопил данные в один длинный кадр, но для этого все еще требуется отфильтровать наборы данных для каждого отдельного вызова до geom_line() и geom_path().

Я хочу, чтобы графика расплавленных данных, построение линии на основе одного набора данных и точек на оставшиеся два, с полной легендой.

Вот пример сценария я написал, чтобы произвести сюжет:

xseq <- 1:100 
x <- rnorm(n = 100, mean = 0.5, sd = 2) 
x2 <- rnorm(n = 100, mean = 1, sd = 0.5) 
x.lm <- lm(formula = x ~ xseq) 
x.fit <- predict(x.lm, newdata = data.frame(xseq = 1:100), type = "response", se.fit = TRUE) 
my_data <- data.frame(x = xseq, ypoints = x, ylines = x.fit$fit, ypoints2 = x2) 

## Now try and plot it 
melted_data <- melt(data = my_data, id.vars = "x") 

p <- ggplot(data = melted_data, aes(x = x, y = value, color = variable, shape = variable, linetype = variable)) + 
    geom_point(data = filter(melted_data, variable == "ypoints")) + 
    geom_point(data = filter(melted_data, variable == "ypoints2")) + 
    geom_path(data = filter(melted_data, variable == "ylines")) 

pushViewport(viewport(layout = grid.layout(1, 1))) # One on top of the other 
print(p, vp = viewport(layout.pos.row = 1, layout.pos.col = 1)) 

Resulting plot from the sample code above

+1

вы сделали некоторые исследования? Есть, например, http://stackoverflow.com/questions/18394391/r-custom-legend-for-multiple-layer-ggplot и http://stackoverflow.com/questions/17148679/ggplot2-need-to-construct-a-manual- legend-for-complex-plot – mts

+0

Это не совсем то, что я ищу. Мне не нужна разделенная легенда; Мне нужна одна легенда, так как у меня есть следующие изменения: 1) красная линия без круга; 2) зеленый треугольник без пунктирной линии; 3) синий квадрат без разделительной линии. – Lancophone

ответ

2

Вы можете установить их вручную, как это:

Мы установили тип линии = «твердый» для первого и «пусто» для других (без строки).

Аналогичным образом для первого элемента мы не устанавливаем никакой формы (NA), а для других мы будем устанавливать любую форму, в которой мы нуждаемся (я просто поставлю для примера 7 и 8). См. http://www.r-bloggers.com/how-to-remember-point-shape-codes-in-r/, чтобы помочь вам выбрать правильные формы для ваших нужд.

Если вы довольны точками, то вы можете использовать my_shapes = c(NA,16,16) и scale_shape_manual(...) не требуется.

my_shapes = c(NA,7,8) 

ggplot(data = melted_data, aes(x = x, y = value, color=variable, shape=variable)) + 
    geom_path(data = filter(melted_data, variable == "ylines")) + 
    geom_point(data = filter(melted_data, variable %in% c("ypoints", "ypoints2"))) + 
    scale_colour_manual(values = c("red", "green", "blue"), 
         guide = guide_legend(override.aes = list(
          linetype = c("solid", "blank","blank"), 
          shape = my_shapes))) + 
    scale_shape_manual(values = my_shapes) 

enter image description here

Но я очень интересно, если есть какой-то более автоматизированным способом. Надеюсь, кто-то может опубликовать лучший ответ.

Это сообщение полагались довольно сильно на этот ответ: ggplot2: Different legend symbols for points and lines

+0

Спасибо @Pekka, это точно что я искал! :-) Я также очень хочу услышать о возможных ответах на автомат. Я где-то слышал, что это возможно, но не могу вспомнить источник – Lancophone

+0

Привет Пекка, это не совсем правильно, поскольку я не могу изменить форму сюжета. Хотя легенда верна, говоря зеленые точки и синие треугольники, сюжет не нравится – Lancophone

+0

Я понимаю, что вы имеете в виду. Затем нам нужно также установить фигуры вручную. Я отредактировал ответ. К счастью, мы можем определить вектор формы один раз и использовать тот же вектор, что и для легенды и сюжета. – Pekka

Смежные вопросы