Saya perlu memplot grafik batang yang menunjukkan jumlah dan grafik garis yang menunjukkan nilai semua dalam satu grafik, saya bisa melakukan keduanya secara terpisah, tetapi ketika saya menyatukannya, skala saya dari lapisan pertama (yaitu geom_bar
) tumpang tindih dengan yang kedua lapisan (yaitu geom_line
).
Bisakah saya memindahkan poros geom_line
ke kanan?
ggplot2
implementasi asli di dalamscale_y_*
, yang saat ini dipanggilsec.axis
.Jawaban:
Terkadang klien menginginkan dua skala. Memberi mereka pidato "cacat" seringkali tidak ada gunanya. Tapi saya suka desakan ggplot2 melakukan hal-hal dengan cara yang benar. Saya yakin bahwa ggplot sebenarnya mendidik pengguna rata-rata tentang teknik visualisasi yang tepat.
Mungkin Anda bisa menggunakan faceting dan skala gratis untuk membandingkan dua seri data? - mis. lihat di sini: https://github.com/hadley/ggplot2/wiki/Align-two-plots-on-a-page
sumber
Itu tidak mungkin di ggplot2 karena saya percaya plot dengan skala y terpisah (bukan skala y yang merupakan transformasi satu sama lain) secara mendasar cacat. Beberapa masalah:
Yang tidak dapat dibalik: diberi titik pada ruang plot, Anda tidak bisa memetakannya secara unik kembali ke titik di ruang data.
Mereka relatif sulit dibaca dengan benar dibandingkan dengan opsi lain. Lihat Studi pada Grafik Data Skala Ganda oleh Petra Isenberg, Anastasia Bezerianos, Pierre Dragicevic, dan Jean-Daniel Fekete untuk detailnya.
Mereka mudah dimanipulasi untuk menyesatkan: tidak ada cara unik untuk menentukan skala relatif sumbu, membiarkannya terbuka untuk manipulasi. Dua contoh dari blog Junkcharts: satu , dua
Mereka arbitrer: mengapa hanya memiliki 2 skala, bukan 3, 4 atau sepuluh?
Anda juga mungkin ingin membaca diskusi panjang Stephen Few tentang topik Sumbu Berkedip Ganda dalam Grafik Apakah Mereka Pernah Solusi Terbaik? .
sumber
Dimulai dengan ggplot2 2.2.0 Anda dapat menambahkan sumbu sekunder seperti ini (diambil dari pengumuman ggplot2 2.2.0 ):
sumber
Mengambil jawaban di atas dan beberapa penyesuaian (dan untuk apa pun nilainya), berikut adalah cara untuk mencapai dua skala melalui
sec_axis
:Asumsikan kumpulan data sederhana (dan hanya fiksi)
dt
: selama lima hari, ia melacak jumlah interupsi produktivitas VS:(rentang kedua kolom berbeda sekitar faktor 5).
Kode berikut akan menggambar kedua seri yang mereka gunakan pada seluruh sumbu y:
Inilah hasilnya (kode di atas + beberapa penyesuaian warna):
Intinya (selain menggunakan
sec_axis
ketika menentukan y_scale adalah untuk mengalikan setiap nilai seri data ke-2 dengan 5 saat menentukan seri. Untuk mendapatkan label yang tepat dalam definisi sec_axis, maka perlu dibagi dengan 5 (dan format). bagian penting dalam kode di atas adalah benar-benar*5
di geom_line dan~./5
di sec_axis (rumus yang membagi nilai saat ini.
dengan 5).Sebagai perbandingan (saya tidak ingin menilai pendekatan di sini), ini adalah bagaimana dua grafik di atas satu sama lain terlihat seperti:
Anda dapat menilai sendiri mana yang lebih baik mengangkut pesan ("Jangan ganggu orang di tempat kerja!"). Kira itu cara yang adil untuk memutuskan.
Kode lengkap untuk kedua gambar (tidak lebih dari yang di atas, cukup lengkap dan siap dijalankan) ada di sini: https://gist.github.com/sebastianrothbucher/de847063f32fdff02c83b75f59c36a7d penjelasan lebih rinci di sini: https: // sebastianrothbucher. github.io/datascience/r/visualization/ggplot/2018/03/24/two-scales-ggplot-r.html
sumber
Ada kasus penggunaan umum sumbu duel, misalnya klimatograf yang menunjukkan suhu dan curah hujan bulanan. Ini adalah solusi sederhana, yang digeneralisasi dari solusi Megatron dengan memungkinkan Anda untuk mengatur batas bawah variabel menjadi sesuatu yang lebih dari nol:
Contoh data:
Atur dua nilai berikut ke nilai yang mendekati batas data (Anda dapat bermain-main dengan ini untuk menyesuaikan posisi grafik; sumbu akan tetap benar):
Berikut ini membuat perhitungan yang diperlukan berdasarkan batas-batas ini, dan membuat plot itu sendiri:
Jika Anda ingin memastikan bahwa garis merah sesuai dengan sumbu y kanan, Anda dapat menambahkan
theme
kalimat ke kode:yang mewarnai sumbu kanan:
sumber
ylim.prim
danylim.sec
.Anda dapat membuat faktor penskalaan yang diterapkan pada geom kedua dan sumbu y kanan. Ini berasal dari solusi Sebastian.
Catatan: menggunakan
ggplot2
v3.0.0sumber
Tulang punggung teknis untuk solusi tantangan ini telah disediakan oleh Kohske sekitar 3 tahun yang lalu [ KOHSKE ]. Topik dan teknis di sekitar solusinya telah dibahas pada beberapa contoh di sini di Stackoverflow [ID: 18989001, 29235405, 21026598]. Jadi saya hanya akan memberikan variasi tertentu dan beberapa langkah penjelasan, menggunakan solusi di atas.
Mari kita asumsikan kita memang memiliki beberapa data y1 di grup G1 yang mana beberapa data y2 dalam grup G2 dalam beberapa cara, misalnya rentang / skala yang diubah atau dengan beberapa noise yang ditambahkan. Jadi kita ingin memplot data bersama pada satu plot dengan skala y1 di sebelah kiri dan y2 di sebelah kanan.
Jika kita sekarang memplot data kita bersama dengan sesuatu seperti
itu tidak selaras dengan baik karena skala yang lebih kecil y1 obviosuly akan runtuh oleh skala yang lebih besar y2 .
Trik di sini untuk memenuhi tantangan adalah secara teknis memplot kedua set data terhadap skala pertama y1 tetapi melaporkan yang kedua terhadap sumbu sekunder dengan label yang menunjukkan skala asli y2 .
Jadi kami membangun fungsi pembantu pertama CalcFudgeAxis yang menghitung dan mengumpulkan fitur dari sumbu baru yang akan ditampilkan. Fungsi ini dapat diubah untuk menyukai ayone (yang ini hanya memetakan y2 ke kisaran y1 ).
apa yang menghasilkan beberapa:
Sekarang saya membungkus Kohske solusi dalam fungsi helper kedua PlotWithFudgeAxis (di mana kita membuang objek ggplot dan objek helper dari sumbu baru):
Sekarang semua dapat disatukan: Kode di bawah ini menunjukkan, bagaimana solusi yang diusulkan dapat digunakan dalam lingkungan sehari-hari . Panggilan plot sekarang tidak memplot data asli y2 lagi tetapi versi kloning yf (diadakan di dalam objek pembantu yang dihitung sebelumnya FudgeAxis ), yang berjalan dari skala y1 . The ggplot asli objet kemudian dimanipulasi dengan Kohske ini fungsi pembantu PlotWithFudgeAxis untuk menambahkan sumbu kedua melestarikan sisik y2 . Itu plot juga plot dimanipulasi.
Sekarang ini plot sesuai keinginan dengan dua sumbu, y1 di sebelah kiri dan y2 di sebelah kanan
Solusi di atas adalah, untuk menjelaskannya, peretasan yang terbatas dan terbatas. Saat diputar dengan kernel ggplot, ia akan memberikan beberapa peringatan bahwa kami bertukar skala pasca-fakta, dll. Itu harus ditangani dengan hati-hati dan dapat menghasilkan beberapa perilaku yang tidak diinginkan dalam pengaturan lain. Juga orang mungkin perlu bermain-main dengan fungsi pembantu untuk mendapatkan tata letak yang diinginkan. Penempatan legenda adalah masalah seperti itu (itu akan ditempatkan di antara panel dan sumbu baru; inilah mengapa saya menjatuhkannya). Penskalaan / pelurusan sumbu 2 juga sedikit menantang: Kode di atas berfungsi dengan baik ketika kedua skala mengandung "0", jika tidak satu sumbu akan bergeser. Jadi pasti dengan beberapa peluang untuk meningkatkan ...
Dalam hal ingin menyimpan gambar, seseorang harus membungkus panggilan ke dalam perangkat buka / tutup:
sumber
Artikel berikut membantu saya menggabungkan dua plot yang dihasilkan oleh ggplot2 pada satu baris:
Banyak grafik pada satu halaman (ggplot2) oleh Cookbook for R
Dan inilah kode yang terlihat dalam kasus ini:
sumber
multiplot
stackoverflow.com/a/51220506Bagi saya bagian yang sulit adalah mencari tahu fungsi transformasi antara dua sumbu. Saya menggunakan myCurveFit untuk itu.
Menemukan fungsi transformasi
fungsi transformasi:
f(y1) = 0.025*x + 2.75
fungsi transformasi:
f(y1) = 40*x - 110
Merencanakan
Perhatikan bagaimana fungsi transformasi digunakan dalam
ggplot
panggilan untuk mengubah data "on-the-fly"stat_summary
Panggilan pertama adalah salah satu yang menetapkan basis untuk sumbu y pertama.stat_summary
Panggilan kedua dipanggil untuk mengubah data. Ingat bahwa semua data akan dijadikan sebagai basis sumbu y pertama. Sehingga data perlu dinormalisasi untuk sumbu y pertama. Untuk melakukan itu saya menggunakan fungsi transformasi pada data:y=packetOkSinr*40 - 110
Sekarang untuk mengubah sumbu kedua saya menggunakan fungsi yang berlawanan dalam
scale_y_continuous
panggilan:sec.axis=sec_axis(~.*0.025+2.75, name="y_second")
.sumber
coef(lm(c(-70, -110) ~ c(1,0)))
dancoef(lm(c(1,0) ~ c(-70, -110)))
. Anda dapat mendefinisikan fungsi pembantu sepertiequationise <- function(range = c(-70, -110), target = c(1,0)){ c = coef(lm(target ~ range)) as.formula(substitute(~ a*. + b, list(a=c[[2]], b=c[[1]]))) }
Kita pasti bisa membangun plot dengan dual Y-axises menggunakan basis R funtion
plot
.sumber
Anda bisa menggunakan
facet_wrap(~ variable, ncol= )
variabel untuk membuat perbandingan baru. Itu tidak pada poros yang sama, tetapi serupa.sumber
Saya mengakui dan setuju dengan hadley (dan lainnya), bahwa skala y yang terpisah "secara mendasar cacat". Karena itu - saya sering berharap
ggplot2
memiliki fitur - terutama, ketika data dalam format lebar dan saya ingin segera memvisualisasikan atau memeriksa data (yaitu untuk penggunaan pribadi).Sementara
tidyverse
perpustakaan membuatnya cukup mudah untuk mengkonversi data ke format panjang (sehinggafacet_grid()
akan berfungsi), prosesnya masih tidak sepele, seperti yang terlihat di bawah ini:sumber
sec_axis
.Jawaban oleh Hadley memberikan referensi yang menarik untuk laporan Stephen Few's Dual-Scaled Axes dalam Grafik Apakah Mereka Pernah Solusi Terbaik? .
Saya tidak tahu apa arti OP dengan "jumlah" dan "nilai" tetapi pencarian cepat memberi saya Hitungan dan Tarif , jadi saya mendapatkan beberapa data tentang Kecelakaan di Gunung Amerika Utara 1 :
Dan kemudian saya mencoba untuk membuat grafik seperti yang disarankan pada halaman 7 laporan tersebut (dan mengikuti permintaan OP untuk membuat grafik penghitungan sebagai grafik batang dan tarif sebagai grafik garis):
Dan inilah hasilnya:
Tetapi saya tidak begitu menyukainya dan saya tidak dapat dengan mudah menempatkan legenda di atasnya ...
1 WILLIAMSON, Jed, et al. Kecelakaan di Gunung Amerika Utara 2005. The Mountaineers Books, 2005.
sumber
Tampaknya ini tampaknya menjadi pertanyaan sederhana tetapi mengejutkan sekitar 2 pertanyaan mendasar. A) Bagaimana menangani data multi-skalar sambil menyajikan dalam grafik komparatif, dan kedua, B) apakah ini dapat dilakukan tanpa beberapa praktek aturan praktis pemrograman R seperti i) melting data, ii) faceting, iii) menambahkan lapisan lain ke yang sudah ada. Solusi yang diberikan di bawah ini memenuhi kedua kondisi di atas karena menangani data tanpa harus skala ulang dan kedua, teknik yang disebutkan tidak digunakan.
Inilah hasilnya,
Bagi yang tertarik mengetahui lebih banyak tentang metode ini, silakan ikuti tautan di bawah ini. Cara memplot grafik sumbu 2- y dengan palang berdampingan tanpa menskala ulang data
sumber
Saya menemukan jawaban ini paling membantu saya, tetapi menemukan bahwa ada beberapa kasus tepi yang tampaknya tidak ditangani dengan benar, dalam kasus negatif tertentu, dan juga kasus di mana batas saya memiliki jarak 0 (yang dapat terjadi jika kita meraih batas kami dari maks / mnt data). Pengujian tampaknya menunjukkan bahwa ini berfungsi secara konsisten
Saya menggunakan kode berikut. Di sini saya berasumsi kita memiliki [x1, x2] yang ingin kita ubah menjadi [y1, y2]. Cara saya menangani ini adalah mentransformasikan [x1, x2] menjadi [0,1] (transformaton yang cukup sederhana), kemudian [0,1] menjadi [y1, y2].
Bagian-bagian penting di sini adalah kita mengubah sumbu y sekunder dengan
~((.-ylim.prim[1]) *b + ylim.sec[1])
dan kemudian menerapkan kebalikannya ke nilai aktualy = ylim.prim[1]+(Temp-ylim.sec[1])/b)
. Kita juga harus memastikan itulimits = ylim.prim
.sumber