2017-05-18 31 views
1

日付の列を持つデータフレームの散布図を作成したいと思います。 x軸は月ごとに分割するか、過去2年間に2か月ごとに分割する必要があります。散布図(R)で日付x軸を定義する

データフレーム:

code_1000 <- 
    as.data.frame(cbind(
    c("3", "3", "7", "7", "7", "7", "2", "2", "4", "4"), 
    c("344", "344", "73", "73", "71", "72", "21", "27", "42", "43"), 
    c("9-02-2017", "10-01-2016","9-02-2014", "25-03-2015", "9-02-2017", 
     "10-06-2017", "8-04-2017", "25-08-2016", "07-08-2017", "15-09-2016" 
    ) 
)) 
names(code_1000) <- c("number", "code", "date") 

プロットコード:私は、x軸上のY軸上のcodedateをプロットする

qplot(data=code_1000, 
     x=format(as.Date(date),"%b/%Y"), 
     y=code, 
     geom=c("point"), 
     na.rm=TRUE, 
     xlab="Emission date", ylab="Code", 
     size=1, col=2)+theme_bw()+theme(legend.position="none") 

。 x軸を月ごとに強制的に分割するにはどうすればよいですか?また、プロットコードを実行すると、x軸のフォーマットはmm/ddddのように見えますが、mm/yyyyが必要です。なぜ私はそのフォーマットを取得していますか?

私はShinyアプリケーションでcode_1000のように約50のデータフレームを持っています。簡単にするために、私はすべてのコードを共有しているわけではありません。

ありがとうございます!

答えて

1

デフォルトの日付パーサはあなたのDD-MM-YYY表記法とちょうど混同されていると思います。 あなたがlubridateと日付を解析した場合、x軸は、より合理的に見えます(あなたが欲しいメジャー/マイナー目盛りで可能性はないが。)

私はqplotの内部日付のあなたの再フォーマットを削除し、スケーリング機能を追加しました。

library(lubridate) 
library(scales) 

# implicit in poster's question 
library(ggplot2) 

code_1000$date <- lubridate::dmy(as.character(code_1000$date)) 

qplot(
    data = code_1000, 
    x = date, 
    y = code, 
    geom = c("point"), 
    na.rm = TRUE, 
    xlab = "Emission date", 
    ylab = "Code", 
    size = 1, 
    col = 2 
) + theme_bw() + theme(legend.position = "none") + scale_x_date(
    date_breaks = "1 year", 
    date_minor_breaks = "1 month", 
    labels = date_format("%m-%Y") 
) 

enter image description here

0

lubridateでの私の試みが動作するように失敗を除いて私のソリューションは、上記@MarkMillerするのは非常に類似してしまいました。代わりにstrptimeを使って日付を変換しました。

code_1000$date <- strptime(code_1000$date, format = "%d-%M-%Y") 

も私の代わりにqplotの、より柔軟かつ簡潔であることをggplot機能を見つけます。あなたが特定の時間制限を設定し、シャイニーのプロット間で一致するように制限を設定したい場合は

library(tidyverse) 
library(scales) # needed for date_format() 
ggplot(code_1000, aes(date, code)) + 
    geom_point(size=2, col="steelblue") + 
    theme_bw() + 
    labs(x="Emission Date", y="Code") + 
    scale_x_datetime(labels = date_format("%m/%Y")) 

::(?)特に光沢のあるアプリの中では、qplotは変数の結果を与えるかもしれない

limits <- strptime(c("01-01-2014", "01-01-2018"), format = "%d-%m-%Y") 
ggplot(code_1000, aes(date, code)) + 
    geom_point(size=2, col="steelblue") + theme_bw() + 
    labs(x="Emission Date", y="Code") + 
    scale_x_datetime(labels = date_format("%m-%Y"), #minor_breaks = "1 month" 
        date_breaks = "1 year", limits = as.POSIXct(limits)) 
+0

ありがとうございました。マット! code_1000 $ date < - strptime(code_1000 $ date、format = "%d-%M-%Y") を実行すると、日付列はになりました。それが起こっている理由を知っていますか?再度、感謝します。 –

+0

私は再現できません。このページからコピーされたすべてを使用して、その時点まで基本パッケージのみで私はうまく動作します。 Rを再起動してパッケージを読み込まないでください。おそらくパッケージ関数と競合しますか?プロットに必要なパッケージを含めるように答えを修正しました。 –

0

ありがとうございましたあなたの回答者のために非常に!

このデータフォーマットをShinyのデータフレームに適用するのは難しいです。

1つのデータフレームcode_1000の代わりに、code_1000からcode_1050という51の異なるデータフレームがあります。私はそれらのデータフレーム内のすべてのdateの列に、この日付フォーマット

code_1000$date <- lubridate::dmy(as.character(code_1000$date)) 

を適用したいと思います。私はforを使ってそれをしようとしていましたが、それは混乱していて何の仕事もありませんでした。input$code.numbersは(1000年から1050年まで)データフレームという名前の数字が含まれているデータフレームである

for (m in 1:nrow(input)){ 

    assign(paste0("code_",input$code.numbers[m])$date, lubridate::dmy(as.character(eval(parse(text=paste0("code_",input$code.numbers[m])))$date))) 

    } 

。私はR lapply()で簡単にアプローチしている時間のほとんどを読んでいるように私は、この使用forlapply()機能を行う方法を学びたい

Error in paste0("code_",input$code.numbers[m])$date : 
    $ operator is invalid for atomic vectors 

:私は、次のエラーを得ました。

+0

これは、元のものと大きく異なるので、これを別の質問として投稿したいかもしれません...私はこの型の問題のためにpurr :: map関数を使うことを学んでいます。もしそれらが変数を除いてまったく同じものであれば、それを扱うのが簡単な縦フォーマットのデータフレームにマージするかもしれません。答えに必要な情報 –

関連する問題