2016-09-20 21 views
1

ggplotの異なるデータセットから2つのグラフを作成しようとしています。私は、グラフに同じx軸の区切りとラベルを付けることを望みます。 グラフの1つはscale_x_date軸を持ち、もう1つはscale_x_datetime軸を持っています。ggplot2 scale_x_dateとscale_x_datetimeの相違点

これらの関数に同じ引数を指定しても、結果の軸は異なります。私はそれらを同じにする方法を理解できません。

「soil_N_summary.csv」と「weather_data.csv」という2つのデータセットは、hereからダウンロードできます。あなたはアンモニウムプロットのラベルは「05/05」で始める見ることができるようにする場合

library(ggplot2) 
library(dplyr) 
### import data 
soil_N_summary <- read.csv("soil_N_summary.csv", stringsAsFactors = FALSE) 
weather_data <- read.csv("weather_data.csv", stringsAsFactors = FALSE) 

### change to POSIXct and Date class 
soil_N_summary <- soil_N_summary %>% mutate(Treatment = as.factor(Treatment), 
             Date = as.Date(Date)) 
weather_data <- weather_data %>% mutate(datetime = as.POSIXct(datetime, format = "%Y-%m-%d %H:%M:%S")) 

### ammonium plot 
ggplot(soil_N_summary, aes(Date, NH4_N_mean, fill = Treatment, colour = Treatment))+ 
    geom_line() +geom_point() + 
    geom_errorbar(aes(ymin = NH4_N_mean-NH4_N_SEM, ymax = NH4_N_mean+NH4_N_SEM))+ 
    ggtitle("Soil ammonium") + ylab("Soil NH4-N mg/kg") + xlab("Date") + 
    scale_x_date(date_breaks= "14 days", date_minor_breaks = "7 days", date_labels = "%d/%m", 
       limits = as.Date(c("2016-05-1", "2016-09-16"))) + 
    theme(legend.position = c(0.9,0.9)) 

### rainfall plot 
ggplot(weather_data %>% filter(datetime > "2016-05-01 00:00:00"), aes(datetime, Rainfall_mm)) + 
    geom_step(direction = "vh") + 
    scale_x_datetime(date_breaks= "14 days", date_minor_breaks = "7 days", 
        date_labels = "%d/%m", limits = as.POSIXct(c("2016-05-01 00:00:00", "2016-09-16 00:00:00"))) + 
    xlab("Date") + ylab("Hourly rainfall (mm)") 

Ammonium plot

Rainfall plot

私は、以下に示すグラフを作成するには、次のコードを使用しています降雨プロットは "07/07"から始まります。降雨プロット上のx軸も早い時期に開始するように見える。

これらの軸を同一にする手助けがありますか?

ありがとうございます!

> sessionInfo(package = "ggplot2") 
R version 3.3.1 (2016-06-21) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows 7 x64 (build 7601) Service Pack 1 

locale: 
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252 
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C       
[5] LC_TIME=English_United Kingdom.1252  

attached base packages: 
character(0) 

other attached packages: 
[1] ggplot2_2.1.0 

loaded via a namespace (and not attached): 
[1] Rcpp_0.12.5   XLConnectJars_0.2-12 grDevices_3.3.1  
[4] tidyr_0.5.1   digest_0.6.9   dplyr_0.5.0   
[7] assertthat_0.1  grid_3.3.1   plyr_1.8.4   
[10] R6_2.1.2    gtable_0.2.0   DBI_0.4-1   
[13] XLConnect_0.2-12  magrittr_1.5   datasets_3.3.1  
[16] scales_0.4.0   utils_3.3.1   lazyeval_0.2.0  
[19] graphics_3.3.1  labeling_0.3   base_3.3.1   
[22] tools_3.3.1   munsell_0.4.3  colorspace_1.2-6  
[25] stats_3.3.1   rJava_0.9-8   methods_3.3.1  
[28] gridExtra_2.2.1  tibble_1.0  
+0

「データ1」とは何ですか?また、あなたのコードを実行して 'data1'を' weather_data'に変更すると、私は07/05ではなく08/05から始まる軸ブレークを取得します。 – eipi10

+0

@ eipi10はい申し訳ありませんが間違ったデータが指定されました - これを 'weather_data'に変更しました。私はまだ07/05から始まる軸ブレークを取得します –

答えて

2

同じスケール/データ型を保管してください。あなたはまた、あなたの限界の1つでタイプミスがありました。 2番目のプロットにy軸用の手動ラベルを追加して、すべてが並んでいることを示します)。

library(ggplot2) 
library(dplyr) 
library(readr) 
library(gridExtra) 

soil_N_summary <- read_csv("so/soil_N_summary.csv") 
weather_data <- read_csv("so/weather_data.csv") 

soil_N_summary <- mutate(soil_N_summary, Date=as.POSIXct(Date)) 

grid.arrange(

    ggplot(soil_N_summary, aes(Date, NH4_N_mean, fill = Treatment, colour = Treatment))+ 
    geom_line() +geom_point() + 
    geom_errorbar(aes(ymin = NH4_N_mean-NH4_N_SEM, ymax = NH4_N_mean+NH4_N_SEM))+ 
    ggtitle("Soil ammonium") + ylab("Soil NH4-N mg/kg") + xlab("Date") + 
    scale_x_datetime(expand=c(0,0), 
        date_breaks= "14 days", 
        date_minor_breaks = "7 days", 
        date_labels = "%d/%m", 
        limits = as.POSIXct(c("2016-05-01 00:00:00", "2016-09-16 00:00:00"))) + 
    theme(legend.position = c(0.9,0.9)) 
    , 
    ### rainfall plot 
    ggplot(weather_data %>% filter(datetime > "2016-05-01 00:00:00"), aes(datetime, Rainfall_mm)) + 
    geom_step(direction = "vh") + 
    scale_x_datetime(expand=c(0,0), 
        date_breaks= "14 days", 
        date_minor_breaks = "7 days", 
        date_labels = "%d/%m", 
        limits = as.POSIXct(c("2016-05-01 00:00:00", "2016-09-16 00:00:00"))) + 
    scale_y_continuous(label=c("000", "002", "004", "006", "008")) + 
    xlab("Date") + ylab("Hourly rainfall (mm)") 

    , 

    ncol=1 

) 

enter image description here

+0

FWIW:「生産」では、左側の位置合わせを行うために 'cowplot'パッケージを使用します。 – hrbrmstr

+0

私は前に 'cowplot'で遊んでいましたが、あなたが示唆したように、それをもう一度見ていきます。興味深いことに、あなたのコードをコピーして貼り付けた後、私の軸は今30/4に始まります - なぜそうであるのか分かりますか? –

+0

私の元のコードが私に異なる軸を与えた理由はまだ興味があります。あなたが見つけたタイプミス(感謝)は何の差もないようです。 –

0

これはいかがですか?

weather_data$date <- as.Date(as.character(weather_data$datetime)) 
### rainfall plot 
ggplot(weather_data %>% filter(date > "2016-05-01"), aes(date, Rainfall_mm)) + 
    geom_step(direction = "vh") + 
    scale_x_date(date_breaks= "14 days", date_minor_breaks = "7 days", 
        date_labels = "%d/%m", limits = as.Date(c("2016-05-1", "2016-09-16"))) + 
    xlab("Date") + ylab("Hourly rainfall (mm)") 

enter image description here

+0

このアプローチの問題点は、降雨データには1時間単位の分解能があるため、POSIXctから日付に変換することは望ましくありません。また、軸が異なる理由を解決するのに役立たない –

0

別のオプションは、(あなたはできる、の開始する場所を決めggplotむしろdate_breaks= "14 days"を設定し、させるよりも、彼らが最初に一致するように、あなたは2番目のプロットにしたい正確なブレークを設定することですもちろん、両方のプロットでこれを行います)。例:

date_range=as.Date(c("2016-05-01", "2016-09-16")) 

ggplot(weather_data %>% filter(datetime > "2016-05-01 00:00:00"), aes(datetime, Rainfall_mm)) + 
    geom_step(direction = "vh") + 
    scale_x_datetime(breaks=seq(as.POSIXct("2016-05-05"), as.POSIXct(date_range[2]), 
           by="14 days"), 
        minor_breaks=seq(as.POSIXct("2016-05-05"), as.POSIXct(date_range[2]), 
            by="7 days"), 
        date_labels = "%d/%m", limits = as.POSIXct(date_range)) + 
    xlab("Date") + ylab("Hourly rainfall (mm)") 
+0

このコードを使用して、私は今04/05として最初の休憩を取得しますか? –

+0

ああ、おそらくタイムゾーンの問題です。 'as.POSIXct'の' tz'引数を使用して、データ内のPOSIXct変数とggplotコードがすべて同じタイムゾーンに設定されていることを確認してください。 – eipi10

+0

また、すでにPOSIXct形式の変数の場合、次のようにタイムゾーンを変更することができます: 'attr(weather_data $ datetime、" tzone ")=" GMT "'はタイムゾーンをGMTに設定します。 'attr(weather_data $ datetime、" tzone ")=" America/Los_Angeles "'はアメリカ太平洋時間などに設定します。 'attr(x、" tzone ")でPOSIXctベクトル' x'のタイムゾーンを確認できます。 ' – eipi10

関連する問題