Saya mencoba membuat grafik batang di mana batang terbesar akan terdekat dengan sumbu y dan batang terpendek akan menjadi yang terjauh. Jadi ini seperti Tabel yang saya miliki
Name Position
1 James Goalkeeper
2 Frank Goalkeeper
3 Jean Defense
4 Steve Defense
5 John Defense
6 Tim Striker
Jadi saya mencoba membuat grafik batang yang akan menunjukkan jumlah pemain sesuai dengan posisi
p <- ggplot(theTable, aes(x = Position)) + geom_bar(binwidth = 1)
tetapi grafik menunjukkan bar kiper pertama kemudian pertahanan, dan akhirnya striker. Saya ingin grafik dipesan sehingga bar pertahanan paling dekat dengan sumbu y, kiper, dan akhirnya striker. Terima kasih
ggplot2
, bukan OPJawaban:
Kuncinya dengan pemesanan adalah mengatur level faktor dalam urutan yang Anda inginkan. Faktor yang dipesan tidak diperlukan; informasi tambahan dalam faktor yang dipesan tidak diperlukan dan jika data ini digunakan dalam model statistik apa pun, parametrisasi yang salah dapat terjadi - perbedaan polinomial tidak sesuai untuk data nominal seperti ini.
Dalam pengertian yang paling umum, kita hanya perlu mengatur level faktor sesuai urutan yang diinginkan. Jika dibiarkan tidak ditentukan, level faktor akan diurutkan berdasarkan abjad. Anda juga dapat menentukan urutan level dalam panggilan ke faktor seperti di atas, dan cara lain juga dimungkinkan.
sumber
within
, tidak perlu digunakantheTable$Position
, dan Anda bisa melakukannyasort(-table(...))
untuk mengurangi pesanan.-
Anda gunakan karena jauh lebih mudah untuk mendapatkan maksud daridecreasing = TRUE
daripada memperhatikan-
di seluruh sisa kode.levels(theTable$Position) <- c(...)
mengarah ke perilaku yang tidak diinginkan di mana entri aktual dari frame data akan disusun ulang, dan bukan hanya tingkat faktor. Lihat pertanyaan ini . Mungkin Anda harus memodifikasi atau menghapus garis-garis itu?levels<-
. Saya akan mengedit bagian itu, setidaknya untuk sementara.levels<-()
hari ini. Ini adalah sesuatu dari 8 tahun yang lalu dan saya tidak dapat mengingat apakah ada yang berbeda saat itu atau apakah saya hanya salah, tetapi bagaimanapun juga, itu salah dan harus dihapus! Terima kasih!@GavinSimpson:
reorder
adalah solusi yang kuat dan efektif untuk ini:sumber
ggplot(theTable,aes(x=reorder(Position,Position,length))+geom_bar()
Menggunakan
scale_x_discrete (limits = ...)
untuk menentukan urutan bilah.sumber
Saya pikir solusi yang sudah disediakan terlalu bertele-tele. Cara yang lebih ringkas untuk melakukan barplot frekuensi diurutkan dengan ggplot adalah
Ini mirip dengan apa yang disarankan Alex Brown, tetapi sedikit lebih pendek dan berfungsi tanpa definisi fungsi apa pun.
Memperbarui
Saya pikir solusi lama saya bagus pada saat itu, tetapi saat ini saya lebih suka menggunakan
forcats::fct_infreq
yang menyortir tingkat faktor berdasarkan frekuensi:sumber
Seperti
reorder()
pada jawaban Alex Brown, kita juga bisa menggunakanforcats::fct_reorder()
. Ini pada dasarnya akan mengurutkan faktor-faktor yang ditentukan dalam argumen 1, sesuai dengan nilai-nilai dalam argumen 2 setelah menerapkan fungsi yang ditentukan (default = median, yang kita gunakan di sini hanya memiliki satu nilai per tingkat faktor).Sangat memalukan bahwa dalam pertanyaan OP, pesanan yang diperlukan juga alfabet karena itu adalah urutan penyortiran default saat Anda membuat faktor, sehingga akan menyembunyikan apa yang sebenarnya dilakukan fungsi ini. Untuk membuatnya lebih jelas, saya akan mengganti "Kiper" dengan "Zoalkeeper".
sumber
Penataan ulang faktor berdasarkan dplyr sederhana dapat memecahkan masalah ini:
sumber
Anda hanya perlu menentukan
Position
kolom untuk menjadi faktor yang dipesan di mana level dipesan berdasarkan jumlah mereka:(Perhatikan bahwa
table(Position)
menghasilkan penghitungan frekuensiPosition
kolom.)Maka
ggplot
fungsi Anda akan menampilkan bar dalam mengurangi urutan hitungan. Saya tidak tahu apakah ada opsigeom_bar
untuk melakukan ini tanpa harus secara eksplisit membuat faktor yang dipesan.sumber
reorder()
dari perpustakaan statistik menyelesaikan tugas yang sama.reorder()
dalam kasus ini? Faktor yang membutuhkan penataan ulang perlu ditata ulang oleh beberapa fungsi itu sendiri dan saya berjuang untuk melihat cara yang baik untuk melakukan itu.with(theTable, reorder(Position, as.character(Position), function(x) sum(duplicated(x))))
adalah satu cara, dan yang lainwith(theTable, reorder(Position, as.character(Position), function(x) as.numeric(table(x))))
tetapi ini sama berbelit-belit ...sort
daripadaorder
reorder
mahir melakukannya. Saya setuju untuk pertanyaan ini bahwa diperlukan sesuatu yang lebih terlibat. Maaf bila membingungkan.Selain forcats :: fct_infreq, disebutkan oleh @HolgerBrandl, ada forcats :: fct_rev, yang membalik urutan faktor.
sumber
Saya setuju dengan zach bahwa menghitung dalam dplyr adalah solusi terbaik. Saya menemukan ini sebagai versi terpendek:
Ini juga akan secara signifikan lebih cepat daripada menata ulang tingkat faktor sebelumnya karena penghitungan dilakukan dalam dplyr bukan di ggplot atau menggunakan
table
.sumber
Jika kolom bagan berasal dari variabel numerik seperti dalam kerangka data di bawah, Anda dapat menggunakan solusi yang lebih sederhana:
Tanda minus sebelum variabel sortir (-Qty) mengontrol arah sortir (naik / turun)
Berikut beberapa data untuk pengujian:
Ketika saya menemukan utas ini, itulah jawaban yang saya cari. Semoga bermanfaat bagi orang lain.
sumber
Alternatif lain menggunakan pemesanan ulang untuk memesan tingkat faktor. Dalam urutan naik (n) atau menurun (-n) berdasarkan hitungan. Sangat mirip dengan yang menggunakan
fct_reorder
dariforcats
paket:Urutan menurun
Urutan naik
Bingkai data:
sumber
Karena kita hanya melihat distribusi variabel tunggal ("Posisi") yang bertentangan dengan melihat hubungan antara dua variabel , maka mungkin histogram akan menjadi grafik yang lebih tepat. ggplot memiliki geom_histogram () yang memudahkan:
Menggunakan geom_histogram ():
Saya pikir geom_histogram ( ) sedikit aneh karena memperlakukan data kontinu dan berbeda.
Untuk data kontinu , Anda bisa menggunakan geom_histogram () tanpa parameter. Misalnya, jika kita menambahkan vektor "Skor" numerik ...
dan gunakan geom_histogram () pada variabel "Skor" ...
Untuk data diskrit seperti "Posisi", kita harus menentukan statistik terhitung yang dihitung oleh estetika untuk memberikan nilai y untuk ketinggian batang menggunakan
stat = "count"
:Catatan: Aneh dan membingungkan Anda juga dapat menggunakan
stat = "count"
untuk data kontinu dan saya pikir ini memberikan grafik yang lebih estetis.Suntingan : Jawaban yang diperluas untuk menanggapi saran DebanjanB yang bermanfaat.
sumber
Saya merasa sangat menjengkelkan yang
ggplot2
tidak menawarkan solusi 'otomatis' untuk ini. Itu sebabnya saya membuatbar_chart()
fungsi diggcharts
.Secara default
bar_chart()
menyortir bilah dan menampilkan plot horizontal. Untuk mengubah set ituhorizontal = FALSE
. Selain itu,bar_chart()
menghilangkan 'celah' yang tidak sedap dipandang antara batang dan sumbu.sumber