Я бы хотел изобразить случаи чего-то на четверть на гистограмме. Я использую тип zoo::yearqtr
для классификации кварталов, но кадр данных - это не зоопарк. Я предполагал, что ggplot2::scale_x_yearqtr()
даст мне симпатичный сюжет, но я получил мутацию. В верхнем примере я использую as.factor
, чтобы получить желаемый вид, но, поскольку время непрерывно, это кажется плохой практикой, плюс хлопоты вручную вычислять разумные разрывы.
library(ggplot2)
#> Warning: package 'ggplot2' was built under R version 3.6.3
library(zoo)
#>
#> Attaching package: 'zoo'
#> The following objects are masked from 'package:base':
#>
#> as.Date, as.Date.numeric
date <- c(2016.00,2016.50, 2016.50, 2016.75, 2017.75, 2019.00, 2016.00, 2016.25,
2016.50, 2016.75, 2017.00, 2017.25, 2017.50, 2017.75, 2018.00, 2018.25,
2018.50, 2018.75, 2019.00, 2019.25, 2019.50, 2019.75)
count <- c(3, 3, 4, 6, 3, 3, 3, 10, 2, 6, 4,
7, 4, 4, 3, 5, 2, 5, 6, 4, 6, 3)
fill <- c("polka","waltz","polka","polka","waltz","samba","other","other","other",
"other","other","other","other","other","other","other","other","other",
"other","other","other","other")
# dates are duplicated (but with different events) and not ordered
df0 <- data.frame(date,count,fill)
ggplot(df0,aes(factor(as.numeric(date)),count,fill=fill)) + geom_col() +
scale_x_discrete(breaks=sort(unique(round(as.numeric(df0$date)))))
Прекрасно. Теперь давайте сделаем столбец даты типом yearqtr
и используем scale_x_yearqtr
, чтобы получить хорошую ось X.
df1 <- df0
df1$date <- zoo::as.yearqtr(df1$date)
ggplot(df1,aes(date,count,fill=fill)) + geom_col() +
scale_x_yearqtr()
Вау ! Это один уродливый мутант! Проблема не в yearqtr
, а в root. Я получаю тот же результат, если мы не преобразуем numeric
даты в yearqtr
. Проблема в том, что я scale_x_yearqtr
понял бы, что делать. Есть ли правильный способ получить нужную ось х, не прибегая к as.factor()
?
РЕДАКТИРОВАТЬ: показать результат ответа Маркуса в моей системе
> df0
date count fill
1 2016.00 3 polka
2 2016.50 3 waltz
3 2016.50 4 polka
4 2016.75 6 polka
5 2017.75 3 waltz
6 2019.00 3 samba
7 2016.00 3 other
8 2016.25 10 other
9 2016.50 2 other
10 2016.75 6 other
11 2017.00 4 other
12 2017.25 7 other
13 2017.50 4 other
14 2017.75 4 other
15 2018.00 3 other
16 2018.25 5 other
17 2018.50 2 other
18 2018.75 5 other
19 2019.00 6 other
20 2019.25 4 other
21 2019.50 6 other
22 2019.75 3 other
> ggplot(df0,aes(date,count,fill=fill)) + geom_col() +
scale_x_yearqtr()
> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18362)
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] zoo_1.8-7 ggplot2_3.3.0
loaded via a namespace (and not attached):
[1] Rcpp_1.0.4.6 compiler_3.6.1 pillar_1.4.3 later_1.0.0 tools_3.6.1 digest_0.6.25
[7] packrat_0.5.0 lattice_0.20-38 memoise_1.1.0 lifecycle_0.2.0 tibble_3.0.0 gtable_0.3.0
[13] pkgconfig_2.0.3 rlang_0.4.5 shiny_1.4.0.2 cli_2.0.2 rstudioapi_0.11 fastmap_1.0.1
[19] withr_2.1.2 dplyr_0.8.5 stringr_1.4.0 vctrs_0.2.4 grid_3.6.1 tidyselect_1.0.0
[25] glue_1.4.0 R6_2.4.1 fansi_0.4.1 farver_2.0.3 purrr_0.3.3 magrittr_1.5
[31] scales_1.1.0 promises_1.1.0 ellipsis_0.3.0 htmltools_0.4.0 ggthemes_4.2.0 assertthat_0.2.1
[37] mime_0.9 xtable_1.8-4 colorspace_1.4-1 httpuv_1.5.2 labeling_0.3 stringi_1.4.6
[43] munsell_0.5.0 crayon_1.3.4