Saya membuat diagram batang dodged menggunakan ggplot dengan skala x diskrit, sumbu x sekarang disusun dalam urutan abjad, tetapi saya perlu mengatur ulang sehingga diurutkan berdasarkan nilai sumbu y (yaitu, batang tertinggi akan diposisikan di sebelah kiri).
Saya mencoba memesan atau mengurutkan, tetapi menghasilkan mengurutkan sumbu x, tetapi tidak pada batang masing-masing.
Apa yang telah saya lakukan salah?
factor
danreorder
perubahan karakteristik data, meskipun dalamggplot()
panggilan, dan begitu juga lebih dari yang diperlukan untuk masalah yang dihadapi.scale_x_discrete(limits = DT$x[order(-DT$y)])+
Anda dapat menggunakan
reorder
:qplot(reorder(factor(cyl),factor(cyl),length),data=mtcars,geom="bar")
Edit:
Untuk memiliki palang tertinggi di kiri, Anda harus menggunakan sedikit lumpur:
qplot(reorder(factor(cyl),factor(cyl),function(x) length(x)*-1), data=mtcars,geom="bar")
Saya berharap ini juga memiliki ketinggian negatif, tetapi ternyata tidak, jadi berhasil!
sumber
desc(reorder(.))
dapat memberi Anda bilah tertinggi di sebelah kiri.Hadley telah mengembangkan sebuah paket bernama
forcats
. Paket ini membuat tugas jadi lebih mudah. Anda dapat memanfaatkanfct_infreq()
saat Anda ingin mengubah urutan sumbu x dengan frekuensi faktor. Dalam kasusmtcars
contoh di posting ini, Anda ingin menyusun ulang tingkatcyl
berdasarkan frekuensi setiap tingkat. Level yang paling sering muncul tetap di sisi kiri. Yang Anda butuhkan hanyalahfct_infreq()
.library(ggplot2) library(forcats) ggplot(mtcars, aes(fct_infreq(factor(cyl)))) + geom_bar() + labs(x = "cyl")
Jika Anda ingin sebaliknya, Anda dapat menggunakan
fct_rev()
bersamafct_infreq()
.ggplot(mtcars, aes(fct_rev(fct_infreq(factor(cyl))))) + geom_bar() + labs(x = "cyl")
sumber
Saya menyadari ini sudah lama, tetapi mungkin fungsi yang saya buat ini berguna untuk seseorang di luar sana:
order_axis<-function(data, axis, column) { # for interactivity with ggplot2 arguments <- as.list(match.call()) col <- eval(arguments$column, data) ax <- eval(arguments$axis, data) # evaluated factors a<-reorder(with(data, ax), with(data, col)) #new_data df<-cbind.data.frame(data) # define new var within(df, do.call("<-",list(paste0(as.character(arguments$axis),"_o"), a))) }
Sekarang, dengan fungsi ini Anda dapat membuat plot secara interaktif dengan ggplot2, seperti ini:
ggplot(order_axis(df, AXIS_X, COLUMN_Y), aes(x = AXIS_X_o, y = COLUMN_Y)) + geom_bar(stat = "identity")
Seperti yang bisa dilihat,
order_axis
fungsi membuat kerangka data lain dengan kolom baru bernama sama tetapi dengan a_o
di akhir. Kolom baru ini memiliki level dalam urutan menaik, jadi ggplot2 secara otomatis memplot dalam urutan itu.Ini agak terbatas (hanya berfungsi untuk karakter atau faktor dan kombinasi numerik kolom dan dalam urutan menaik) tetapi saya masih merasa sangat berguna untuk membuat plot saat bepergian.
sumber
reorder
secara langsung. Tidakkahggplot(df, aes(x = reorder(AXIS_X, COLUMN_Y), y = COLUMN_Y)) + ...
melakukan hal yang sama, kira-kira secara ringkas, dan tanpa fungsi helper?