Pertanyaan yang sangat baru, tetapi katakan saya memiliki data seperti ini:
test_data <-
data.frame(
var0 = 100 + c(0, cumsum(runif(49, -20, 20))),
var1 = 150 + c(0, cumsum(runif(49, -10, 10))),
date = seq(as.Date("2002-01-01"), by="1 month", length.out=100)
)
Bagaimana saya bisa memplot deret waktu var0
dan var1
grafik yang sama, dengan date
sumbu x, gunakan ggplot2
? Poin bonus jika Anda membuat var0
dan var1
warna yang berbeda, dan dapat menyertakan legenda!
Saya yakin ini sangat sederhana, tetapi saya tidak dapat menemukan contoh di luar sana.
colour=
sebagai nama variabel.colour='var_names'
seperti yang ditentukan oleh hadley berfungsi dengan baik. tetapi @DaveX - akan lebih spesifik jika seseorang ingin memilih warna tertentu daripada warna yang dipilih secara otomatis oleh fungsi.Pendekatan umum adalah untuk mengkonversi data ke format panjang (menggunakan
melt()
dari paketreshape
ataureshape2
) ataugather()
/pivot_longer()
daritidyr
paket:Lihat juga pertanyaan ini tentang membentuk kembali data dari lebar ke panjang.
sumber
gather()
fungsitidyr
paket untuk melelehkan data:gather(test_data, variable, value, -date)
Anda membutuhkan data dalam format "tinggi" alih-alih "lebar" untuk ggplot2. "lebar" berarti memiliki pengamatan per baris dengan setiap variabel sebagai kolom yang berbeda (seperti yang Anda miliki sekarang). Anda perlu mengonversinya menjadi format "tinggi" di mana Anda memiliki kolom yang memberi tahu Anda nama variabel dan kolom lain yang memberi tahu Anda nilai variabel. Proses perpindahan dari lebar ke tinggi biasanya disebut "melting". Anda dapat menggunakan
tidyr::gather
untuk melelehkan frame data Anda:Hanya untuk memperjelas
data
bahwaggplot
yang dikonsumsi setelah memipisnya melaluigather
tampak seperti ini:sumber
Menggunakan data Anda:
Saya membuat versi bertumpuk yang
ggplot()
ingin saya gunakan:Dalam hal ini memproduksi
stacked
cukup mudah karena kami hanya perlu melakukan beberapa manipulasi, tetapireshape()
danreshape
danreshape2
mungkin berguna jika Anda memiliki set data nyata yang lebih kompleks untuk dimanipulasi.Setelah data berada dalam formulir yang ditumpuk ini, itu hanya membutuhkan
ggplot()
panggilan sederhana untuk menghasilkan plot yang Anda inginkan dengan semua tambahan (satu alasan mengapa paket merencanakan tingkat yang lebih tinggi sukalattice
danggplot2
sangat berguna):Saya akan menyerahkan kepada Anda untuk merapikan label sumbu, judul legenda dll.
HTH
sumber
rep()
, jadi kami benar-benar hanya mendapatkan 3 colsstacked
. Saya akan mengedit kode untuk membuat indentasi lebih jelas.melt()
diambil dengan baik, dan saya perhatikan bahwa paket membentuk kembali [2] akan berguna di sini. Saya tidak begitu terbiasa dengan membentuk kembali dan untuk manipulasi sederhana melakukannya dengan tangan lebih kompleks daripada panggilanmelt()
, itu kurang usaha karena saya tidak perlu membaca cara menggunakanmelt()
. Dan rcs menyelinap masuk dengan jawabannya sementara saya menghasilkan milik saya; ketika saya memulai balasan, tidak ada jawaban. lebih dari satu cara menguliti kucing - seperti yang mereka katakan! ;-)Saya juga baru mengenal R tetapi mencoba memahami cara kerja ggplot, saya pikir saya punya cara lain untuk melakukannya. Saya hanya berbagi mungkin bukan sebagai solusi sempurna yang lengkap tetapi untuk menambahkan beberapa sudut pandang yang berbeda.
Saya tahu ggplot dibuat untuk bekerja dengan kerangka data yang lebih baik, tetapi mungkin juga bermanfaat untuk mengetahui bahwa Anda dapat langsung memplot dua vektor tanpa menggunakan kerangka data.
Memuat data. Panjang vektor tanggal asli adalah 100 sedangkan var0 dan var1 memiliki panjang 50 jadi saya hanya memplot data yang tersedia (50 tanggal pertama).
Merencanakan
Namun saya tidak dapat menambahkan legenda yang benar menggunakan format ini. Adakah yang tahu bagaimana caranya?
sumber
ggplot() + geom_line(aes(x=date,y=var0, group=1, colour = 'red')) + geom_line(aes(x=date,y=var1, group = 2, colour = 'blue')) + ylab('Values')+xlab('date')