Bagaimana cara menggunakan GGPLOT untuk membuat grafik garis bertumpuk dengan sumbu x yang sama dari beberapa kolom df?

Saya memiliki data.frame dengan beberapa kolom yang mencatat nilai selama berbulan-bulan dalam setahun.

 zdate mwe1.x mwe2.x mwe3.x mwe4.x mwe5.x mwe6.x mwe7.x mwe1.y mwe2.y
1  Jan 2017     10      0      1      0      0      4      0     41      5
2  Feb 2017      7      0      0      0      0      0      0     76     33
3  Mar 2017     16      0      0      0      0      6      0    261     59
4  Apr 2017     40      4      0      0      1      0      0    546     80
5  May 2017      8      0      0      0      1      4      0    154     18
6  Jun 2017      7      0      0      0      2      1      0     74      4
7  Jul 2017     20      0      0      0      0      1      0    116      8
8  Aug 2017     25      6      1      0      3      6      1    243     54
9  Sep 2017      8      2      2      0      3      5      0    257     46
10 Oct 2017      2      0      0      0      0      0      0     74      7
11 Nov 2017     13      0      0      0      1      0      0    144      9
12 Dec 2017      6      0      3      0      2      1      0    164     20
   mwe3.y mwe4.y mwe5.y mwe6.y mwe7.y
1      17      4     11      4     28
2      61      0     22      7     72
3      91      1     69     16    309
4      71      0     94     19    206
5      29      0     44      3     58
6      21      0     15      2     66
7      12      0     23      2     20
8      20      0     36      2     55
9      42      0     55      7     89
10     13      0     24      0      7
11     39      0     18      1     11
12     54      0     88      5     51 

Saya ingin membuat diagram garis terpisah untuk kolom-kolom ini, tetapi dengan sumbu x yang sama, dan ditumpuk di atas satu sama lain. Saya mencoba menggunakan 'ggplot2' dan 'facet_wrap' untuk melakukan ini, tetapi sepertinya saya tidak tahu cara melakukannya. Saya bisa mendapatkan plot baris tunggal:

plot <- ggplot(all, aes(x = all$date, y = all$mwe1.x)) +
+     geom_line()

Tapi saya ingin ini ditumpuk dengan plot garis untuk 'mwe1.y' tepat di bawahnya. Adakah yang bisa membantu saya?


person Nick Olczak    schedule 02.10.2020    source sumber


Jawaban (1)


Mungkin Anda sedang mencari ini. Kuncinya adalah membentuk ulang data Anda agar dapat menggunakan potensi ggplot2 secara maksimal. Berikut kode menggunakan fungsi tidyverse:

library(tidyverse)
#Code
df %>% mutate(zdate=factor(zdate,levels = unique(zdate),ordered = T)) %>%
  pivot_longer(-zdate) %>%
  ggplot(aes(x=zdate,y=value,group=name,color=name))+
  geom_line()

Keluaran:

masukkan deskripsi gambar di sini

Beberapa data yang digunakan:

#Data
df <- structure(list(zdate = c("Jan-2017", "Feb-2017", "Mar-2017", 
"Apr-2017", "May-2017", "Jun-2017", "Jul-2017", "Aug-2017", "Sep-2017", 
"Oct-2017", "Nov-2017", "Dec-2017"), mwe1.x = c(10L, 7L, 16L, 
40L, 8L, 7L, 20L, 25L, 8L, 2L, 13L, 6L), mwe2.x = c(0L, 0L, 0L, 
4L, 0L, 0L, 0L, 6L, 2L, 0L, 0L, 0L), mwe3.x = c(1L, 0L, 0L, 0L, 
0L, 0L, 0L, 1L, 2L, 0L, 0L, 3L), mwe4.x = c(0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L), mwe5.x = c(0L, 0L, 0L, 1L, 1L, 2L, 
0L, 3L, 3L, 0L, 1L, 2L), mwe6.x = c(4L, 0L, 6L, 0L, 4L, 1L, 1L, 
6L, 5L, 0L, 0L, 1L), mwe7.x = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L), mwe1.y = c(41L, 76L, 261L, 546L, 154L, 74L, 
116L, 243L, 257L, 74L, 144L, 164L), mwe2.y = c(5L, 33L, 59L, 
80L, 18L, 4L, 8L, 54L, 46L, 7L, 9L, 20L), mwe3.y = c(17L, 61L, 
91L, 71L, 29L, 21L, 12L, 20L, 42L, 13L, 39L, 54L), mwe4.y = c(4L, 
0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), mwe5.y = c(11L, 
22L, 69L, 94L, 44L, 15L, 23L, 36L, 55L, 24L, 18L, 88L), mwe6.y = c(4L, 
7L, 16L, 19L, 3L, 2L, 2L, 2L, 7L, 0L, 1L, 5L), mwe7.y = c(28L, 
72L, 309L, 206L, 58L, 66L, 20L, 55L, 89L, 7L, 11L, 51L)), class = "data.frame", row.names = c(NA, 
-12L))

Atau mungkin ini:

#Code 2
df %>% mutate(zdate=factor(zdate,levels = unique(zdate),ordered = T)) %>%
  pivot_longer(-zdate) %>%
  mutate(name=factor(name,levels = unique(name),ordered = T)) %>%
  ggplot(aes(x=zdate,y=value,group=name,color=name))+
  geom_line()+
  facet_wrap(.~name,ncol = 7,scales = 'free_y')+
  theme(legend.position = 'none',
        axis.text.x = element_text(angle=90))

Keluaran:

masukkan deskripsi gambar di sini

Pembaruan: OP hanya menginginkan variabel tertentu, jadi kita dapat menggunakan filter():

#Code 3
df %>% mutate(zdate=factor(zdate,levels = unique(zdate),ordered = T)) %>%
  pivot_longer(-zdate) %>%
  filter(name %in% c('mwe1.x','mwe1.y')) %>%
  mutate(name=factor(name,levels = unique(name),ordered = T)) %>%
  ggplot(aes(x=zdate,y=value,group=name,color=name))+
  geom_line()+
  facet_wrap(.~name,ncol = 7,scales = 'free_y')+
  theme(legend.position = 'none',
        axis.text.x = element_text(angle=90))

Keluaran:

masukkan deskripsi gambar di sini

person Duck    schedule 02.10.2020
comment
Terima kasih, saya mencari yang lain seperti yang kedua - tetapi hanya untuk dua kolom - seperti 'mwe1.x' dan 'mwe1.y' - person Nick Olczak; 02.10.2020
comment
@NickOlczak Apakah Anda hanya menginginkan sepasang kolom itu? Saya akan menambahkan pembaruan! - person Duck; 02.10.2020
comment
@NickOlczak Saya telah menambahkan pembaruan, semoga bermanfaat! - person Duck; 02.10.2020
comment
Terima kasih, sepertinya itu yang saya cari. Apa nama data.frame yang diinput untuk dimutasi di #code? - person Nick Olczak; 02.10.2020
comment
@NickOlczak Saya telah menggunakan salinan data yang Anda bagikan. Anda dapat menyalin kode yang saya tambahkan untuk data df. Saya harap ini membantu dan jika Anda tertarik, periksa ini: stackoverflow.com/help/someone-answers - person Duck; 02.10.2020
comment
Terima kasih @Duck. Saya kesulitan mendapatkan 'pivot_longer' untuk menguji kodenya - tetapi sepertinya persis seperti yang saya inginkan, jadi saya memilihnya. - person Nick Olczak; 02.10.2020
comment
@NickOlczak Hebat! Coba instal paket tidyverse dan muat!!! - person Duck; 02.10.2020