web-dev-qa-db-ja.com

時系列の月と日の日付は、年のファセットを含むggplot2にプロットされます

ggplot2monthを年に使用する場合、時系列プロットのx軸にdayfacetの両方を含める必要があります。私のMWEは以下のとおりです。

set.seed(12345)
Date <- seq(as.Date("2010/1/1"), as.Date("2014/1/1"), "week")
Y <- rnorm(n=length(Date), mean=100, sd=1)
df <- data.frame(Date, Y)

df$Year <- format(df$Date, "%Y")
df$Month <- format(df$Date, "%b")
df$Day <- format(df$Date, "%d")

df$MonthDay <- format(df$Date, "%d-%b")


p <- ggplot(data=df, mapping=aes(x=MonthDay, y=Y, shape=Year, color=Year)) + geom_point() +geom_line(aes(group = 1))
p <- p + facet_grid(facets = Year ~ ., margins = FALSE) + theme_bw()
print(p)

enter image description here

次のコマンドでx軸ラベルを制御しようとしました

p + scale_y_continuous() + scale_x_date(labels = date_format("%d-%b"))

ただし、次のエラーメッセージがスローされます。

Error: Invalid input: date_trans works with objects of class Date only
14
MYaseen208

あなたはとても近いです。 x軸を年のどこにあるかを測定したいのですが、それを文字ベクトルとして持っているので、すべての1つのポイントにラベルが付けられます。代わりに連続変数でこれを表すと、より良い結果が得られる可能性があります。 1つの連続変数はその年の日になります。

df$DayOfYear <- as.numeric(format(df$Date, "%j"))
ggplot(data = df,
       mapping = aes(x = DayOfYear, y = Y, shape = Year, colour = Year)) +
  geom_point() +
  geom_line() +
  facet_grid(facets = Year ~ .) +
  theme_bw()

enter image description here

軸は、適切なラベル関数を使用してより日付のような形式にすることができますが、ブレークはまだ日付を意識した方法では見つかりません。 (それに加えて、NAの問題もあります。)

ggplot(data = df,
       mapping = aes(x = DayOfYear, y = Y, shape = Year, colour = Year)) +
  geom_point() +
  geom_line() +
  facet_grid(facets = Year ~ .) +
  scale_x_continuous(labels = function(x) format(as.Date(as.character(x), "%j"), "%d-%b")) +
  theme_bw()

enter image description here

ニースの日付の区切りの良さを得るには、別の変数を使用できます。元のデータと同じ年の日付を持ちますが、ちょうど1年です。この場合、うるう年だったので2000年。これに関する問題は主にうるう日と関係がありますが、気にしない場合(非うるう年の3月1日はうるう年の2月29日と一致します)などを使用できます。

df$CommonDate <- as.Date(paste0("2000-",format(df$Date, "%j")), "%Y-%j")
ggplot(data = df,
       mapping = aes(x = CommonDate, y = Y, shape = Year, colour = Year)) +
  geom_point() +
  geom_line() +
  facet_grid(facets = Year ~ .) +
  scale_x_date(labels = function(x) format(x, "%d-%b")) +
  theme_bw()

enter image description here

20
Brian Diggs

データを作成するためにコード@ MYaseen208を使用します。

プロットするときはx = Dateおよび以下を使用します

p <- ggplot(data = df, aes(x = Date, y = Y, shape = Year, color = Year)) +
  geom_point() + geom_line(aes(group = 1))
  #adding facet and using facet_wrap with free x scales
  p <- p + facet_wrap(~Year,ncol=1, scales = "free_x") + theme_bw()+
scale_y_continuous() + 
scale_x_date(labels = date_format("%d-%b"), breaks = date_breaks("2 weeks")) +
 theme(axis.text.x = element_text(angle = 90, vjust = 0.5, size = 8))

無料のx_axisスケールを取得するために、facet_wrapを使用しました。データを分割すると、毎年同じ日月の組み合わせを取得できません。

enter image description here

6
infominer

これはそれをするようです...私は手動でラベルを作成しました...

library("ggplot2")
library("scales")
set.seed(12345)
Date <- seq(as.Date("2010/1/1"), as.Date("2014/1/1"), "week")
Y <- rnorm(n=length(Date), mean=100, sd=1)
df <- data.frame(Date, Y)

df$Year <- format(df$Date, "%Y")
df$Month <- format(df$Date, "%b")
df$Day <- format(df$Date, "%d")

df$MonthDay <- format(df$Date, "%d-%b")
df$MonthDay2 <- df$MonthDay
# only show every third label... otherwise it's too crowded
df$MonthDay2[as.numeric(row.names(df))%%3!=0] <- ""
labels <- df$MonthDay2

p <- ggplot(data=df, mapping=aes(x=MonthDay, y=Y, shape=Year, color=Year)) + geom_point() +geom_line(aes(group = 1))
p <- p + facet_grid(facets = Year ~ ., margins = FALSE) + theme_bw()
p + scale_y_continuous() + scale_x_discrete(labels=labels) + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, size = 8))

plot

3
cory

元の日と月を保持する@Brian Diggsのアプローチに対する変更(3月1日は2月29日ではなく3月1日として保持されます)は、日付を文字列に変換してから年を置き換えることです。

library(lubridate)
library(stringr)
df$CommonDate <- ymd(paste0("2000-",str_sub(as.character(df$Date),-5)))

次に進むことができます:

ggplot(data = df,
   mapping = aes(x = CommonDate, y = Y, shape = Year, colour = Year)) +
  geom_point() +
  geom_line() +
  facet_grid(facets = Year ~ .) +
  scale_x_date(labels = function(x) format(x, "%d-%b")) +
  theme_bw()
2
Brian Fisher