2016-07-22 10 views
1

私は、時間(Date)に渡って2つの変数(TbとTa)を持つデータセットを持っています。シャドウggplot2バックグラウンドファクターレベル

`    Date  Tb  Ta Light 
1 2015-02-15 01:13:00 36.103 22.751 nightime 
2 2015-02-15 01:55:00 36.103 22.626 nightime 
3 2015-02-15 02:37:00 35.605 22.626 nightime 
4 2015-02-15 03:19:00 35.605 22.751 nightime 
5 2015-02-15 04:01:00 36.103 23.001 nightime 
6 2015-02-15 04:43:00 35.605 22.876 nightime` 

「Light」のレベルで異なるシェーディングのプロットを作成しようとしています。だから、 'ライトタイム'の「ナイトタイム」のポイントはすべて灰色で表示され、「昼間」は白で表示されます。このような何か:

は因子レベルで動作するようにgeom_rect()を取得する方法はありますか?私はUsing ggplot2 in R, how do I make the background of a graph different colours in different regions?

ggplot() + geom_rect(data=tbdf, (aes(xmin=Date, 
xmax=Date, ymin=min(Tb), ymax=max(Tb), fill=Light))) + 
    geom_line(data = tbdf, aes(x = Date, y = Tb)) + 
    geom_line(data = tbdf, aes(x = Date, y = Ta), colour='grey') + 
    xlab('Date') + 
    ylab('Temperature (°C)') 

に基づいて、次を試してみましたが、それはライトの凡例が、それでも通常のグレーの陰影で終わる

...灰色の背景に影「夜間の」としてコード化されたすべてのポイントを必要とします:

任意の提案ですか?

+0

私は、 'aes(NULL、NULL)'は、あなたがフォローしている例ではなく、奇妙に思えます。私はそれを取り除くだろう。 – Gregor

+0

私はそれを試してみましたが、xmaxとminに対して-0.5と+0.5を取り除くと、それはすべて1色(nightimeのもの)になります。私はそれを削除するために投稿を編集しました。 –

+0

あなたのデータを 'dput()'、 'dput(head(tbdf、20))'と共有し、POSIX datetimeで読むためのコピー/貼り付けが本当の苦痛であれば助けになります。また、すべての夜間ではないように十分なデータを表示するようにしてください。本当の解決策は、データの各行に対して1つの矩形ではなく、1日あたり2つの矩形をプロットするために、夜から1日への遷移ポイントを持つ集計データフレームを作成することです。 – Gregor

答えて

1

日付の書式に問題だったようです。それを2015-02-15 01:13:00の形式から数値(例:42050.05)に変更すると効果的でした。ここで私は私にきれいにクリーンアップし、この enter image description here

を与えた

ggplot() + geom_rect(data=tbdf, (aes(xmin=Date-0.5, xmax=Date+0.5, 
ymin=min(Ta)-0.5, ymax=max(Tb)+0.5, fill=factor(Light)))) + 
scale_fill_manual(values=c("grey", "white"), guide=FALSE) + 
geom_line(data = tbdf, aes(x = Date, y = Tb), size=0.8) + 
geom_line(data = tbdf, aes(x = Date, y = Ta), colour='grey50', size=0.8) + 
ylab('Temperature (°C)') 

を使用したコードです。

1

サンプルデータが不足しているため、いくつか作成しました。

library(ggplot2) 
library(dplyr) 
daytime <- rep(rep(c("day", "night"), each = 12),10) 
df <- data.frame(date = 1:length(daytime), daytime, value = rnorm(length(daytime))) 

> head(df) 
       date daytime value 
1     1  day -0.7016900 
2     2  day -0.5886091 
3     3  day -0.1962264 
4     4  day 1.3621115 
5     5  day -1.5810459 
6     6  day -0.6598885 

次に、毎日と毎晩の開始日と終了日を決めました。サンプルデータの場合、これは必要ではありませんが、実際のデータは単純ではないと思います。両方の組み合わせ

period <- case_when(daytime != lead(daytime) & daytime == "day" ~ "endDay", 
       daytime != lead(daytime) & daytime == "night" ~ "endNight", 
       daytime != lag(daytime) & daytime == "day" ~ "beginDay", 
       daytime != lag(daytime) & daytime == "night" ~ "beginNight") 
period[1]    <- "beginDay" 
period[length(period)] <- "endNight" 

rect <- cbind(df,period) 
names(rect)[1] <- "date" 

と2つのデータフレーム、夜用と各期間の対応するx値を有する昼間用のものを作ります。

rect_night <- na.omit(rect[rect$daytime == "night", ])[ ,-2:-3] 
rect_night <- data.frame(start = rect_night[rect_night$period == "beginNight", 1], 
         end = rect_night[rect_night$period == "endNight", 1]) 

rect_day <- na.omit(rect[rect$daytime == "day", ]) 
rect_day <- data.frame(start = rect_day[rect_day$period == "beginDay", 1], 
         end = rect_day[rect_day$period == "endDay", 1]) 

プロットにalltogetherを入れる。

ggplot(alpha = 0.3) + 
    geom_rect(data = rect_night,aes(xmin = start, xmax = end, ymin = -5, ymax = 5), fill = "grey") + 
    geom_rect(data = rect_day,aes(xmin = start, xmax = end, ymin = -5, ymax = 5), fill = "yellow") + 
    geom_line(data = df, aes(x = date, y = value)) 

enter image description here