Hiển thị các giá trị dữ liệu trên biểu đồ thanh xếp chồng trong ggplot2


112

Tôi muốn hiển thị các giá trị dữ liệu trên biểu đồ thanh xếp chồng trong ggplot2. Đây là mã đã cố gắng của tôi

Year      <- c(rep(c("2006-07", "2007-08", "2008-09", "2009-10"), each = 4))
Category  <- c(rep(c("A", "B", "C", "D"), times = 4))
Frequency <- c(168, 259, 226, 340, 216, 431, 319, 368, 423, 645, 234, 685, 166, 467, 274, 251)
Data      <- data.frame(Year, Category, Frequency)
library(ggplot2)
p <- qplot(Year, Frequency, data = Data, geom = "bar", fill = Category,     theme_set(theme_bw()))
p + geom_text(aes(label = Frequency), size = 3, hjust = 0.5, vjust = 3, position =     "stack") 

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

Tôi muốn hiển thị các giá trị dữ liệu này ở giữa mỗi phần. Bất kỳ trợ giúp nào trong vấn đề này sẽ được đánh giá cao. Cảm ơn



Không thực sự là nơi để tranh luận, nhưng tôi tự hỏi liệu có thể quy định quá mức về điều này không, đặc biệt là đối với những đối tượng phổ thông hơn. Đây là một ví dụ hay - các con số biểu thị tỷ lệ phần trăm có thể nhớ được, điều này loại bỏ nhu cầu về một thang đo mà những người đọc ít hiểu biết về số học có thể ít tiếp cận hơn?
geotheory

Câu trả lời:


193

Từ ggplot 2.2.0nhãn có thể dễ dàng được xếp chồng lên nhau bằng cách sử dụng position = position_stack(vjust = 0.5)trong geom_text.

ggplot(Data, aes(x = Year, y = Frequency, fill = Category, label = Frequency)) +
  geom_bar(stat = "identity") +
  geom_text(size = 3, position = position_stack(vjust = 0.5))

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

Cũng lưu ý rằng " position_stack()position_fill()bây giờ ngăn xếp các giá trị theo thứ tự ngược lại của nhóm, điều này làm cho thứ tự ngăn xếp mặc định khớp với chú giải."


Câu trả lời hợp lệ cho các phiên bản cũ hơn của ggplot:

Đây là một cách tiếp cận, tính toán điểm giữa của các thanh.

library(ggplot2)
library(plyr)

# calculate midpoints of bars (simplified using comment by @DWin)
Data <- ddply(Data, .(Year), 
   transform, pos = cumsum(Frequency) - (0.5 * Frequency)
)

# library(dplyr) ## If using dplyr... 
# Data <- group_by(Data,Year) %>%
#    mutate(pos = cumsum(Frequency) - (0.5 * Frequency))

# plot bars and add text
p <- ggplot(Data, aes(x = Year, y = Frequency)) +
     geom_bar(aes(fill = Category), stat="identity") +
     geom_text(aes(label = Frequency, y = pos), size = 3)

Biểu đồ kết quả


Cảm ơn câu trả lời này. Tôi đã sử dụng nó để làm tương tự bằng cách sử dụng data.tablethay vì plyr, vì vậy một cái gì đó như thế này:Data.dt[,list(Category, Frequency, pos=cumsum(Frequency)-0.5*Frequency), by=Year]
atomules

Có cách nào để thêm tổng tần số quá không?
Pablo Olmos de Aguilera C.

26

Như hadley đã đề cập, có nhiều cách truyền đạt thông điệp của bạn hiệu quả hơn là các nhãn trong biểu đồ thanh xếp chồng lên nhau. Trên thực tế, các biểu đồ xếp chồng lên nhau không hiệu quả lắm vì các thanh (mỗi Danh mục) không chia sẻ một trục nên việc so sánh rất khó.

Hầu như luôn luôn tốt hơn nếu sử dụng hai đồ thị trong những trường hợp này, chia sẻ một trục chung. Trong ví dụ của bạn, tôi giả sử rằng bạn muốn hiển thị tổng số tổng thể và sau đó là tỷ lệ mà mỗi Danh mục đóng góp trong một năm nhất định.

library(grid)
library(gridExtra)
library(plyr)

# create a new column with proportions
prop <- function(x) x/sum(x)
Data <- ddply(Data,"Year",transform,Share=prop(Frequency))

# create the component graphics
totals <- ggplot(Data,aes(Year,Frequency)) + geom_bar(fill="darkseagreen",stat="identity") + 
  xlab("") + labs(title = "Frequency totals in given Year")
proportion <- ggplot(Data, aes(x=Year,y=Share, group=Category, colour=Category)) 
+ geom_line() + scale_y_continuous(label=percent_format())+ theme(legend.position = "bottom") + 
  labs(title = "Proportion of total Frequency accounted by each Category in given Year")

# bring them together
grid.arrange(totals,proportion)

Điều này sẽ cung cấp cho bạn một màn hình 2 bảng như sau:

Đồ họa 2 bảng xếp chồng theo chiều dọc

Nếu bạn muốn thêm giá trị Tần suất, bảng là định dạng tốt nhất.

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.