【问题标题】:ggplot2 differences in scale_x_date and scale_x_datetimeggplot2 scale_x_date 和 scale_x_datetime 的差异
【发布时间】:2016-09-20 16:43:22
【问题描述】:

我正在尝试从 ggplot 中的不同数据集生成 2 个图表。我希望图表具有相同的 x 轴中断和标签。 其中一张图有 scale_x_date 轴,另一张图有 scale_x_datetime 轴。

尽管为这些函数提供了相同的参数,但结果轴却不同。我不知道如何使它们相同。

“soil_N_summary.csv”和“weather_data.csv”这两个数据集可以在here下载。

我使用以下代码生成了如下图:

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)")

正如您所见,当降雨图从“07/07”开始时,铵图标签从“05/05”开始。降雨图上的 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     

【问题讨论】:

  • 什么是data1?此外,当我运行您的代码但将 data1 更改为 weather_data 时,我得到从 08/05 而不是 07/05 开始的轴中断。
  • @eipi10 是的,抱歉指定了错误的数据 - 我现在已将其更改为 weather_data。从 07/05 开始,我仍然会出现轴断裂

标签: r date datetime ggplot2 axis


【解决方案1】:

保持比例/数据类型相同。您的限制之一也有错字。我在第二个图上添加了 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

)

【讨论】:

  • FWIW:在“生产”中,我会使用 cowplot 包进行左侧对齐。
  • 我以前玩过cowplot,但会按照你的建议再看一遍。有趣的是,复制并粘贴了您的代码后,我的坐标轴现在从 30/4 开始 - 您知道为什么会这样吗?
  • 我仍然对为什么我的原始代码给了我不同的轴感兴趣。您找到的错字(谢谢)似乎没有任何区别。
  • 它没有。如果您将第一个保留为Date,请使用expand=c(0,0) 截断缓冲区并在两者最左侧的日期粘贴geom_vline(),它们将对齐。休息时间的计算方式不同,因为一个基于时间,另一个基于
【解决方案2】:

这个怎么样?

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)")

【讨论】:

  • 这种方法的问题是降雨数据具有每小时分辨率,因此将 POSIXct 转换为 Date 是不可取的。也无助于解决为什么轴不同的问题
【解决方案3】:

另一个选项是在第二个图中设置您想要的确切中断,以便它们与第一个匹配,而不是设置 date_breaks= "14 days" 并让 ggplot 决定从哪里开始(当然,您可以在两个图中都这样做)。例如:

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)")

【讨论】:

  • 使用此代码,我现在得到第一个中断为 04/05?
  • 啊,可能是时区问题。使用as.POSIXct 中的tz 参数确保数据中的所有POSIXct 变量和ggplot 代码都设置为相同的时区。
  • 或者,对于已经是 POSIXct 格式的变量,您可以按如下方式更改时区:attr(weather_data$datetime, "tzone") = "GMT" 会将时区设置为 GMT。 attr(weather_data$datetime, "tzone") = "America/Los_Angeles" 将其设置为美国太平洋时间等。您可以使用attr(x, "tzone") 检查任何 POSIXct 向量 x 的时区
猜你喜欢
  • 2020-01-15
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2012-05-21
  • 2022-10-01
  • 2022-01-14
相关资源
最近更新 更多