1

グラフの x 軸に適切な日付を追加しようとしてきましたが、適切な方法でそれを行う方法がわかりません。私が望むのは非常に単純です。データセットの最小値と最大値の間の毎年 1 月 1 日の日付です。

月は含めたくありません。'2008' か '2009' か何かで構いません。良い例は、次のグラフです。

グラフの例

ただし、隔年ではなく毎年の日付が必要です。

私はこれを理解できないようです。私の日付は 1970 年 1 月 1 日からの日数として定義されておりdateEPOCH_formatter、エポック形式を chron パッケージを使用した形式に変換するメソッドが含まれています。グラフの起点とその後 365 日ごとに目盛りと日付を作成する方法を見つけましたが、それはまったく同じではありません。

もう 1 つの小さな問題は、不可思議なことに、線chron(floor(y), out.format="mon year",origin.=epoch)が「2008 年 3 月」のような軸マーカーを含むグラフを出力することですが、線を変更してchron(floor(y), out.format="year",origin.=epoch)も「2008」のような結果が得られず、エラーが発生するだけです。

Error in parse.format(format[1]) : unrecognized format year
Calls: print ... as.character.times -> format -> format.dates -> parse.format
Execution halted

これが私のコードです - 助けてくれてありがとう。

library(ggplot2)
library(chron)
argv <- commandArgs(trailingOnly = TRUE)
mydata = read.csv(argv[1])
png(argv[2], height=300, width=470)


timeHMS_formatter <- function(x) {                  # Takes time in seconds from midnight, converts to HH:MM:SS
h <- floor(x/3600)
m <- floor(x %% 60)
s <- round(60*(x %% 1))                         # Round to nearest second
lab <- sprintf('%02d:%02d', h, m, s)        # Format the strings as HH:MM:SS
lab <- gsub('^00:', '', lab)                    # Remove leading 00: if present
lab <- gsub('^0', '', lab)                      # Remove leading 0 if present
}

dateEPOCH_formatter <- function (y){
epoch <- c(month=1,day=1,year=1970)
    chron(floor(y), out.format="mon year",origin.=epoch)
}

p=  ggplot() + 
coord_cartesian(xlim=c(min(mydata$day),max(mydata$day)), ylim=c(0,86400)) +         # displays data from first email through present
scale_color_hue() +
xlab("Date") +
ylab("Time of Day") +
scale_y_continuous(label=timeHMS_formatter, breaks=seq(0, 86400, 14400)) +              # adds tick marks every 4 hours
scale_x_continuous(label=dateEPOCH_formatter, breaks=seq(min(mydata$day), max(mydata$day), 365) ) +
ggtitle("Email Sending Times") +                                                        # adds graph title
theme( legend.position = "none", axis.title.x = element_text(vjust=-0.3)) +
theme_bw() +
layer(
    data=mydata, 
    mapping=aes(x=mydata$day, y=mydata$seconds), 
    stat="identity", 
    stat_params=list(), 
    geom="point", 
    geom_params=list(alpha=5/8, size=2, color="#A9203E"),
    position=position_identity(),
)   

print(p)
dev.off()
4

1 に答える 1

4

パッケージとscale_x_date一緒に、またはパッケージから組み込み関数を使用する方がはるかに簡単になると思います。これらは、などのほとんどのクラスで機能するはずです 。date_formatdate_breaksscalesdateRDatechron

例えば

library(ggplot2)
library(chron)
library(scales)

# some example data 
days <- seq(as.Date('01-01-2000', format = '%d-%m-%Y'),
            as.Date('01-01-2010', format = '%d-%m-%Y'), by = 1)

days_chron <- as.chron(days)
mydata <- data.frame(day = days_chron, y = rnorm(length(days)))

# the plot
ggplot(mydata, aes(x=days, y= y)) + geom_point() + 
 scale_x_date(breaks = date_breaks('year'), labels = date_format('%Y'))

ここに画像の説明を入力してください

これらの関数がどれほど直感的で簡単かを示すために、6か月ごとにモンス年のラベルが必要な場合は、非常に広いプロットまたは非常に小さい軸のラベルが必要であることに注意してください。

ggplot(mydata, aes(x=days, y= y)) + geom_point() +
   scale_x_date(breaks = date_breaks('6 months'), labels = date_format('%b-%Y'))

ここに画像の説明を入力してください

于 2012-11-08T22:20:03.233 に答える