2015-07-22 2 views
3

Я создал линейный график, используя ggplot. Но его ребра не являются гладкими. Как я могу это сделать?Как сгладить кривую линии в ggplot?

enter image description here

Я попытался с помощью geom_smooth() и stat_summary() функции, но я не получил результатов. Показаны ошибки.

Вот мой код пути строки:

df <- data.frame(A=c(2,3,4,5,6,7,3,7,8,9,2),B=c(3,7,8,9,2,1,2,3,4,5,6),C=c(1,1,1,2,2,1,1,1,1,2,2)) 
go <- ggplot(df, aes(x=A, y=B, colour = C), pch = 17) +geom_point() 
go + geom_path(data = rbind(cbind(tail(df, -1), grp = 1:(nrow(df)-1)), 
          cbind(head(df, -1), grp = 2:nrow(df)-1)), 
      aes(group = interaction(grp))) 
+1

Покажите нам, какие ошибки вы получите. –

+1

Где вы пытались использовать 'stat_smooth'? Что именно там, где были ошибки? Не будет ли «ggplot (df, aes (x = A, y = B), pch = 17) + geom_point() + stat_smooth()' работать? – MrFlick

+0

@MrFlick Но для большого набора данных, такого как этот 'df <- data.frame (A = c (2,3,4,5,6,7,3,7,8,9,2), B = (3,7,8,9,2,1,2,3,4,5,6), C = C (1,1,1,2,2,1, 1,1,1,2, 2)) ' , показывающий гладкую линейную регрессию. Мне нужен аналогичный результат, как показано в примере, все точки подключены *, но плавно. –

ответ

4

пара вариантов, с помощью сглаживающих сплайнов и кривой Безье

plot(df[,1:2]) 
xspline(df[,1:2], shape=-0.2, lwd=2) # play with the shape parameter 

library(bezier) 
res <- bezier(seq(0, 1, len=100), df[,1:2], deg=nrow(df)-1) 
points(res, type="l", col="green", lwd=2) 

enter image description here

или в ggplot2

## Get points 
ps <- data.frame(xspline(df[,1:2], shape=-0.2, lwd=2, draw=F)) 

## Add to your plot 
go <- ggplot(df, aes(x=A, y=B, colour = factor(C)), pch = 17) + 
    geom_point(size=5) + 
    geom_path(data=ps, aes(x, y), col=1) 

enter image description here

+0

К сожалению, для ggplot2 xspline, похоже, терпит неудачу, когда первый раз не был вызван plot.new, поэтому вам нужно сначала построить что-то с базовой графикой, даже если указано draw = FALSE. – ddiez

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