2013-12-15 4 views
1

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

x <- seq(-3,3,0.0001) 
y <- dnorm(x,0,1) 
ytop <- dnorm(-3,3,0.001) 
df <-data.frame(x=x,y=y) 
p <- ggplot(df, aes(x=x,y=y)) + geom_line() 

cover <- rbind(c(1,0), subset(df, x > 1), c(df[nrow(df), "X"], 0)) 

p + geom_segment(aes(x=1,y=0, xend=2.5, yend=ytop)) + 
    geom_polygon(data = cover, aes(x, y)) 

Может кто-нибудь объяснить мне, почему я портя эту цифру и получения линий под затененной области?

enter image description here

+0

Похоже, ты не пошел у = 0 на полюсах вашего определения многоугольника. –

+0

hmm хотя 'tail (cover)' показывает последние значения для 'y' are' 0' – user1322296

ответ

6

Вы сделали две ошибки, которые я вижу: 1) с помощью «X», когда имя столбца «х», и не завершить полигон обратно (х = 1, у = 0) в конец.

cover <- do.call(rbind, list(data.frame(x=1,y=0), 
           subset(df, x > 1), # the x,y points 
            data.frame(x=df[nrow(df), "x"],y= 0), # drop to y=0 
            data.frame(x=1,y=0))) # complete the bottom 
    p + geom_segment(aes(x=1,y=0, xend=2.5, yend=ytop)) + 
     geom_polygon(data = cover, aes(x, y)) 

На моей машине я также заметил, что графический движок, казалось, оставить один пиксель прыгать по дну которой я мог бы снять с довольно хаком Времнной регулировки:

cover <- do.call(rbind, list(data.frame(x=1,y=0), 
           subset(df, x > 1), 
           data.frame(x=df[nrow(df), "x"],y= -0.001), 
           data.frame(x=1,y=0))) 

(я думаю, Я просто компенсирую чужую ошибку, но, возможно, Земля изогнута на SD> 2?)

И немного больше экспериментов предполагает, что корректировка ad-hoc наряду с исправлением «X» орфографии будет недостаточной (что geom_polygon достаточно умен, чтобы закрыть себя):

cover <- do.call(rbind, list(data.frame(x=1,y=0), 
           subset(df, x > 1), 
           data.frame(x=df[nrow(df), "x"],y= -0.001))) 
+0

спасибо, что показал мне, где я ошибся, заканчивая на 'x = 1' и' y = 0'! и супер плюс, чтобы очистить этот дополнительный пиксель, который я только заметил, увидев ваш первоначальный ответ! – user1322296

+0

. @ Dwin, если я могу попросить ваш совет, я в настоящее время пытаюсь изменить цвет многоугольника как функцию 'x', например. 'covert $ col <- 1: nrow (cover)', но 'fill' будет устанавливать только один цвет для каждого полигона. Мне было интересно, знаете ли вы, что это возможно или нет, и, может быть, стоит вопрос, не могу ли я понять это? – user1322296

+0

hmm похоже, мне понадобится многоугольников по x, чтобы получить градиент заполнения, возможно, ggplot - это не так, и есть другой подход, чтобы получить градиент заполнения под кривой. – user1322296

4

Вот более простой способ сделать это.

x <- seq(-3,3,0.0001) 
y <- dnorm(x,0,1) 
df <-data.frame(x=x,y=y) 
ggplot(df, aes(x=x,y=y)) + 
    geom_line()+ 
    geom_ribbon(data=subset(df,x>1), aes(ymin=0, ymax=y)) 

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