Định vị geom_text trên thanh dodged barplot


96

Tôi đã cố gắng làm cho tiêu đề tự giải thích, nhưng đây là - dữ liệu trước:

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")))

Và tôi muốn tạo một barplot có mái che, thực hiện coord_flipvà đặt một số nhãn văn bản bên trong các thanh:

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()

bạn có thể xem đầu ra ở đây .

nhập mô tả hình ảnh ở đây

Tôi nghĩ rằng tôi đang yêu cầu một cái gì đó tầm thường. Tôi muốn các nhãn văn bản "theo sau" các thanh xếp chồng lên nhau. Các nhãn được đặt chính xác trên trục y, nhưng làm thế nào để định vị chúng chính xác trên trục x?


Yepp ... Tôi nên đăng cái này trên danh sách gửi thư ggplot2. Tôi không muốn đăng chéo, vì vậy tôi sẽ đội mũ kiên nhẫn của mình và chờ @hadley nghĩ ra điều gì đó! =)
aL3xa

Tôi đã sai. Và tôi cần phải làm quen nhiều hơn với gói ggplot.
Joris Meys

Câu trả lời:


154

Đây có phải là những gì bạn muốn?

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()

Phím đang sử dụng position = position_dodge(width = 1)thay vì position = "dodge"chỉ là một phím tắt không có bất kỳ tham số nào.

nhập mô tả hình ảnh ở đây


Trong ggplot2_2.0.0bạn tìm thấy một số ví dụ trong ?geom_textvề cách vị trí geom_texttrên thanh lẩn tránh hoặc xếp chồng lên nhau (các đoạn mã được đặt tên " # Aligning labels and bars"). Q & A đối số chiều rộng trong position_dodge là gì? Cung cấp một mô tả kỹ hơn về chủ đề này.


1
Chính xác những gì tôi muốn! Tôi nợ bạn một ly bia cho cái này! =)
aL3xa

2
Vì vậy, không có cách nào để tự động hóa việc này? Người ta phải luôn chỉ định chiều rộng?
vashts85

12
Điều này chỉ hoạt động đối với tôi sau khi tôi thêm fill = ustanovavào geom_textlớp, điều này có ý nghĩa đặc biệt khi bạn có nhiều thanh ngang (có thể chỉ cần thiết cho 3+ thanh trên mỗi x) và số lượng ngắt phải giống nhau đối với văn bản cũng như đối với các thanh .
Alan

3
Đối với các khía cạnh và né tránh, đây là một câu trả lời hữu ích: stackoverflow.com/a/26661791/1000343
Tyler Rinker

@Alan trong số tất cả các tìm kiếm tôi đã thực hiện trên stackoverflow, câu trả lời của bạn là câu trả lời duy nhất giải quyết được vấn đề của tôi.
Ga13
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.