Posisikan geom_text pada barplot yang dihindari

99

Saya mencoba membuat judulnya cukup jelas, tetapi ini dia - data pertama:

dtf <- structure(list(variable = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 
4L, 4L, 5L, 5L), .Label = c("vma", "vla", "ia", "fma", "fla"), class = "factor"), 
    ustanova = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L), .Label = c("srednja škola", "fakultet"), class = "factor"), 
    `(all)` = c(42.9542857142857, 38.7803203661327, 37.8996138996139, 
    33.7672811059908, 29.591439688716, 26.1890660592255, 27.9557692307692, 
    23.9426605504587, 33.2200772200772, 26.9493087557604)), .Names = c("variable", 
"ustanova", "(all)"), row.names = c(NA, 10L), class = c("cast_df", 
"data.frame"), idvars = c("variable", "ustanova"), rdimnames = list(
    structure(list(variable = structure(c(1L, 1L, 2L, 2L, 3L, 
    3L, 4L, 4L, 5L, 5L), .Label = c("vma", "vla", "ia", "fma", 
    "fla"), class = "factor"), ustanova = structure(c(1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("srednja škola", 
    "fakultet"), class = "factor")), .Names = c("variable", "ustanova"
    ), row.names = c("vma_srednja škola", "vma_fakultet", "vla_srednja škola", 
    "vla_fakultet", "ia_srednja škola", "ia_fakultet", "fma_srednja škola", 
    "fma_fakultet", "fla_srednja škola", "fla_fakultet"), class = "data.frame"), 
    structure(list(value = structure(1L, .Label = "(all)", class = "factor")), .Names = "value", row.names = "(all)", class = "data.frame")))

Dan saya ingin membuat barplot yang mengelak, melakukan coord_flipdan meletakkan beberapa label teks di dalam bar:

ggplot(bar) + geom_bar(aes(variable, `(all)`, fill = ustanova), position = "dodge") +
 geom_text(aes(variable, `(all)`, label = sprintf("%2.1f", `(all)`)), position = "dodge") +
 coord_flip()

Anda dapat melihat hasilnya di sini .

masukkan deskripsi gambar di sini

Saya rasa saya meminta sesuatu yang sepele. Saya ingin label teks "mengikuti" tumpukan batang. Label ditempatkan dengan benar pada sumbu y, tetapi bagaimana memposisikannya dengan benar pada sumbu x?

aL3xa
sumber
Yap ... Seharusnya saya memposting yang ini di milis ggplot2. Saya tidak ingin mengirim silang, jadi saya akan memakai topi kesabaran dan menunggu @hadley memberikan sesuatu! =)
aL3xa
Saya salah. Dan tampaknya saya perlu lebih mengenal paket ggplot.
Joris Meys

Jawaban:

158

Apa ini yang kau inginkan?

ggplot(bar) + 
  geom_bar(aes(variable, `(all)`, fill = ustanova), position = "dodge") +
  geom_text(aes(variable, `(all)`, label = sprintf("%2.1f", `(all)`)), 
            position = position_dodge(width = 1)) + 
  coord_flip()

Kuncinya adalah menggunakan position = position_dodge(width = 1)bukan position = "dodge", yang hanya jalan pintas tanpa parameter apapun.

masukkan deskripsi gambar di sini


Dalam ggplot2_2.0.0Anda menemukan beberapa contoh di ?geom_textatas bagaimana posisi geom_textdi bar mengelak atau ditumpuk (kode potongan bernama " # Aligning labels and bars"). The Q & A Apa argumen lebar di position_dodge? Memberikan gambaran lebih menyeluruh dari topik.

kohske
sumber
1
Persis seperti yang kuinginkan! Aku berhutang budi padamu untuk yang ini! =)
aL3xa
2
Jadi, apakah tidak ada cara untuk mengotomatiskan ini? Seseorang harus selalu menentukan lebarnya?
vashts85
12
Ini hanya berfungsi untuk saya setelah saya menambahkan fill = ustanovadi geom_textlapisan yang masuk akal terutama ketika Anda memiliki banyak batang horizontal (mungkin hanya diperlukan untuk 3+ batang per x) dan jumlah jeda harus sama untuk teks seperti untuk batang .
Alan
3
Untuk facetted dan dodged ini adalah jawaban yang berguna: stackoverflow.com/a/26661791/1000343
Tyler Rinker
@Alan di antara semua pencarian yang saya lakukan di stackoverflow, jawaban Anda adalah satu-satunya yang memecahkan masalah saya.
DR15