首页 > 解决方案 > ggplot2 - 将列更改为日期类后绘制数据框子集时出错

问题描述

我有一个数据框df,并试图facet_grid用日期、用户、活动和剂量数据制作一些漂亮的图。

        Date.Issued       Date User         Activity       Dose
1  28/04/2021 13:19 28/04/2021    A Technologist PET  3.3098681
2  28/04/2021 08:59 28/04/2021    G Technologist PET  9.7787209
3  28/04/2021 08:58 28/04/2021    M Technologist PET  6.4040399
4  28/04/2021 08:58 28/04/2021    L Technologist PET  4.8086505
5  28/04/2021 08:58 28/04/2021    H Technologist PET  0.0000000
6  28/04/2021 08:44 28/04/2021    G  Technologist NM  4.6328144
7  28/04/2021 08:43 28/04/2021    K  Technologist NM 12.4208622
8  28/04/2021 08:43 28/04/2021    R  Technologist NM  2.8641932
9  28/04/2021 08:42 28/04/2021    A  Technologist NM  8.4690704
10 28/04/2021 08:31 28/04/2021    P Technologist PET  4.2168984
11 28/04/2021 08:23 28/04/2021    C Technologist PET 28.1236839
12 28/04/2021 08:23 28/04/2021    S Technologist PET 10.3116798
13 28/04/2021 08:11 28/04/2021    H Technologist PET 13.7067385
14 27/04/2021 09:17 27/04/2021    C Technologist PET  8.9209318
15 27/04/2021 09:12 27/04/2021    G  Technologist NM  3.8493500
16 27/04/2021 09:11 27/04/2021    K  Technologist NM  2.3508735
17 27/04/2021 09:11 27/04/2021    A  Technologist NM  1.8516742
18 27/04/2021 09:10 27/04/2021    R  Technologist NM  3.9221160
19 27/04/2021 09:07 27/04/2021    G Technologist PET 15.1844616
20 27/04/2021 08:51 27/04/2021    L Technologist PET 10.0322027
21 27/04/2021 08:16 27/04/2021    S Technologist PET  8.2122355
22 27/04/2021 08:16 27/04/2021    H Technologist PET  6.6248207
23 27/04/2021 08:16 27/04/2021    P Technologist PET  3.8532472
24 26/04/2021 13:00 26/04/2021    A Technologist PET  2.5060282
25 26/04/2021 09:30 26/04/2021    P Technologist PET  9.5917282
26 26/04/2021 09:17 26/04/2021    G Technologist PET 14.0576487
27 26/04/2021 08:53 26/04/2021    M Technologist PET  4.3697691
28 26/04/2021 08:52 26/04/2021    C Technologist PET  7.1182218
29 26/04/2021 08:27 26/04/2021    A  Technologist NM  2.1964765
30 26/04/2021 08:26 26/04/2021    R  Technologist NM  1.4743344
31 26/04/2021 08:25 26/04/2021    L  Technologist NM  3.4398077
32 26/04/2021 08:25 26/04/2021    K  Technologist NM  0.9920691
33 26/04/2021 08:24 26/04/2021    G  Technologist NM  1.4903276
34 26/04/2021 08:24 26/04/2021    C  Technologist NM  0.0000000
35 26/04/2021 08:20 26/04/2021    S Technologist PET  8.9420223
36 26/04/2021 08:01 26/04/2021    H Technologist PET  6.6264949

我的Date列在 R 中不是日期格式,所以我使用as.Date

    >Attach(df)
    >Date
    >[1] "28/04/2021" "28/04/2021" "28/04/2021" "28/04/2021" "28/04/2021" "28/04/2021" "28/04/2021" "28/04/2021" "28/04/2021" "28/04/2021" "28/04/2021" "28/04/2021" "28/04/2021" "27/04/2021" "27/04/2021" "27/04/2021" "27/04/2021"
    [18] "27/04/2021" "27/04/2021" "27/04/2021" "27/04/2021" "27/04/2021" "27/04/2021" "26/04/2021" "26/04/2021" "26/04/2021" "26/04/2021" "26/04/2021" "26/04/2021" "26/04/2021" "26/04/2021" "26/04/2021" "26/04/2021" "26/04/2021"
    [35] "26/04/2021" "26/04/2021"
    >class(Date)
    [1] "character"
    >DateX <- as.Date(Date, "%d/%m/%Y")
    >DateX
    [1] "2021-04-28" "2021-04-28" "2021-04-28" "2021-04-28" "2021-04-28" "2021-04-28" "2021-04-28" "2021-04-28" "2021-04-28" "2021-04-28" "2021-04-28" "2021-04-28" "2021-04-28" "2021-04-27" "2021-04-27" "2021-04-27" "2021-04-27"
    [18] "2021-04-27" "2021-04-27" "2021-04-27" "2021-04-27" "2021-04-27" "2021-04-27" "2021-04-26" "2021-04-26" "2021-04-26" "2021-04-26" "2021-04-26" "2021-04-26" "2021-04-26" "2021-04-26" "2021-04-26" "2021-04-26" "2021-04-26"
    [35] "2021-04-26" "2021-04-26"
    >class(DateX)
    [1] "Date"

现在,我使用新创建的 ggplot 代码DateX

>ggplot(df, aes(x=DateX, y=Dose, group = 1)) + geom_bar(stat="identity") + facet_grid(Activity~User)

给出了这个很棒的图表图像1

现在我想将我的数据子集化df并只绘制一些User数据

>ggplot(data = (subset(df,User %in% c("A" , "C", "G", "H"))), aes(x=DateX, y=Dose, group = 1)) + geom_bar(stat="identity") + facet_grid(Activity~User)

但是R给出了这个错误

Error: Aesthetics must be either length 1 or the same as the data (19): x
Run `rlang::last_error()` to see where the error occurred.

我哪里错了?子集扰乱了代码,但我无法弄清楚。抱歉,如果此布局不理想 - 仍然掌握此站点!谢谢 :)

标签: rggplot2

解决方案


问题是您正在使用两个数据源:DateXdf.

开始时,DateX长度为 36,并且df有 36 行。不幸的是,在您对数据进行子集化后,df现在有 19 行,而DateX长度仍为 36。

有几种方法可以解决这个问题,但如果可能的话,我建议将 using the external 更改DateX为 using Date,固定在框架中。

df$Date <- as.Date(df$Date, format='%d/%m/%Y')
ggplot(data = (subset(df,User %in% c("A" , "C", "G", "H"))), aes(x=Date, y=Dose, group = 1)) +
  geom_bar(stat="identity") +
  facet_grid(Activity~User)

在此处输入图像描述


数据

df <- structure(list(Date.Issued = c("28/04/2021 13:19", "28/04/2021 08:59", "28/04/2021 08:58", "28/04/2021 08:58", "28/04/2021 08:58", "28/04/2021 08:44", "28/04/2021 08:43", "28/04/2021 08:43", "28/04/2021 08:42", "28/04/2021 08:31", "28/04/2021 08:23", "28/04/2021 08:23", "28/04/2021 08:11", "27/04/2021 09:17", "27/04/2021 09:12", "27/04/2021 09:11", "27/04/2021 09:11", "27/04/2021 09:10", "27/04/2021 09:07", "27/04/2021 08:51", "27/04/2021 08:16", "27/04/2021 08:16", "27/04/2021 08:16", "26/04/2021 13:00", "26/04/2021 09:30", "26/04/2021 09:17", "26/04/2021 08:53", "26/04/2021 08:52", "26/04/2021 08:27", "26/04/2021 08:26", "26/04/2021 08:25", "26/04/2021 08:25", "26/04/2021 08:24", "26/04/2021 08:24", "26/04/2021 08:20", "26/04/2021 08:01"), Date = structure(c(18745, 18745, 18745, 18745, 18745, 18745, 18745, 18745, 18745, 18745, 18745, 18745, 18745, 18744, 18744, 18744, 18744, 18744, 18744, 18744, 18744, 18744, 18744, 18743, 18743, 18743, 18743, 18743, 18743, 18743, 18743, 18743, 18743, 18743, 18743, 18743), class = "Date"),     User = c("A", "G", "M", "L", "H", "G", "K", "R", "A", "P",     "C", "S", "H", "C", "G", "K", "A", "R", "G", "L", "S", "H",     "P", "A", "P", "G", "M", "C", "A", "R", "L", "K", "G", "C",     "S", "H"), Activity = c("Technologist PET", "Technologist PET",     "Technologist PET", "Technologist PET", "Technologist PET",     "Technologist NM", "Technologist NM", "Technologist NM",     "Technologist NM", "Technologist PET", "Technologist PET",     "Technologist PET", "Technologist PET", "Technologist PET",     "Technologist NM", "Technologist NM", "Technologist NM",     "Technologist NM", "Technologist PET", "Technologist PET",     "Technologist PET", "Technologist PET", "Technologist PET",     "Technologist PET", "Technologist PET", "Technologist PET",     "Technologist PET", "Technologist PET", "Technologist NM",     "Technologist NM", "Technologist NM", "Technologist NM",     "Technologist NM", "Technologist NM", "Technologist PET",     "Technologist PET"), Dose = c(3.3098681, 9.7787209, 6.4040399,     4.8086505, 0, 4.6328144, 12.4208622, 2.8641932, 8.4690704,     4.2168984, 28.1236839, 10.3116798, 13.7067385, 8.9209318,     3.84935, 2.3508735, 1.8516742, 3.922116, 15.1844616, 10.0322027,     8.2122355, 6.6248207, 3.8532472, 2.5060282, 9.5917282, 14.0576487,     4.3697691, 7.1182218, 2.1964765, 1.4743344, 3.4398077, 0.9920691,     1.4903276, 0, 8.9420223, 6.6264949)), row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36"), class = "data.frame")

推荐阅读