2012-03-15 5 views
-4

У меня есть фрейм данных, который содержит даты и данные об использовании процессора в течение нескольких месяцев. Я могу создать сглаженный gplot так:Отображение дат в xaxis в удобочитаемом формате R

qplot(Date, CPU, data=app1, geom=c("line", "smooth"), method = "lm", 
    ylab="CPU", xlab="Date", main=") 

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

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

данных выглядит следующим образом:

Date CPU 


3/10/2012 0:00 28.7 
3/9/2012 0:00 94.1 
3/2/2012 0:00 82.7 
2/23/2012 0:00 68.5 
2/22/2012 0:00 67.4 
2/10/2012 0:00 100 
2/6/2012 0:00 100 
2/4/2012 0:00 89.4974 
2/3/2012 0:00 100 
2/1/2012 0:00 100 
1/29/2012 0:00 57.4693 
1/25/2012 0:00 100 
1/21/2012 0:00 98.2085 
1/20/2012 0:00 99.9987 
1/19/2012 0:00 99.9698 
1/17/2012 0:00 99.9802 
1/15/2012 0:00 51.5781 
1/14/2012 0:00 86.5854 
1/12/2012 0:00 100 
1/10/2012 0:00 100 
1/8/2012 0:00 48.3474 
1/6/2012 0:00 99.9833 
1/5/2012 0:00 100 
1/2/2012 0:00 100 
12/31/2011 0:00 99.6901 
12/25/2011 0:00 76.543 
12/21/2011 0:00 99.9536 
12/19/2011 0:00 100 
12/16/2011 0:00 99.9807 
12/14/2011 0:00 99.9995 
12/6/2011 0:00 100 
3/8/2012 0:00 83.2 
3/7/2012 0:00 67.7 
3/6/2012 0:00 70.8 
3/5/2012 0:00 92.6 
2/27/2012 0:00 77.3 
2/24/2012 0:00 74.1 
2/21/2012 0:00 79.3 
2/19/2012 0:00 57.8052 
2/18/2012 0:00 99.9938 
2/14/2012 0:00 100 
2/9/2012 0:00 100 
2/8/2012 0:00 100 
2/7/2012 0:00 100 
2/5/2012 0:00 57.478 
2/2/2012 0:00 100 
1/31/2012 0:00 100 
1/30/2012 0:00 100 
1/28/2012 0:00 87.604 
1/27/2012 0:00 100 
1/24/2012 0:00 100 
1/23/2012 0:00 100 
1/18/2012 0:00 100 
1/16/2012 0:00 99.9477 
1/13/2012 0:00 99.9979 
1/9/2012 0:00 100 
1/7/2012 0:00 92.6704 
1/4/2012 0:00 100 
1/3/2012 0:00 100 
1/1/2012 0:00 17.501 
12/28/2011 0:00 100 
12/27/2011 0:00 100 
12/23/2011 0:00 99.999 
12/22/2011 0:00 100 
12/20/2011 0:00 99.9865 
12/18/2011 0:00 8.2211 
12/15/2011 0:00 100 
+5

Пожалуйста, прочитайте о [как сделать воспроизводимый пример] (http://stackoverflow.com/q/5963269/324364), прежде чем задавать вопросы. Кроме того, вы получите более благоприятный ответ, если вы продемонстрируете некоторые признаки того, что сделали попытку самостоятельно, прежде чем просить других сделать это за вас. – joran

+0

Что значит «если дата больше или меньше сглаженной линии»? – Ben

+0

Я не могу показать все даты в xaxis, недостаточно места. Возможно, я подумывал показать даты, когда CPU идет и опускает гладкую линию. –

ответ

6

То, что вы хотите, пока не ясно, но я возьму удар в этом.

Начнем с создания воспроизводимого набора данных.

app1 <- 
structure(list(Date = structure(c(15409, 15408, 15401, 15393, 
15392, 15380, 15376, 15374, 15373, 15371, 15368, 15364, 15360, 
15359, 15358, 15356, 15354, 15353, 15351, 15349, 15347, 15345, 
15344, 15341, 15339, 15333, 15329, 15327, 15324, 15322, 15314, 
15407, 15406, 15405, 15404, 15397, 15394, 15391, 15389, 15388, 
15384, 15379, 15378, 15377, 15375, 15372, 15370, 15369, 15367, 
15366, 15363, 15362, 15357, 15355, 15352, 15348, 15346, 15343, 
15342, 15340, 15336, 15335, 15331, 15330, 15328, 15326, 15323 
), class = "Date"), CPU = c(28.7, 94.1, 82.7, 68.5, 67.4, 100, 
100, 89.4974, 100, 100, 57.4693, 100, 98.2085, 99.9987, 99.9698, 
99.9802, 51.5781, 86.5854, 100, 100, 48.3474, 99.9833, 100, 100, 
99.6901, 76.543, 99.9536, 100, 99.9807, 99.9995, 100, 83.2, 67.7, 
70.8, 92.6, 77.3, 74.1, 79.3, 57.8052, 99.9938, 100, 100, 100, 
100, 57.478, 100, 100, 100, 87.604, 100, 100, 100, 100, 99.9477, 
99.9979, 100, 92.6704, 100, 100, 17.501, 100, 100, 99.999, 100, 
99.9865, 8.2211, 100)), .Names = c("Date", "CPU"), row.names = c(NA, 
-67L), class = "data.frame") 

Здесь Date столбец класса Date; Я не знаю, есть ли у вас это или нет (не могу сказать, что вы опубликовали, поэтому был запрошен полностью воспроизводимый пример).

Преобразование ваш qplot синтаксис в ggplot синтаксис (и добавления точек, так что я могу видеть, что происходит легче):

ggplot(app1, aes(x=Date, y=CPU)) + 
    geom_point() + 
    geom_line() + 
    geom_smooth(method="lm") 

enter image description here

Ваш комментарий

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

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

Для этого вам не нужно ggplot2 сделать моделирование, а сделать это самостоятельно.

mdl <- lm(CPU~Date, data=app1) 
app2 <- cbind(app1, predict(mdl, interval="confidence")) 

При этом исходный график может быть воспроизведен.

ggplot(app2, aes(x=Date)) + 
    geom_point(aes(y=CPU)) + 
    geom_line(aes(y=CPU)) + 
    geom_smooth(aes(y=fit, ymin=lwr, ymax=upr), stat="identity") 

enter image description here

Теперь с этим отдельный набор данных, вы можете дополнительно аннотировать точки, какие из них являются чрезвычайными и должны быть помечены.

app2 <- transform(app2, 
        extreme = (CPU < lwr) | (CPU > upr)) 

ggplot(app2, aes(x=Date)) + 
    geom_point(aes(y=CPU)) + 
    geom_line(aes(y=CPU)) + 
    geom_smooth(aes(y=fit, ymin=lwr, ymax=upr), stat="identity") + 
    geom_text(aes(label=as.character(Date), y=CPU), data=app2[app2$extreme,], 
      size=3, angle=90) 

enter image description here

Вы можете сделать еще больше форматирования текста, чтобы сделать его лучше. Вот один пример.

app2 <- transform(app2, 
        hadj = ifelse(extreme, ifelse(CPU < lwr, 1.1, -0.1), NA)) 

ggplot(app2, aes(x=Date)) + 
    geom_point(aes(y=CPU)) + 
    geom_line(aes(y=CPU)) + 
    geom_smooth(aes(y=fit, ymin=lwr, ymax=upr), stat="identity") + 
    geom_text(aes(label=format(Date, "%b %d"), y=CPU, hjust=hadj), 
      data=app2[app2$extreme,], 
      size=3, angle=90) 

enter image description here

EDIT

вы можете просто вытащить даты, которые вы хотите на оси и передать в breaks аргумент scale_x_date().

extremedates = app2[app2$extreme,"Date"] 

ggplot(app2, aes(x=Date)) + 
    geom_point(aes(y=CPU)) + 
    geom_line(aes(y=CPU)) + 
    geom_smooth(aes(y=fit, ymin=lwr, ymax=upr), stat="identity") + 
    scale_x_date(breaks=extremedates) + 
    opts(axis.text.x = theme_text(angle=90, size=5)) 

enter image description here

+0

Это отличный пример и очень интересный! Как насчет того, хотим ли мы просто, чтобы метки оси X отображались только для тех точек данных вне области CI? – Ben

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