2015-08-06 4 views
0

Здесь первые 9 строк (из 54) и первые 8 столбцов (из 1003) моего набора данныхДобавление точки для построения с помощью ggplot2

stream n rates  means   1   2   3   4 
1 Brooks 3 3.0 0.9629152 0.42707006 1.9353659 1.4333884 1.8566225 
2 Siouxon 3 3.0 0.5831929 0.90503736 0.2838483 0.2838483 1.0023212 
3 Speelyai 3 3.0 0.6199235 0.08554021 0.7359903 0.4841935 0.7359903 
4 Brooks 4 7.5 0.9722707 1.43338843 1.8566225 0.0000000 1.3242210 
5 Siouxon 4 7.5 0.5865031 0.50574543 0.5057454 0.2838483 0.4756304 
6 Speelyai 4 7.5 0.6118634 0.32252396 0.4343109 0.6653132 2.2294652 
7 Brooks 5 10.0 0.9637475 0.88984211 1.8566225 0.7741612 1.3242210 
8 Siouxon 5 10.0 0.5804420 0.47501800 0.7383634 0.5482181 0.6430847 
9 Speelyai 5 10.0 0.5959238 0.15079491 0.2615963 0.4738504 0.0000000 

Вот простой сюжет я сделал с использованием значения, найденные в столбце means для всех строк с именем потока Speelyai (18).

enter image description here

Средство столбец вычисляется как среднее значение для всей строки. Каждый столбец представляет собой 1 симуляцию. Таким образом, средний столбец представляет собой среднее значение 1000 симуляций. Я хотел бы также нарисовать фактические значения моделирования на графике. Я думаю, что было бы информативно не только иметь среднее значение (с линией), но и показывать «сырые» данные (симуляции) как точки. Я вижу, что я могу использовать geom_point(), но я не уверен, как получить все точки для любой строки, которая имеет имя потока «Speelyai»

СПАСИБО


enter image description here

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

ответ

1

Согласен с @NickKennedy, что это хорошая идея перестройки ваших данных от широкоугольного до тех пор:

library(reshape) 
x2<-melt(x,id=c("stream","n","rates")) 
x2<-x2[which(x2$variable!="means"),] # this eliminates the entries for means 

Теперь пришло время заново вычислить средства:

library(data.table) 
setDT(x2) 
setkey(x2,"stream") 
means.sp<-x2["Speelyai",.(mean.stream=mean(value)),by=rates] 

Итак, теперь вы можете построить:

library(ggplot2) 
p<-ggplot(means.sp,aes(rates,mean.stream))+geom_line() 

Какой именно то, что нужно было, так что теперь давайте добавим пункты:

p<-p+geom_point(data=x2[x2$stream=="Speelyai",],aes(rates,value)) 

Обратите внимание, что в вызове geom_point вам нужно специально объявить data=, как вы работаете с другим набором данных на который вы указали в обращении к ggplot.

========== EDIT ДОБАВИТЬ =============

ответить на ваши комментарии, и заимствования из ответов @akrun дал вам here, вам необходимо добавить вычисление ошибки, а затем изменить вызов geom_point:

df2 <- data.frame(stream=c('Brooks', 'Siouxon', 'Speelyai'), 
     value=c(0.944062036, 0.585852702, 0.583984402), stringsAsFactors=FALSE) 
x2$error <- x2$value-df2$value[match(x2$stream, df2$stream)]  

а затем измените вызов geom_point:

geom_point(data=x2[x2$stream=="Speelyai",],aes(rates,error)) 
+0

Обратите внимание, что даже если вы построите ошибку, диапазон y будет по-прежнему достаточно большим (около 4 единиц), чтобы сгладить кривую средних (что, я понимаю, вы хотите показать как резко меняющееся), но затем «вы не можете скрыть факты ";) – PavoDive

+0

Да, вы правы! Действительно ли это тот самый диапазон, который является проблемой ... AHH! Я не уверен что делать.... – Christopher

1

Я бы предложил переформатировать ваши данные в длинном формате, а не в широком. Например:

library("tidyr") 
library("ggplot2") 
my_data_tidy <- gather(my_data, column, value, -c(stream, n, rates, means)) 
ggplot(subset(my_data_tidy, stream == "Speelyai"), aes(rates, value)) + 
    geom_point() + 
    stat_summary(fun.y = "mean", geom = "line") 

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

ggplot(subset(my_data_tidy, stream == "Speelyai"), aes(rates, value)) + 
    geom_point() + geom_line(aes(rates, means), data = subset(my_data, stream == "Speelyai")) 
+0

Я вижу. Я полагаю, что ваш первый код ggplot, где он вычисляет средства, не имеет большого значения, он все равно должен иметь такое же значение. Образ, который создается, выглядит НАСТОЯТЕЛЬНО другим, что я первоначально опубликовал. Я не уверен, как добавить этот образ в этот комментарий, чтобы показать вам. – Christopher

+0

Разные как? Трудно проверить, не видя ваших полных данных, хотя теперь у вас будет 18000 точек. Возможно, вам придется играть с 'alpha', чтобы сделать сюжет полезной. –

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