ggplot2
でmonth
を年に使用する場合、時系列プロットのx軸にday
とfacet
の両方を含める必要があります。私の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)
次のコマンドで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
あなたはとても近いです。 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()
軸は、適切なラベル関数を使用してより日付のような形式にすることができますが、ブレークはまだ日付を意識した方法では見つかりません。 (それに加えて、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()
ニースの日付の区切りの良さを得るには、別の変数を使用できます。元のデータと同じ年の日付を持ちますが、ちょうど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()
データを作成するためにコード@ 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を使用しました。データを分割すると、毎年同じ日月の組み合わせを取得できません。
これはそれをするようです...私は手動でラベルを作成しました...
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))
元の日と月を保持する@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()